benmorel / apache-log-parser
PHP 解析 Apache 日志文件的库
Requires
- php: ^7.2 || ^8.0
Requires (Dev)
- php-coveralls/php-coveralls: ^2.4
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-09-03 21:57:11 UTC
README
A PHP library to parse Apache logs.
安装
此库可通过 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% 的性能损失。