简体   繁体   English

如何使用monolog设置日志文件的最大大小

[英]how to set max size for log file using monolog

I used monolog and do not know how to set the maximum file log size. 我使用了monolog,但不知道如何设置最大文件日志大小。

i was try with MemoryPeakUsageProcessor, but i think my code is wrong: 我尝试使用MemoryPeakUsageProcessor,但是我认为我的代码是错误的:

$formatter = new LineFormatter(
            null, // Format of message in log, default [%datetime%] %channel%.%level_name%: %message% %context% %extra%\n
            null, // Datetime format
            true, // allowInlineLineBreaks option, default false
            true  // ignoreEmptyContextAndExtra option, default false
        );
$logger = new Logger($logName);
$logSize= new Monolog\Processor\MemoryPeakUsageProcessor(20);
$logger->pushProcessor($logSize);
$stream = new RotatingFileHandler(__DIR__.'./../../app.log',1);
$stream->setFormatter($formatter);
$logger->pushHandler($stream);

but max size do not set.When the capacity is exceeded, it does not delete or empty my log file 但未设置最大大小。超出容量时,不会删除或清空我的日志文件

Because the size limit does not exists in all Monolog Handlers, I had to write it. 因为大小限制并不在所有Monolog处理程序中都存在,所以我不得不编写它。 Please find below my solution written for Slim 3 framework. 请在下面找到我为Slim 3框架编写的解决方案。 I am sure you can adapt it to your own case 我相信您可以根据自己的情况进行调整

// SLIM 3 framework, from dependencies.php
...

// monolog setup with rotating files according to a size
$container['logger'] = function ($c) {
  // get the settings (array, see below)
  $settings = $c->get('settings')['logger'];

  // rotate log file on size
  $logname = $settings['path'];
  if (file_exists($logname) && filesize($logname) > $settings['maxSize']) {
    $path_parts = pathinfo($logname);
    $pattern = $path_parts['dirname']. '/'. $path_parts['filename']. "-%d.". $path_parts['extension'];

    // delete last log
    $fn = sprintf($pattern, $settings['maxFiles']);
    if (file_exists($fn))
      unlink($fn);

    // shift file names (add '-%index' before the extension)
    for ($i = $settings['maxFiles']-1; $i > 0; $i--) {
      $fn = sprintf($pattern, $i);
      if(file_exists($fn))
        rename($fn, sprintf($pattern, $i+1));
    }
    rename($logname, sprintf($pattern, 1));
  }

  $stream = new Monolog\Handler\StreamHandler($logname, $settings['level']);

  // declare finally the logger
  $logger = new Monolog\Logger($logname);
  $logger->pushHandler($stream);

  return $logger;  // ready to log ;)
};

...

Below is an example of Monolog settings in an array 以下是数组中Monolog设置的示例

'logger' => [
  'name' => 'helloStack',
  'path' => __DIR__ . '/../logs/app.log',
  'level' => \Monolog\Logger::NOTICE,
  'maxSize' => 100000,   // rotate log if exceeds 100Kb
  'maxFiles' => 3
],

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM