【问题标题】:a way to disable Monolog on a per-script basis?一种在每个脚本的基础上禁用 Monolog 的方法?
【发布时间】:2012-06-01 07:59:32
【问题描述】:

我们有一些相当大的数据导入脚本(Symfony“命令”)由于 Monolog 内存不足而出错(第 58 行的vendor\monolog\src\Monolog\Formatter\LineFormatter.php)。我们一般使用 Monolog,所以不想完全禁用它。

【问题讨论】:

  • 您是否在 prod 环境 (--env=prod) 中运行脚本?因为这种方式 monolog 不应该记录任何东西,直到达到给定的日志级别(通常是错误)。
  • 这确实有帮助 - 导入脚本通过另外几千条记录 - 但它最终再次出错。奇怪的是,它在另一个位置出错(vendor\doctrine\lib\Doctrine\ORM\UnitOfWork.php 在第 418 行)。我之前遇到过这个错误,我用批处理修复了这个错误(a la docs.doctrine-project.org/projects/doctrine-orm/en/2.0.x/…)。我已经尝试使我的批次更小,但是完全禁用独白仍然是唯一似乎可以解决这些错误的方法(--env=prod 与否)。

标签: php symfony monolog


【解决方案1】:

我意识到这是一个老问题,但是当我遇到一个长期运行的、使用 Monolog 的脚本生成内存不足错误的问题时,原来问题是 Monolog 的“fingers_crossed”处理程序缓冲了大量日志消息.

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

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

编辑:正如 Sergio 在 cmets 中指出的那样,buffer_size 设置:“最多应该缓冲多少个条目,超过从缓冲区中删除最旧的条目”。

【讨论】:

【解决方案2】:

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

你更有可能在教义上有问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2011-10-20
    • 1970-01-01
    • 2017-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多