Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

i was try with MemoryPeakUsageProcessor, but i think my code is wrong:

$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

like image 896
The Manh Nguyen Avatar asked Oct 27 '25 10:10

The Manh Nguyen


1 Answers

Because the size limit does not exists in all Monolog Handlers, I had to write it. Please find below my solution written for Slim 3 framework. 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

'logger' => [
  'name' => 'helloStack',
  'path' => __DIR__ . '/../logs/app.log',
  'level' => \Monolog\Logger::NOTICE,
  'maxSize' => 100000,   // rotate log if exceeds 100Kb
  'maxFiles' => 3
],
like image 95
simedia Avatar answered Oct 28 '25 22:10

simedia