devdot / monolog-parser
解析Monolog日志文件
Requires
- php: ^8.2
Requires (Dev)
- captainhook/captainhook: ^5.16
- monolog/monolog: 2.*
- phpstan/phpstan: ^1.10
- phpunit/phpunit: ^11
- rector/rector: ^1.0
- squizlabs/php_codesniffer: ^3.9
README
一个用于解析monolog日志文件的库。
此库与Monolog 2兼容,并为多行日志和Laravel日志文件提供解析选项。
安装
使用composer安装库
composer require devdot/monolog-parser
基本用法
使用默认选项解析日志文件test.log
的示例
<?php use Devdot\Monolog\Parser; // create a new parser bound to the given file $parser = new Parser('test.log'); // retrieve the log records and print them $records = $parser->get(); foreach($records as $record) { printf('Logged %s at %s with message: %s', $record->level, $record->datetime->format('Y-m-d H:i:s'), $record->message, ); }
您也可以通过使用静态函数new
来创建一个新的Parser
对象
<?php use Devdot\Monolog\Parser; $records = Parser::new('test.log')->get(); // ...
文档
解析实例
创建新的Parser
实例
$parser = new Parser(); $parser = Parser::new(); // equivalent to new Parser()
有关参数,请参阅方法参考。
大多数方法返回Parser
实例本身,允许将调用链式调用,如下面的示例所示。
每个Parser
都旨在只与一个文件相关联,但这不是硬性限制,取决于您的使用情况。
文件和就绪状态
解析器必须提供文件名(或字符串,请参阅解析)才能就绪解析。您可以在构造函数中或使用setFile
设置文件名。使用isReady
检查解析器是否就绪
$parser = Parser::new(); $parser->setFile('test.log'); // throws FileNotFoundException if file does not exist $parser->isReady(); // true. The file is ready to be parsed
解析
解析发生在调用parse
或get
时。当调用get
时,Parser
对象将存储结果并从缓存中返回它们,除非直接调用parse
或调用clear
。
$parser = Parser::new()->setFile('test.log'); $records = $parser->parse()->get(); $records = $parser->get(); // this will return the records from cache $records = $parser->parse()->get(); // this will re-parse the file
清除缓存记录
$parser = Parser::new()->setFile('test.log'); $records = $parser->get(); // this will parse the file $records = $parser->clear()->get(); // this will re-parse the file $records = $parser->get(false); // this will re-parse the file
解析字符串而不是文件
$parser = new Parser(); $records = $parser->parse('[2023-01-01] test.DEBUG: message')->get();
日志记录
日志记录通过get
作为Log
对象返回。Log
是一个只读数组,包含类型为LogRecord
的记录。这些对象也是只读的,可以像这样访问
$records = Parser::new('test.log')->get(); $first = $records[0]; // access the records just like an array foreach($records as $record) { $record->datetime; // object of type DateTimeImmutable $record->channel; // string $record->message; // string $record->context; // object, empty array by default (decoded JSON) $record->extra; // object or array, empty array by default (decoded JSON) }
您还可以像数组键一样访问LogRecord
属性:$record['datetime']
而不是$record->datetime
。
为了参考,Monolog日志记录看起来像这样
[2020-01-01 18:00:00] debugging.WARNING: this is a message {"foo":"bar"} ["baz","bud"] ----- datetime ---- -channel- -level- ---- message ---- -- context -- --- extra ---
模式
除了默认模式外,还提供了以下模式。模式必须具有命名子模式才能正确工作。您可以这样设置任何模式
// use provided patterns $parser = Parser::new()->setPattern(Parser::PATTERN_LARAVEL); // or build your regex with named subpatterns like this: $parser->setPattern('/^\[(?<datetime>.*?)\] (?<message>.*?) \| (?<channel>\w+).(?<level>\w+)$/m');
PATTERN_MONOLOG2
(默认):将解析Monolog的LineFormatter
模式的大多数配置。PATTERN_MONOLOG2_MULTILINE
:将解析具有多行支持的Monolog的LineFormatter
的大多数配置。PATTERN_LARAVEL
:将解析使用Laravel提供的Monolog配置创建的Laravel日志文件。
解析选项
可以通过以下选项修改解析过程
可以像这样设置选项
$parser = Parser::new(); // set a single option $parser->setOptions(Parser::OPTION_SORT_DATETIME); // set multiple options $parser->setOptions(Parser::OPTION_SKIP_EXCEPTIONS + Parser::OPTION_JSON_AS_TEXT); // reset the parser to default settings $parser->setOptions(Parser::OPTION_NONE);
异常
Monolog-Parser将抛出以下异常。
FileNotFoundException
:每当访问一个不存在的文件时,都会抛出此异常。注意:当使用非存在的文件调用setFile
时,这将会发生。ParserNotReadyException
:当解析器未准备好时(isReady()
返回false
),在调用parse
或get
时将抛出此异常。如果提供字符串给parse
或当某个 解析选项 阻止异常时,则不会抛出此异常。LogParsingException
:当解析日志文件或日志记录失败时,将抛出此异常。请参阅 限制和失败的日志
限制和失败的日志
如果读取日志失败,请确保日志生成正确,并且没有列在下面的列表中。如果由 Monolog 的默认 LineFormatter
模式生成的文件无法解析,请告知我并提交一个问题。如果您使用的是非默认模式,如果这些模式被广泛使用,我仍然有兴趣提供解析模式。
Monolog-Parser 当前无法解析的日志文件或记录
- 日志条目上下文/extra部分的无效 JSON(将抛出
LogParsingException
)。 - 有效的 JSON,但具有误导性的关闭括号,如 此测试文件 中列出的所有示例。然而,此其他测试文件 中的示例将 不会 抛出错误。
方法参考
除非另有说明,否则方法返回对象 $this
。
关于
需求
- Monolog-Parser 与 PHP 8.2 或更高版本兼容。
- Monolog-Parser 不需要任何 Monolog 包。
许可证
Monolog-Parser 在 MIT 许可证下授权。有关详细信息,请参阅 LICENSE 文件。
致谢
这个库受到了 ddtraceweb 的 monolog 解析器 和 haruncpi 的 laravel 日志读取器 的启发。