我想设置一个日志文件,以便只有肥皂范围的邮件才能记录到该文件中。相反,我还想防止在默认的调试和错误日志中记录肥皂范围的消息。
这是我在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消息,这是不可取的。
答案 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');