PHP Monolog 记录器 RotatingFileHandler 从不旋转文件
Posted
技术标签:
【中文标题】PHP Monolog 记录器 RotatingFileHandler 从不旋转文件【英文标题】:PHP Monolog logger RotatingFileHandler never rotates files 【发布时间】:2019-01-09 19:16:30 【问题描述】:php 7.1,ubuntu 12.04 LTS,独白版本为 1.23.0。
记录器初始化:
<?php
$logger = new Logger('app');
$logger->pushHandler(
new RotatingFileHandler(
Main\Application::getDocumentRoot() . '/runtime/logs/app.log',
5,
Logger::DEBUG
)
);
目前路径中有 24 个日志文件,而不是预期的 5 个。
如何强制 monolog 按预期旋转文件?我需要做一些额外的步骤来轮换文件吗?什么原因可能导致不删除旧日志?
【问题讨论】:
无法重现您的问题,对我来说,它在 5 个文件后轮换。我会尝试调试这部分:github.com/Seldaek/monolog/blob/… - 如果旧文件不可写或在unlink
期间发生错误,则不会升级任何内容,并且它不会默默执行任何操作。我想你检查了文件权限(有点不太可能,创建文件的用户也应该能够再次删除它......)。
@userlond 你能分享你在那个目录中的文件名吗
@Tobias K,文件权限为600
。我通过cli运行脚本。我已经在我的脚本中添加了测试代码:is_writeable
返回true
,unlink
在调用它们的参数等于其中一个日志的路径时是可以的。 @Tzook Bar Noy、app-2018-08-20.log
、app-2018-08-19.log
等等。我觉得没什么特别的。
主日志文件app.log
是可写的,但旧的日志文件可能不是。第二个原因是如果您使用 cronjob 运行脚本,它可能会以其他用户权限运行。
同意@Jared Chu。如果这是一个 cronjob,那么在您的调试中,请确保您以运行 cronjob 的同一用户身份对其进行测试。例如使用sudo -u cronuser /usr/bin/php /path/to/cronjob
【参考方案1】:
试试下面的代码...
$logger = new Logger('app');
$handler = new RotatingFileHandler(Main\Application::getDocumentRoot() . '/runtime/logs/app.log', 5, Logger::DEBUG, true, 0664);
//$handler->setFilenameFormat('date-filename', 'Y/m/d');
$logger->pushHandler($handler);
$array = ["x" => "y"];
$logger->addInfo('new message', $array);
【讨论】:
据我了解,您指定的$filePermission
参数应强制对新创建的日志文件具有 664 权限。它应该为当前用户所属的组的所有用户授予对文件的读写权限。正如我对我的问题的评论,我的问题似乎已经消失了,我现在没有时间进行全面测试(项目正在开发中)。另外前段时间项目移动到另一台服务器,因此可能会对配置进行一些更改。这个答案没有足够的信息,只是尝试。解释不够清楚,我想有些 cmets 有更多信息要走。以上是关于PHP Monolog 记录器 RotatingFileHandler 从不旋转文件的主要内容,如果未能解决你的问题,请参考以下文章
PHP Monolog 记录器 RotatingFileHandler 从不旋转文件
Monolog stdout/stderr 记录到 Docker 中的当前终端进程