我想撤消我的系统日志。
我的系统日志如下所示:
[ 2016-03-17T15:52:00+08:00 ] 0.0.0.0 /Pwebshell/index.php/Log/GetLog
INFO: [ route_check ] --START--
INFO: CheckRoute Behavior ::run [ RunTime:0.001000s ]
INFO: [ route_check ] --END-- [ RunTime:0.001000s ]
INFO: [ app_begin ] --START--
INFO: ReadHtmlCache Behavior ::run [ RunTime:0.001000s ]
INFO: [ app_begin ] --END-- [ RunTime:0.001000s ]
[ 2016-03-17T15:52:16+08:00 ] 0.0.0.0 /Pwebshell/index.php/Log/GetLog
INFO: [ route_check ] --START--
INFO: CheckRoute Behavior ::run [ RunTime:0.000000s ]
INFO: [ route_check ] --END-- [ RunTime:0.001000s ]
INFO: [ app_begin ] --START--
INFO: ReadHtmlCache Behavior ::run [ RunTime:0.000000s ]
INFO: [ app_begin ] --END-- [ RunTime:0.000000s ]
我想像这样打印出来:
[ 2016-03-17T15:52:16+08:00 ] 0.0.0.0 /Pwebshell/index.php/Log/GetLog
INFO: [ route_check ] --START--
INFO: CheckRoute Behavior ::run [ RunTime:0.000000s ]
INFO: [ route_check ] --END-- [ RunTime:0.001000s ]
INFO: [ app_begin ] --START--
INFO: ReadHtmlCache Behavior ::run [ RunTime:0.000000s ]
INFO: [ app_begin ] --END-- [ RunTime:0.000000s ]
[ 2016-03-17T15:52:00+08:00 ] 0.0.0.0 /Pwebshell/index.php/Log/GetLog
INFO: [ route_check ] --START--
INFO: CheckRoute Behavior ::run [ RunTime:0.001000s ]
INFO: [ route_check ] --END-- [ RunTime:0.001000s ]
INFO: [ app_begin ] --START--
INFO: ReadHtmlCache Behavior ::run [ RunTime:0.001000s ]
INFO: [ app_begin ] --END-- [ RunTime:0.001000s ]
到目前为止我尝试过:
1首先,我使用file_get_contents
$content = file_get_contents('log');
2然后我使用正则表达式来选择条目。
preg_match_all('#(\[\s+\d{4}\-\d{2}\-\d{2}.*\].*?)\[\s+\d{4}\-\d{2}\-\d{2}#s', $content, $matches);
3我将使用array_reverse
来反转日志。
但正则表达式未正确选择$matches
。
答案 0 :(得分:0)
正则表达式有三个独立的问题:
$a= $_POST['message'];
print_r(json_encode($a));exit;
不合格,否则它将匹配文件中的最终.*
。]
(即它捕获下一个条目的开头)。这意味着只会返回部分匹配项。为了纠正这个问题,我们需要使用\[\s+\d{4}\-\d{2}\-\d{2}
将最终部分转换为先行断言。以下内容应该解决这三个问题。
(?=...)
但是,您的条目似乎由双行换行分隔。为什么不把这些日志拆分?假设您没有在日志数据中自然地获得双线换行,这将更容易阅读,更快,更不容易出错。
以下内容适用于Linux:
preg_match_all('#(\[\s+\d{4}\-\d{2}\-\d{2}.*?\].*?)(?=\[\s+\d{4}\-\d{2}\-\d{2}|$)#s', $content, $matches);
在Windows上,您可能需要将$lines = explode("\n\n", $content);
$lines = array_reverse($lines);
echo implode("\n\n", $lines);
替换为\n\n
。
一种改进的解决方案,无论换行符的类型如何都可以使用,允许换行符之间的空白区域,并使用系统的默认行尾输出可能如下所示:
\r\n\r\n
这也将处理这样一个事实,即您的日志内容有时会包含两个以上分隔条目的换行符。