我正在尝试用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";