404

[ Avaa Bypassed ]




Upload:

Command:

botdev@3.14.150.131: ~ $
<?php

/*
 * This file is part of the Monolog package.
 *
 * (c) Jordi Boggiano <j.boggiano@seld.be>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Monolog\Handler;

use Monolog\Logger;

/**
 * Simple handler wrapper that deduplicates log records across multiple requests
 *
 * It also includes the BufferHandler functionality and will buffer
 * all messages until the end of the request or flush() is called.
 *
 * This works by storing all log records' messages above $deduplicationLevel
 * to the file specified by $deduplicationStore. When further logs come in at the end of the
 * request (or when flush() is called), all those above $deduplicationLevel are checked
 * against the existing stored logs. If they match and the timestamps in the stored log is
 * not older than $time seconds, the new log record is discarded. If no log record is new, the
 * whole data set is discarded.
 *
 * This is mainly useful in combination with Mail handlers or things like Slack or HipChat handlers
 * that send messages to people, to avoid spamming with the same message over and over in case of
 * a major component failure like a database server being down which makes all requests fail in the
 * same way.
 *
 * @author Jordi Boggiano <j.boggiano@seld.be>
 */
class DeduplicationHandler extends BufferHandler
{
    /**
     * @var string
     */
    protected $deduplicationStore;

    /**
     * @var int
     */
    protected $deduplicationLevel;

    /**
     * @var int
     */
    protected $time;

    /**
     * @var bool
     */
    private $gc = false;

    /**
     * @param HandlerInterface $handler            Handler.
     * @param string           $deduplicationStore The file/path where the deduplication log should be kept
     * @param int              $deduplicationLevel The minimum logging level for log records to be looked at for deduplication purposes
     * @param int              $time               The period (in seconds) during which duplicate entries should be suppressed after a given log is sent through
     * @param bool             $bubble             Whether the messages that are handled can bubble up the stack or not
     */
    public function __construct(HandlerInterface $handler, $deduplicationStore = null, $deduplicationLevel = Logger::ERROR, $time = 60, $bubble = true)
    {
        parent::__construct($handler, 0, Logger::DEBUG, $bubble, false);

        $this->deduplicationStore = $deduplicationStore === null ? sys_get_temp_dir() . '/monolog-dedup-' . substr(md5(__FILE__), 0, 20) .'.log' : $deduplicationStore;
        $this->deduplicationLevel = Logger::toMonologLevel($deduplicationLevel);
        $this->time = $time;
    }

    public function flush()
    {
        if ($this->bufferSize === 0) {
            return;
        }

        $passthru = null;

        foreach ($this->buffer as $record) {
            if ($record['level'] >= $this->deduplicationLevel) {

                $passthru = $passthru || !$this->isDuplicate($record);
                if ($passthru) {
                    $this->appendRecord($record);
                }
            }
        }

        // default of null is valid as well as if no record matches duplicationLevel we just pass through
        if ($passthru === true || $passthru === null) {
            $this->handler->handleBatch($this->buffer);
        }

        $this->clear();

        if ($this->gc) {
            $this->collectLogs();
        }
    }

    private function isDuplicate(array $record)
    {
        if (!file_exists($this->deduplicationStore)) {
            return false;
        }

        $store = file($this->deduplicationStore, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
        if (!is_array($store)) {
            return false;
        }

        $yesterday = time() - 86400;
        $timestampValidity = $record['datetime']->getTimestamp() - $this->time;
        $expectedMessage = preg_replace('{[\r\n].*}', '', $record['message']);

        for ($i = count($store) - 1; $i >= 0; $i--) {
            list($timestamp, $level, $message) = explode(':', $store[$i], 3);

            if ($level === $record['level_name'] && $message === $expectedMessage && $timestamp > $timestampValidity) {
                return true;
            }

            if ($timestamp < $yesterday) {
                $this->gc = true;
            }
        }

        return false;
    }

    private function collectLogs()
    {
        if (!file_exists($this->deduplicationStore)) {
            return false;
        }

        $handle = fopen($this->deduplicationStore, 'rw+');
        flock($handle, LOCK_EX);
        $validLogs = array();

        $timestampValidity = time() - $this->time;

        while (!feof($handle)) {
            $log = fgets($handle);
            if (substr($log, 0, 10) >= $timestampValidity) {
                $validLogs[] = $log;
            }
        }

        ftruncate($handle, 0);
        rewind($handle);
        foreach ($validLogs as $log) {
            fwrite($handle, $log);
        }

        flock($handle, LOCK_UN);
        fclose($handle);

        $this->gc = false;
    }

    private function appendRecord(array $record)
    {
        file_put_contents($this->deduplicationStore, $record['datetime']->getTimestamp() . ':' . $record['level_name'] . ':' . preg_replace('{[\r\n].*}', '', $record['message']) . "\n", FILE_APPEND);
    }
}

Filemanager

Name Type Size Permission Actions
Curl Folder 0755
FingersCrossed Folder 0755
Slack Folder 0755
SyslogUdp Folder 0755
AbstractHandler.php File 4.28 KB 0644
AbstractProcessingHandler.php File 1.5 KB 0644
AbstractSyslogHandler.php File 3.29 KB 0644
AmqpHandler.php File 3.78 KB 0644
BrowserConsoleHandler.php File 7.21 KB 0644
BufferHandler.php File 3.58 KB 0644
ChromePHPHandler.php File 5.48 KB 0644
CouchDBHandler.php File 1.91 KB 0644
CubeHandler.php File 4.52 KB 0644
DeduplicationHandler.php File 5.35 KB 0644
DoctrineCouchDBHandler.php File 1000 B 0644
DynamoDbHandler.php File 2.38 KB 0644
ElasticSearchHandler.php File 3.33 KB 0644
ErrorLogHandler.php File 2.31 KB 0644
FilterHandler.php File 4.32 KB 0644
FingersCrossedHandler.php File 5.77 KB 0644
FirePHPHandler.php File 5.33 KB 0644
FleepHookHandler.php File 3.28 KB 0644
FlowdockHandler.php File 3.28 KB 0644
GelfHandler.php File 1.91 KB 0644
GroupHandler.php File 2.69 KB 0644
HandlerInterface.php File 2.53 KB 0644
HandlerWrapper.php File 2.31 KB 0644
HipChatHandler.php File 10.51 KB 0644
IFTTTHandler.php File 2.06 KB 0644
InsightOpsHandler.php File 1.83 KB 0644
LogEntriesHandler.php File 1.58 KB 0644
LogglyHandler.php File 2.56 KB 0644
MailHandler.php File 1.58 KB 0644
MandrillHandler.php File 2.11 KB 0644
MissingExtensionException.php File 450 B 0644
MongoDBHandler.php File 1.57 KB 0644
NativeMailerHandler.php File 5.08 KB 0644
NewRelicHandler.php File 6.06 KB 0644
NullHandler.php File 953 B 0644
PHPConsoleHandler.php File 9.76 KB 0644
PsrHandler.php File 1.4 KB 0644
PushoverHandler.php File 6.47 KB 0644
RavenHandler.php File 6.96 KB 0644
RedisHandler.php File 2.82 KB 0644
RollbarHandler.php File 3.85 KB 0644
RotatingFileHandler.php File 5.75 KB 0644
SamplingHandler.php File 2.61 KB 0644
SlackHandler.php File 6.3 KB 0644
SlackWebhookHandler.php File 3.73 KB 0644
SlackbotHandler.php File 1.98 KB 0644
SocketHandler.php File 9.58 KB 0644
StreamHandler.php File 5.1 KB 0644
SwiftMailerHandler.php File 3.36 KB 0644
SyslogHandler.php File 1.8 KB 0644
SyslogUdpHandler.php File 2.51 KB 0644
TestHandler.php File 5.01 KB 0644
WhatFailureGroupHandler.php File 1.76 KB 0644
ZendMonitorHandler.php File 2.19 KB 0644