[英]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
匹配的最后一行-從行的開頭拋出 。 .+?$
-任意數量的字符,直到此(最后)行的末尾。 要匹配多行並以每行開頭/結尾,請使用m
和s
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.