CakePHP通知预先修复了' Debug:&#39 ;;进入debug.log

时间:2014-07-25 15:46:12

标签: cakephp cakephp-2.2

我刚刚发现我的应用程序在debug.log而不是error.log中记录了Notices。所有通知似乎都以" Debug:"为前缀,例如:

  

2014-07-25 14:10:50调试:注意(8):

core.php中的Debug设置为0。我使用了在core.php中配置的自定义错误处理程序:

Configure::write('Error', array(
    'handler' => 'MyErrorHandler::handleError',
    'level' => E_ALL & ~E_DEPRECATED & ~E_STRICT,
    'trace' => true,
    'api' => false
));

我在bootstrap.php中有这个:

App::uses('MyErrorHandler', 'Lib');

App::uses('CakeLog', 'Log');
CakeLog::config('debug', array(
    'engine' => 'FileLog',
    'types' => array('info', 'debug'),
    'file' => 'debug',
));
CakeLog::config('error', array(
    'engine' => 'FileLog',
    'types' => array('warning', 'error', 'critical', 'alert', 'emergency', 'notice'),
    'file' => 'error',
));

如果我移动' debug'从调试配置到错误配置,调试消息转到error.log,但调试器的输出也是如此:log()。

问题似乎是通知以" Debug"为前缀。有什么想法吗?

更新 见@ndm的回答 以下是我在自定义mapErrorCode函数中使用的代码,以帮助解决此问题:

case E_NOTICE:
case E_USER_NOTICE:
    $error = 'Notice';
    $levels = array_flip(CakeLog::levels());
    $log = ( isset($levels['notice']) ? $levels['notice'] : LOG_NOTICE );

1 个答案:

答案 0 :(得分:2)

问题

正如我的评论中所提到的,此行为是由LOG_DEBUGLOG_NOTICE在Windows系统上保持相同值(6)引起的,PHP团队中的某些人认为它可能是有趣的是处理用户级别暴露的操作系统差异(Windows没有那么多级别),而不是在内部翻译值。

<强> https://bugs.php.net/bug.php?id=18090

内部CakeLog使用error type (string) to error level (int) mapflipped来创建地图以按级别检索类型,因此您最终会得到一张看起来像的地图像

array(
    (int) 1 => 'critical',
    (int) 4 => 'error',
    (int) 5 => 'warning',
    (int) 6 => 'debug'
)

会将LOG_DEBUGLOG_NOTICELOG_INFO级别视为debug类型,因为它们都包含值6

可能的解决方法

应该可以解决这个问题,但可能会有一些注意事项。您可以使用CakeLog覆盖CakeLog::levels()中的级别,以便类型具有单独的级别:

CakeLog::levels(array(
    'emergency', 'alert', 'critical', 'error',
    'warning', 'notice', 'info', 'debug'
),
false);

会产生类似

的地图
array(
    (int) 0 => 'emergency',
    (int) 1 => 'alert',
    (int) 2 => 'critical',
    (int) 3 => 'error',
    (int) 4 => 'warning',
    (int) 5 => 'notice',
    (int) 6 => 'info',
    (int) 7 => 'debug'
)

最后,您需要使用a custom error handler将错误代码映射到适当的级别,默认notices are mapped to LOG_NOTICEErrorHandler::mapErrorCode()),请参阅6,您希望成为5

问题可能是

虽然这可能适用于错误处理程序中的PHP错误(例如关于未定义变量等的通知),以及您明确传递适当级别的CakeLog::write()的自定义调用,但是遇到核心或插件调用CakeLog::write()并传递硬编码LOG_*常量的问题,这很可能会导致类型再次被写入错误的日志。

但是,据我所知,只有在核心(但是)中出现CakeLog::write()这样的调用的地方才出现在错误处理程序中,所以现在覆盖它可能会这样做。