benmorel/apache-log-parser

PHP 解析 Apache 日志文件的库

0.2.0 2020-12-02 12:44 UTC

This package is auto-updated.

Last update: 2024-09-03 21:57:11 UTC


README

A PHP library to parse Apache logs.

Build Status Coverage Status Latest Stable Version License

安装

此库可通过 Composer 安装。只需运行

composer require benmorel/apache-log-parser

要求

此库需要 PHP 7.1 或更高版本。

项目状态 & 发布流程

此库正在开发中。

当前版本号格式为 0.x.y。当引入非破坏性更改(添加新方法、优化现有代码等)时,y 会递增。

当引入破坏性更改时,总是开始新的 0.x 版本周期。

因此,将您的项目锁定到给定的版本周期(如 0.1.*)是安全的。

如果您需要升级到较新的版本周期,请查看 发布历史 以获取每个进一步 0.x.0 版本引入的更改列表。

包内容

此库提供单个类,Parser

快速开始

首先使用在生成日志文件的 httpd.conf 文件中定义的 LogFormat 创建一个 Parser 对象

use BenMorel\ApacheLogParser\Parser;

$logFormat = "%h %l %u %t \"%{Host}i\" \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"";
$parser = new Parser($logFormat);

库将您的日志格式中的每个 格式字符串 转换为字段名;字段列表可通过 getFieldNames() 方法访问

var_export(
    $parser->getFieldNames()
);
array (
  0 => 'remoteHostname',
  1 => 'remoteLogname',
  2 => 'remoteUser',
  3 => 'time',
  4 => 'requestHeader:Host',
  5 => 'firstRequestLine',
  6 => 'status',
  7 => 'responseSize',
  8 => 'requestHeader:Referer',
  9 => 'requestHeader:User-Agent',
)

然后您可以解析日志文件中的一行:parse() 方法接受日志行和一个布尔值,指示您是否希望结果为以字段名数组中的键为键的数字数组

$line = '1.2.3.4 - - [30/May/2018:15:00:23 +0200] "www.example.com" "GET / HTTP/1.0" 200 1234 "-" "Mozilla/5.0';

var_export(
    $parser->parse($line, false)
);
array (
  0 => '1.2.3.4',
  1 => '-',
  2 => '-',
  3 => '30/May/2018:15:00:23 +0200',
  4 => 'www.example.com',
  5 => 'GET / HTTP/1.0',
  6 => '200',
  7 => '1234',
  8 => '-',
  9 => 'Mozilla/5.0',
)

或以字段名为键的关联数组

var_export(
    $parser->parse($line, true)
);
array (
  'remoteHostname'           => '1.2.3.4',
  'remoteLogname'            => '-',
  'remoteUser'               => '-',
  'time'                     => '30/May/2018:15:00:23 +0200',
  'requestHeader:Host'       => 'www.example.com',
  'firstRequestLine'         => 'GET / HTTP/1.0',
  'status'                   => '200',
  'responseSize'             => '1234',
  'requestHeader:Referer'    => '-',
  'requestHeader:User-Agent' => 'Mozilla/5.0',
)

如果一行无法解析,则抛出 InvalidArgumentException。请确保将 parse() 调用包装在 try-catch 块中

try {
    $parser->parse($line, true)
} catch (\InvalidArgumentException $e) {
    // ...
}

库返回的字段名

此表显示了库如何将 格式字符串 映射到字段名

如果有两个或多个格式字符串产生相同的字段名,第二个将获得 :2 后缀,第三个获得 :3 后缀,依此类推。

性能说明

当从具有 SSD 驱动的现代服务器上的文件读取日志时,您可以期望每秒解析超过 250,000 条记录(> 50 MiB/s)。

将记录作为关联数组返回会带来大约 6% 的性能损失。