2

我想设置一个日志文件,以便仅将具有肥皂范围的消息记录到该文件中。相反,我还想防止针对默认的调试和错误日志记录具有肥皂范围的消息。

这是我在 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',
));

这是我的一个库中的一个片段,它可以进行肥皂调用。

        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 中得到了调试肥皂消息,这是不可取的。

4

3 回答 3

4

根据CakeLog::config 文档

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

所以,调试记录器写入所有类型的消息'types' => array('notice', 'info', 'debug'),

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

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

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

在这种情况下,根据CakeLog::write 方法的文档

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

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

  • 保留它现在,导致将所有调试消息保存在一个文件中,并将一些消息保存在某些特定日志中,这不是一个坏主意。
于 2013-06-27T02:30:22.520 回答
1

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

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

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 确实有一个日志记录安全网,因此如果一条日志消息已被完全过滤掉(通过有效的错误配置),它至少会被写入默认记录器。所以这样的电话:

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

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

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

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

于 2013-06-27T07:08:31.397 回答
0

您可以使用 CakeLog::disable('debug') 和 CakeLog::disable('error') 在 CakeLog::write 到 '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::禁用

于 2018-05-29T09:17:33.343 回答