Поворот журналов с помощью автономной библиотеки Monolog

#php #logging #monolog #logrotate

#php #ведение журнала #monolog #logrotate

Вопрос:

Я работаю с устаревшим проектом. Я добавил monolog logger как отдельную библиотеку (не с Symfony), и мне необходимо реализовать ротацию журналов.

Ниже приведен класс Logger, и я не уверен, как реализовать функциональность поворота журнала.

 namespace UtilsLogger;

use Exception;
use Bootstrap;
use MonologHandlerRotatingFileHandler;
use MonologLogger as MonologLogger;
use MonologHandlerStreamHandler;

/**
 * Class Logger
 */
class Logger
{
    /** @var MonologLogger $logger */
    private $logger;
    const DEBUG    = MonologLogger::DEBUG;
    const NOTICE   = MonologLogger::NOTICE;
    const WARNING  = MonologLogger::WARNING;
    const ERROR    = MonologLogger::ERROR;
    const CRITICAL = MonologLogger::CRITICAL;

    public function __construct()
    {
        $bootstrap  = Bootstrap::getInstance();
        $projectDir = $bootstrap->getProjectDir();
        $host       = $bootstrap->initHost();
        $domain     = $host->getDomain();

        $this->logger = new MonologLogger($host->getDomain());
        $this->logger->
        $this->logger->pushHandler(
            new StreamHandler(
                "$projectDir/var/log/$domain/$domain.log",
                MonologLogger::DEBUG)
        );

        $logRotate = new RotatingFileHandler("$projectDir/var/log/$domain/$domain.log");
    }

    /**
     * @param $level
     * @param $message
     * @param $context
     *
     * @return void
     */
    public function log($level, $message, array $context = [])
    {
        $message   = is_string($message) ? $message : '';
        $exception = $this->getException($context);

        if ($exception) {
            $message = "{$exception->getMessage()} at line {$exception->getLine()} in file {$exception->getFile()} Code: {$exception->getCode()}";
        }

        switch ($level) {
            case self::DEBUG:
                $this->logger->debug($message);
                break;
            case self::NOTICE:
                $this->logger->notice($message);
                break;
            case self::WARNING:
                $this->logger->warning($message);
                break;
            case self::ERROR:
                $this->logger->error($message);
                break;
            case self::CRITICAL:
                $this->logger->critical($message);
                break;
            default:
                $this->logger->info($message);
                break;
        }
    }

    /**
     * @param array $context
     *
     * @return Exception|null
     */
    private function getException($context)
    {
        return array_key_exists('exception', $context) amp;amp; $context['exception'] instanceof Exception
            ? $context['exception']
            : null;
    }
}
 

Комментарии:

1. (Не то, что я использовал, но) Что касается RotatingFileHandler расширений StreamHandler , вы пробовали использовать это в $this->logger->pushHandler() вызове?

2. Хороший момент, он работает, спасибо за совет 🙂 Я отвечу на этот вопрос с помощью рабочего решения, и если вы хотите, вы можете скопировать его в качестве своего ответа, и я отмечу его как полезный.

Ответ №1:

Глядя на код (https://github.com/Seldaek/monolog/blob/main/src/Monolog/Handler/RotatingFileHandler.php )…

 class RotatingFileHandler extends StreamHandler
 

итак, если вы передаете экземпляр RotatingFileHandler в pushHandler , то это должно сработать…

     $this->logger = new MonologLogger($host->getDomain());
    $logRotate = new RotatingFileHandler("$projectDir/var/log/$domain/$domain.log");        

    $this->logger->pushHandler($logRotate);