从log.txt文件中读取错误和文件名

时间:2012-12-21 18:59:29

标签: php wordsearch

继续Getting the file name from a text file after string matching - PHP 我有一个log.txt文件,格式为:

================================================
Header of entry with date and time
================================================
Loaded options from XML file: '/path/to/the/file/some_file.xml
extendedPrintPDF started
Postfix '4.4' was append from file 'some-other_file.xml' for file: /path/to/the/file/some-other_file.indd
printPDF started
PDF Export Preset: Some preset
PDF file created: '/path/to/the/file/some_filey_namex_lo_4.4.pdf'.
File filename_lo-metadata.xml removed
postprocessingDocument started
INDD file removed: /path/to/the/file/some_file1_name_lo.indd
Error opening document: /path/to/the/file/some_file_name_lo.indd: Error: Either the file does not exist, you do not have permission, or the file may be in use by another application; line: 190
================================================
Header of entry with date and time
================================================
Loaded options from XML file: '/path/to/she/file/some_options.xml
extendedPrintPDF started
extendedPrintPDF: Error: Unsaved documents have no full name.; line: 332

我想在日志条目中捕获“错误”(如果存在),然后检测错误消息(如“未保存的文档没有全名”)或只是“打开文档时出错”并获取名称所有,只有正在创建的pdf文件。

我是新手,并不知道该如何做到这一点。

我想我已经提供了完整的信息,我在之前的帖子中没有这样做。

CHANGE: 我还想从/path/to/the/file/filename.something中获取'the'。 我不是在寻找一个确切的答案(即使它会很棒)。但是,一些帮助或指导将不胜感激。

注意: 有没有办法在没有使用RegEx的情况下这样做(我是新手,而且,我对RegEx一点也不擅长) 感谢

2 个答案:

答案 0 :(得分:1)

<强>正则表达式

如何获取文件名:

#(/.*/\w+\.\w{3})#

如何获取错误:

/Error: (.*)/m

<强> PHP

<?php

$file_data = __your__file__data__;

preg_match_all("#(/.*/\w+\.\w{3})#", $file_data, $filenames);
var_dump($filenames);

preg_match_all("/Error: (.*)/m", $file_data, $errors);
var_dump($errors);

?>

示例输出

array (size=2)
  0 => 
    array (size=3)
      0 => string '/the/path/of/log_options.xml' (length=28)
      1 => string '/path/of/some/filesomething.ind' (length=31)
      2 => string '/the/path/of/log_options.xml' (length=28)
  1 => 
    array (size=3)
      0 => string '/the/path/of/log_options.xml' (length=28)
      1 => string '/path/of/some/filesomething.ind' (length=31)
      2 => string '/the/path/of/log_options.xml' (length=28)

array (size=2)
  0 => 
    array (size=2)
      0 => string 'Error: file doesnt exist or no permissions 
' (length=44)
      1 => string 'Error: Unsaved documents have no full name: line xyz' (length=52)
  1 => 
    array (size=2)
      0 => string 'file doesnt exist or no permissions 
' (length=37)
      1 => string 'Unsaved documents have no full name: line xyz' (length=45)

我会让你弄清楚如何使用这些信息并将其放入你的数据库。

答案 1 :(得分:0)

这实际上只匹配您提供给我们的有限日志片段的语法,但它应该是一个开始。它逐行遍历日志文件,并尽力跟踪它所在的日期部分。

<?php
$logfile = '/path/to/the/file.log';
$fh = fopen($logfile, 'r') or die("can't open file.");

$r_delim = '/^=*$/';            // matches lines of only =
$r_time  = '/^\[(.*)\] - .*$/'; // matches lines that start with [, captures contents between [ and ]
$r_error = '/ Error: /';        // matches lines that contain the string ' Error: '

$skip_delim = FALSE;
$last_timestamp = 'no stamp';
$matches = array();

while($line = fgets($fh)) {
        if( preg_match($r_delim, $line) && ! $skip_delim) {
                $line = fgets($fh);
                preg_match($r_time, $line, $matches);
                $last_timestamp = $matches[1];
                $skip_delim = TRUE;
        } else if( preg_match($r_delim, $line) && $skip_delim ) {
                $skip_delim = FALSE;
        } else if( preg_match($r_error, $line) ) {
                printf('%s :: %s', $last_timestamp, $line);
        }
}

输出:

Jan 25 2012 11:26:03 :: Error opening document: /the/path/to/file/some_file_name_lo.indd: Error: Either the file does not exist, you do not have permission, or the file may be in use by another application; line: 190
Feb 24 2012 15:57:43 :: extendedPrintPDF: Error: Unsaved documents have no full name.; line: 332
Feb 24 2012 15:57:43 :: extendedPrintPDF: Error: Unsaved documents have no full name.; line: 332