我正在爲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