簡體   English   中英

如何從錯誤日志文件中獲取每個錯誤?

[英]How to get each error from error log file?

我想在日志錯誤文件中獲取每個錯誤。

因此,如果文件包含:

[08-Jul-2018 08:12:04 UTC] PHP Fatal error:  Call to undefined method DateTime::fomat() in C:\xampp\htdocs\wordpress\wp-content\themes\theme\index.php on line 44

[08-Jul-2018 08:22:22 UTC] PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[42S02]: Base table or view not found: 1146 Table 'database.table' doesn't exist' in C:\xampp\htdocs\wordpress\wp-content\themes\theme\index.php:37
Stack trace:
#0 C:\xampp\htdocs\wordpress\wp-content\themes\news_theme\index.php(37): 
PDOStatement->execute()
#1 C:\xampp\htdocs\wordpress\wp-includes\template-loader.php(74): 
include('C:\\xampp\\htdocs...')
#2 C:\xampp\htdocs\wordpress\wp-blog-header.php(19): 
require_once('C:\\xampp\\htdocs...')
#3 C:\xampp\htdocs\wordpress\index.php(17): require('C:\\xampp\\htdocs...')
#4 {main}
thrown in C:\xampp\htdocs\wordpress\wp-content\themes\theme\index.php on line 37

這是兩個錯誤,但是其中一個錯誤很長,占用多於一行。

我想在變量中獲取它們的每個錯誤。

我試過了:

$contents  = file(get_template_directory().'/errors.txt', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($contents as $key => $content) {
    echo $key . $content . '<br>';
}

但這得到了每一行,因此第二行將存儲在多個變量中,而我想將每個錯誤都存儲在一個變量中。

那可能嗎?

您的代碼只逐行打印每條輸入行及其編號。

要將輸入分成與每個錯誤有關的大塊,您可以采用以下方法:

  • 整個文件讀入一個變量。
  • 對它執行例如preg_match_all

使用正則匹配的正則表達式:

  • ^\\[[^\\]]+\\] -初始部分-括號之間的日期/時間,從行的開頭(由於m選項)。
  • [^\\n]+ - \\n以外的其他字符序列-此行的其余部分。

現在剩下的-可選的非捕獲組- (?:...)? ,包含:

  • \\nStack trace: -“更長”消息的開始部分,也是從行首開始。
  • .+ -“中間部分”-堆棧跟蹤的實際內容。 由於使用s選項,它也匹配\\n字符,以結束這些“中間”行。
  • \\nthrown匹配的最后一行-從行的開頭拋出
  • .+?$ -任意數量的字符,直到此(最后)行的末尾。

要匹配多行並以每行開頭/結尾,請使用ms regex選項。

下面有一個示例程序,它匹配常量文本而不是輸入文件:

<?php
$text = <<<'EOD'
[08-Jul-2018 08:12:04 UTC] PHP Fatal error: on line 44
[08-Jul-2018 08:22:22 UTC] PHP Fatal error: in ...:37
Stack trace:
#0 C:\xampp\htdocs\wordpress\wp-content\themes\news_theme\index.php(37): 
PDOStatement->execute()
#1 C:\xampp\htdocs\wordpress\wp-includes\template-loader.php(74): 
include('C:\\xampp\\htdocs...')
thrown in ... on line 37
[08-Jul-2018 08:12:45 UTC] PHP Fatal error: on line 155
EOD;

$pattern = '/^\[[^\]]+\]\D+\d+\n(?:Stack trace:.+\nthrown.+?$)?/ms';
if (preg_match_all($pattern, $text, $matches))
    print_r($matches[0]);
?>

根據需要,它僅打印3個匹配項。

編輯

如果您還有其他錯誤情況,請嘗試另一個正則表達式:

^\[[^\]]+\][^\n]+(?:\n[^\[\n][^\n]+)*

這次,只有m選項。 它匹配:

  • ^\\[[^\\]]+\\][^\\n]+ -“開始”行- [...]...
  • (?:\\n[^\\[\\n][^\\n]+)* -任意數量(包括0)的非空后跟行,而不是以[開頭。

有關此最后一個正則表達式的工作示例,請參見https://regex101.com/r/0IUkc0/1

使用file_get_contents作為單個字符串讀取文件,然后使用

$splits = preg_split('/\s+(?=^\[\d{2}-\w{3}-\d{4} \d+(?::\d{2}){2} \w{3}])/m', $contents);

模式匹配

  • \\s+ -1+個空格,后跟...
  • (?=^\\[\\d{2}-\\w{3}-\\d{4} \\d+(?::\\d{2}){2} \\w{3}]) -積極向前當前位置右側的,要求:
    • ^ -行首(由於m修飾符)
    • \\[ -一個[ char
    • \\d{2}-\\w{3}-\\d{4} -2位數字- ,3個字符字符- ,4位數字
    • - 空間
    • \\d+ -1個以上數字
    • (?::\\d{2}){2} -2次出現:和2位數字(與:\\d{2}:\\d{2}
    • - 空間
    • \\w{3} -3個字元的字元(字母,數字或_
    • ] -一個]字符。

參見regex演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM