CakeLog和范围:将范围限制为仅一个记录器

时间:2013-06-26 22:43:49

标签: cakephp

我想设置一个日志文件,以便只有肥皂范围的邮件才能记录到该文件中。相反,我还想防止在默认的调试和错误日志中记录肥皂范围的消息。

这是我在bootstrap.php中的当前设置。

CakeLog::config('soap', array(
    'engine' => 'FileLog',
    'types' => array('info','debug','error'),
    'scopes' => array('soap'),
    'file' => 'soap'
));

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

这是我的一个libs的片段,它可以调用soap。

        CakeLog::debug("REQUEST:\n" . $client->__getLastRequest() . "\n", 'soap');
        CakeLog::debug("RESPONSE:\n" . $client->__getLastResponse() . "\n", 'soap');

    } catch (SoapFault $e) {
        CakeLog::error(print_r($result,true), 'soap');
        CakeLog::error('Exception: (' . $e->getCode() . ') ' . $e->getMessage(), 'soap');
        if (isset($client)) {
            CakeLog::error("Errored REQUEST:\n" . print_r($client->__getLastRequest(), true) . "\n", 'soap');
        }

当我执行当前设置时,我在debug.log和soap.log中收到调试soap消息,这是不可取的。

3 个答案:

答案 0 :(得分:4)

根据CakeLog::config documentation

  

如果未定义任何范围,则适配器将捕获与处理级别匹配的所有范围。

因此,调试记录器会编写类型为'types' => array('notice', 'info', 'debug'),

的所有消息

现在你怎么能避免它?似乎你有两种方式:

  • 使用CakeLog :: write自定义错误类型

    CakeLog :: write('soap',“REQUEST:\ n”。$ client-> __ getLastRequest()。“\ n”);

在这种情况下,根据CakeLog::write method

的文件
  

整数|字符串$ type      正在写入的消息类型。当value是一个整数或与识别的级别匹配的字符串时,它将被视为日志级别。否则它被视为范围。

范围和类型将相同且具有“soap”值,因此,消息不会记录在调试记录器中,而只会记录在soap中。

  • 将其保留为现在,因为将所有调试消息保存在一个文件中,并在某些特定日志中保存一些消息并不是一个坏主意。

答案 1 :(得分:1)

没有定义范围的记录器将记录所有范围,就像问题中的调试和错误日志配置一样。

为了防止调试+错误日志包含soap消息,您需要明确定义它们应该对哪些范围起作用:

CakeLog::config('debug', array(
    'engine' => 'FileLog',
    'types' => array('notice', 'info', 'debug'),
    // restrict to scope=type only
    'scopes' => array('notice', 'info', 'debug'),
    'file' => 'debug',
));
CakeLog::config('error', array(
    'engine' => 'FileLog',
    'types' => array('warning', 'error', 'critical', 'alert', 'emergency'),
    // restrict to scope=type only
    'scopes' => array('warning', 'error', 'critical', 'alert', 'emergency'),
    'file' => 'error',
));

Cake确实有一个日志记录safety net,这样如果日志消息已被完全过滤掉(通过什么是有效的,错误的配置),它将至少被写入默认记录器。所以这样的电话:

$this->log('special', 'foo');

仍然写入foo日志(使用默认配置)。

没有所有消息的调试日志不是调试日志

正如Vadim所回答的 - 拥有包含所有日志消息的调试日志并不是 。这允许在单个文件中获取信息,而不需要在应用程序中没有完全计划的情况下查看几个不同的文件。

答案 2 :(得分:0)

您可以使用CakeLog :: disable('debug')和CakeLog :: disable('error')在CakeLog ::写入'soap'之前暂时禁用这两个默认日志流。

并且不要忘记在写入'soap'日志后使用CakeLog :: enable('debug')和CakeLog :: enable('error')立即恢复。

样品:

CakeLog::debug('THIS MESSAGE WILL APPEAR IN debug.log and soap.log', 'soap');
CakeLog::disable('debug');
CakeLog::debug('THIS MESSAGE WILL NOT APPEAR IN debug.log but soap.log only', 'soap');
CakeLog::enable('debug');
CakeLog::debug('THIS MESSAGE WILL APPEAR IN debug.log and soap.log', 'soap');

CakeLog::disable