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 返回trueunlink 在调用它们的参数等于其中一个日志的路径时是可以的。 @Tzook Bar Noy、app-2018-08-20.logapp-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 - Logging for PHP

Monolog stdout/stderr 记录到 Docker 中的当前终端进程

日志记录工具

Monolog:将不同通道和多个处理程序记录到分组日志文件 + 专用日志文件

The PHP Package 之 monolog[转]