devdot/monolog-parser

解析Monolog日志文件

v1.6 2024-05-02 16:12 UTC

This package is auto-updated.

Last update: 2024-09-03 07:55:36 UTC


README

Test Automation

一个用于解析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

解析

解析发生在调用parseget时。当调用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),在调用 parseget 时将抛出此异常。如果提供字符串给 parse 或当某个 解析选项 阻止异常时,则不会抛出此异常。
  • LogParsingException:当解析日志文件或日志记录失败时,将抛出此异常。请参阅 限制和失败的日志

限制和失败的日志

如果读取日志失败,请确保日志生成正确,并且没有列在下面的列表中。如果由 Monolog 的默认 LineFormatter 模式生成的文件无法解析,请告知我并提交一个问题。如果您使用的是非默认模式,如果这些模式被广泛使用,我仍然有兴趣提供解析模式。

Monolog-Parser 当前无法解析的日志文件或记录

方法参考

除非另有说明,否则方法返回对象 $this

关于

需求

  • Monolog-Parser 与 PHP 8.2 或更高版本兼容。
  • Monolog-Parser 不需要任何 Monolog 包。

许可证

Monolog-Parser 在 MIT 许可证下授权。有关详细信息,请参阅 LICENSE 文件。

致谢

这个库受到了 ddtraceweb 的 monolog 解析器haruncpi 的 laravel 日志读取器 的启发。