像尾巴一样反向记录

时间:2016-03-17 09:16:22

标签: php logging reverse

我想撤消我的系统日志。

我的系统日志如下所示:

[ 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

1 个答案:

答案 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

这也将处理这样一个事实,即您的日志内容有时会包含两个以上分隔条目的换行符。