kassner/log-parser

PHP 日志解析库

2.2.0 2024-08-20 20:01 UTC

This package is auto-updated.

Last update: 2024-09-20 20:10:58 UTC


README

将 Apache/Nginx/Varnish/HAProxy 日志解析成 PHP 对象,以便编程处理数据。

安装

composer require kassner/log-parser:~2.2

用法

$parser = new \Kassner\LogParser\LogParser();
$lines = file('/var/log/apache2/access.log', FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $line) {
    $entry = $parser->parse($line);
}

$entry 对象将保存所有解析的数据。如果行不匹配定义的格式,则会抛出 \Kassner\LogParser\FormatException

object(Kassner\LogParser\SimpleLogEntry)#4 (8) {
  ["host"]=>
  string(14) "193.191.216.76"
  ["logname"]=>
  string(1) "-"
  ["user"]=>
  string(8) "www-data"
  ["stamp"]=>
  int(1390794676)
  ["time"]=>
  string(26) "27/Jan/2014:04:51:16 +0100"
  ["request"]=>
  string(53) "GET /wp-content/uploads/2013/11/whatever.jpg HTTP/1.1"
  ["status"]=>
  string(3) "200"
  ["responseBytes"]=>
  string(5) "58678"
}

自定义

日志格式

您可以自定义日志格式(默认情况下,它与Apache 常见日志格式相匹配)

# default Nginx format:
$parser->setFormat('%h %l %u %t "%r" %>s %O "%{Referer}i" \"%{User-Agent}i"');

支持的格式字符串

以下是 Apache 支持的完整日志格式字符串列表,以及库是否支持它们

注意:当使用标记为 X 的选项时,您应该真的阅读注释。

自定义格式

参见#50 (评论)

条目对象

2.0.0 之前,可以通过覆盖 createEntry 方法来覆盖返回的条目对象。由于严格类型,这不再可能,所以您必须使用新创建的接口。

首先,创建两个新的类,您的条目对象以及负责创建它的工厂

class MyEntry implements \Kassner\LogParser\LogEntryInterface
{
}

class MyEntryFactory implements \Kassner\LogParser\LogEntryFactoryInterface
{
    public function create(array $data): \Kassner\LogParser\LogEntryInterface
    {
        // @TODO implement your code here to return a instance of MyEntry
    }
}

然后将工厂作为第二个参数传递给 LogParser 构造函数

$factory = new MyEntryFactory();
$parser = new \Kassner\LogParser\LogParser(null, $factory);
$entry = $parser->parse('193.191.216.76 - www-data [27/Jan/2014:04:51:16 +0100] "GET /wp-content/uploads/2013/11/whatever.jpg HTTP/1.1" 200 58678');

$entry 将是 MyEntry 的一个实例。