2016-03-17 2 views
2

Я хотел бы изменить мой системный журнал.Обратный журнал, как хвост

Мой журнал система выглядит следующим образом:

[ 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

Есть три отдельные проблемы, связанные с регулярным выражением:

  • Вы должны были бы первым .* быть ungreedy в противном случае он будет соответствовать до окончательного ] в файле.
  • Ваше регулярное выражение не будет соответствовать окончательной записи, потому что за ним не следует другая запись.
  • Каждое совпадение «фиксирует» текст, соответствующий следующему \[\s+\d{4}\-\d{2}\-\d{2} (т.е. он фиксирует начало следующей записи). Это означает, что будут возвращены только некоторые из совпадений. Чтобы исправить это, нам нужно преобразовать финальную часть в утверждение lookahead, используя (?=...).

Что-то вроде следующего должно устранить эти три проблемы.

preg_match_all('#(\[\s+\d{4}\-\d{2}\-\d{2}.*?\].*?)(?=\[\s+\d{4}\-\d{2}\-\d{2}|$)#s', $content, $matches); 

Однако ваши записи, как представляется, разделены с помощью двухстрочных каналов. Почему бы просто не разбить журнал на них? Предполагая, что вы не получите двухканальных каналов, естественно, в данных журнала, это было бы легче читать, быстрее и меньше подвергать ошибкам.

Следующая будет работать на Linux:

$lines = explode("\n\n", $content); 
$lines = array_reverse($lines); 
echo implode("\n\n", $lines); 

В Windows вы, возможно, потребуется заменить \n\n с \r\n\r\n.

усовершенствованное решение, которое будет работать независимо от типа линии кормов, позволяют пустое пространство между кормлениями линия, и выход, используя конец по умолчанию вашей системы линии может выглядеть следующим образом:

$lines = preg_split("#\r?\n\s*\n#", $content); 
$lines = array_reverse($lines); 
echo implode(PHP_EOL . PHP_EOL, $lines); 

Это также обратите внимание на то, что в вашем содержимом журнала иногда содержится более двух строк, разделяющих записи.

+0

1 проблема i use 'preg_match_all ('# (\ [\ s + \ d {4} \ - \ d {2} \ - \ d {2}. *? \]. *?) (\ [\ s + \ d {4} \ - \ d {2} \ - \ d {2} | $) # s'', но я могу получить последний журнал, я думаю, что это может быть не конец '$ ', –

+0

Я использую '$ lines = explode (" \ n \ n ", $ content); $ lines = array_reverse ($ lines); echo implode ("\ n \ n", $ lines); он не может получить результат. –

+0

'' 'соответствует концу строки, а не буквальному знаку доллара. Однако я понял, что в regex есть еще одна ошибка. Я отредактирую ответ, чтобы исправить это. –

Смежные вопросы