一种基于每个脚本禁用 Monolog 的方法


a way to disable Monolog on a per-script basis?

我们有一些相当大的数据导入脚本(Symfony"命令"),由于Monolog内存不足(vendor''monolog''src''Monolog''Formatter''LineFormatter.php在第58行)而出错。 我们通常使用Monolog,因此不想完全禁用它。

我意识到这是一个老问题,但是当我遇到长时间运行的、使用 Monolog 的脚本生成内存不足错误时,事实证明问题是 Monolog 的"fingers_crossed"处理程序缓冲了大量日志消息。

我通过为有问题的 Monolog 处理程序设置"buffer_size"变量来解决问题。像这样:

main:
    type:         fingers_crossed
    action_level: info
    buffer_size:  200
    handler:      nested

编辑:正如Sergio在评论中指出的那样,buffer_size设置:"最多应该缓冲多少个条目,除此之外,最旧的项目将从缓冲区中删除"。

由于在生产环境中您对教义有问题,我认为专注于记录器不会改善您的情况。但是,您可以尝试通过多次调用 $logger->popHandler() 从堆栈中弹出日志处理程序。可能是日志消息堆叠,因此内存不足。

不过,你更有可能对教义有问题。

我会尝试使用XHProf或XDebug来查看实际问题所在。仅仅因为脚本在某一点失败并不意味着它是问题的原因(实际内存泄漏可能在其他地方)。