Monolog RotatingFileHandler根据日志类型保存到特定文件


Monolog RotatingFileHandler save to a specific file according to log type

我正在尝试用monlog做一些我不确定是否可能的事情。所以我在想一种实用的方法来组织日志文件。

首先,我想有三个不同的文件,INFO、WARNING和ERROR,但很难在de file中搜索特定的日期。所以我决定这样组织:

记录

  • |_信息|_年份|_2016年5月12日.log
  • |_警告|_年份|_2016年5月12日.log
  • |_错误|_年份|_2016年5月12日.log

以下是我决定做的

$infoStreamHandler = new 'Monolog'Handler'RotatingFileHandler($settings['path_info'].'/info.log', Monolog'Logger::INFO);
$warningStreamHandler = new 'Monolog'Handler'RotatingFileHandler($settings['path_warn'].'/warning.log', Monolog'Logger::WARNING);
$errorStreamHandler = new 'Monolog'Handler'RotatingFileHandler($settings['path_error'].'/error.log', Monolog'Logger::ERROR);
$logger ->pushHandler($infoStreamHandler);
$logger->pushHandler($warningStreamHandler);
$logger->pushHandler($errorStreamHandler);

但这并没有像我预期的那样奏效。我首先尝试了StreamHandler,它很有效(但它只为所有日期创建了一个文件),但当我切换到RotatingFileHandler时,它在所有3个文件中都保存了相同的警告,而不是只保存在警告日志中。

有什么想法吗?

提前谢谢。

如果您想将日志划分为./path/to/directory/2017/07/21-yournamelog.log,则需要执行以下操作:

$logger = new Logger('chanel-name');
$handler = new RotatingFileHandler('./path/to/directory/yournamelog.log', 0, Logger::INFO, true, 0664);
# '/' in date format is treated like '/' in directory path
# so Y/m/d-filename will create path: eg. 2017/07/21-filename.log
$handler->setFilenameFormat('{date}-{filename}', 'Y/m/d');
$logger->pushHandler($handler);
$array = ["x" => "y"];
$logger->addInfo('new message', $array);

它将在路径./path/to/directory/2017/07/21-yournamelog.log中创建日志文件,内容为

[2017-07-21 14:33:49] chanel-name.INFO: new message {"x":"y"} []

所以我刚刚发现了问题所在。我缺少一个参数$maxFiles$infoStreamHandler = new 'Monolog'Handler'RotatingFileHandler($settings['path_info'].'/info.log', 0, Monolog'Logger::INFO);

现在它工作得很好!

在较新版本的symfony(4.4)中,您可以在旋转处理程序上设置日期格式和文件名格式。

这是来自monolog-yaml文件的一个示例:

my_channel:
        type: rotating_file
        path:     "%kernel.logs_dir%/%kernel.environment%.my_channel.log"
        level: debug
        date_format: 'Y/m/d'
        filename_format: '{date}-{filename}'
        channels: [my_channel]

它将把它保存在一个路径"中;Y/m/d-my_channel.log";