我正在为CakePHP编写我自己的解析器日志。CakePHP 3.x:以序列化数组的形式登录
我只需要一件事:那就是不写一个日志“消息”(作为一个字符串),而是一个带有各种日志信息(日期,类型,行,堆栈跟踪等)的序列化数组。
但我不明白我应该重写什么方法/类,尽管我已经咨询了API。你可以帮我吗?
编辑:
现在我做相反的事情:我读取日志(已经写入),我将它们转换成一个正则表达式的数组。
我的代码:
$logs = array_map(function($log) {
preg_match('/^'.
'([\d\-]+\s[\d:]+)\s(Error: Fatal Error|Error|Notice: Notice|Warning: Warning)(\s\(\d+\))?:\s([^\n]+)\n'.
'(Exception Attributes:\s((.(?!Request|Referer|Stack|Trace))+)\n)?'.
'(Request URL:\s([^\n]+)\n)?'.
'(Referer URL:\s([^\n]+)\n)?'.
'(Stack Trace:\n(.+))?'.
'(Trace:\n(.+))?(.+)?'.
'/si', $log, $matches);
switch($matches[2]) {
case 'Error: Fatal Error':
$type = 'fatal';
break;
case 'Error':
$type = 'error';
break;
case 'Notice: Notice':
$type = 'notice';
break;
case 'Warning: Warning':
$type = 'warning';
break;
default:
$type = 'unknown';
break;
}
return (object) af([
'datetime' => \Cake\I18n\FrozenTime::parse($matches[1]),
'type' => $type,
'error' => $matches[4],
'attributes' => empty($matches[6]) ? NULL : $matches[6],
'url' => empty($matches[9]) ? NULL : $matches[9],
'referer' => empty($matches[11]) ? NULL : $matches[11],
'stack_trace' => empty($matches[13]) ? (empty($matches[16]) ? NULL : $matches[16]) : $matches[13],
'trace' => empty($matches[15]) ? NULL : $matches[15]
]);
}, af(preg_split('/[\r\n]{2,}/', $logs)));
现在我做相反的:我读日志(已书面),并用正则表达式我将其转化为一个数组。
问题是这是非常昂贵的。并且做相反的事情会更好:以序列化数组的形式直接写入日志。
什么是“_parser log_”?这里的上下文是什么,在什么地方准确记录你想要以特定格式记录的内容? – ndm
@ndm,看我的编辑。很简单:日志被写成一个字符串,其中包含各种信息(错误的类型,日期和时间,请求的引用者和URL,消息等)。 但我想成为一个具有该信息的序列化阵列 –
我已经知道了,但数据究竟在哪里?你在谈论默认的调试/错误日志吗?即应该_every_日志被序列化?或者只是错误?你是否可能使用一个自定义记录器应该唯一受到影响?你真的需要更具体。 – ndm