如何使用 Monolog 记录日志

如何使用 Monolog 记录日志,第1张

monolog是一个为5.3以上版本php开发的日志库,但是需要注意的是现在主干版本只支持php 7以上版本,如果你的服务器环境还是php 5的话,可以使用monolog的1.x版本。

值得一提的是monolog是一个符合psr-3规范的日志类库,并且符合psr-4加载规范。如果有对psr规范不太了解的同学可以参看如下链接:http://www.php-fig.org/psr/,我们在这里就不具体介绍这些规范了,反正知道monolog是复合当前最新行业规范的日志库就够了。

如果想要在你的代码中引入monolog的话只需要执行:

composer require monolog/monolog

mongolog中有几个很重要的概念:

第一个:handler 日志管理器

存放handler的数据结构是一个“栈”,一个日志实例可以有多个handler,通过Logger实例的pushHandler方法压入一个handler,该方法接受一个HandlerInterface类型的参数。如果你设置了多个handler,当你新增一条日志的时候,他会从栈顶开始往下传播,关心这个级别日志的handler将会处理这条日志。所有的handler都会继承AbstractProcessingHandler这个抽象类,并且只需要实现里面的抽象方法write就可以了;同时这个抽象类会继承AbstractHandler这个抽象类,这个抽象类的构造函数有两个参数:level和bubble,前者表示该handler关心的最低日志级别,是个整型,后者表示日志被当前handler处理后是否接着向下传递。参照如下代码:

use Monolog\Logger

use Monolog\Handler\StreamHandler

use Monolog\Handler\ErrorLogHandler

$logger = new Logger('my_logger')

$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::INFO))

$logger->pushHandler(new ErrorLogHandler(ErrorLogHandler::OPERATING_SYSTEM, Logger::ERROR, false))

$logger->info('码王教育——可能是最具含金量的IT培训')

如上这段代码,这条日志被ErrorLogHandler处理了,并且ErrorLogHandler的bubble参数设置为false,则日志不会被写入my_app.log中了。

第二个:formatter 设置日志格式

每个handler可以单独设置记录的日志格式,AbstractHandler抽象类中有一个setFormatter方法,该参数接受一个FormatterInterface类型的参数。可以看到monolog自带的formatter都继承自NormalizerFormatter,该类实现了format和formatBatch方法。我们修改上面的示例代码,让两个handler记录不同格式的日志:

use Monolog\Logger

use Monolog\Handler\StreamHandler

use Monolog\Handler\ErrorLogHandler

use Monolog\Formatter\JsonFormatter

$logger = new Logger('my_logger')

$stream_handler = new StreamHandler(__DIR__.'/my_app.log', Logger::INFO)

$stream_handler->setFormatter(new JsonFormatter())

$logger->pushHandler($stream_handler)

$logger->pushHandler(new ErrorLogHandler(ErrorLogHandler::OPERATING_SYSTEM, Logger::INFO))

$logger->info('码王教育——可能是最具含金量的IT培训')

此时可以看到my_app.log中记录的日志就变为了更方便解析的json格式了。

第三个:processor 日志处理器,用来给日志添加额外信息

存放processor的结构也是一个“栈”,意味着你也可以通过pushProcessor方法给一个Logger实例配置多个processor。我们注意到,这里pushProcessor接受一个callable,也就是需要一个函数或者类方法,但是官方自带的这些processor都是类,随便点进去一个源码就会发现,其实这些类都用到了__invoke魔术方法,所以在被当做callable调用的时候会自动调用__invoke。我们接着修改上面示例,给我们的日志加上更多信息:

use Monolog\Logger

use Monolog\Handler\StreamHandler

use Monolog\Handler\ErrorLogHandler

use Monolog\Formatter\JsonFormatter

use Monolog\Processor\UidProcessor

use Monolog\Processor\ProcessIdProcessor

$logger = new Logger('my_logger')

$stream_handler = new StreamHandler(__DIR__.'/my_app.log', Logger::INFO)

$stream_handler->setFormatter(new JsonFormatter())

$logger->pushHandler($stream_handler)

$logger->pushHandler(new ErrorLogHandler(ErrorLogHandler::OPERATING_SYSTEM, Logger::INFO))

$logger->pushProcessor(new UidProcessor)

$logger->pushProcessor(new ProcessIdProcessor)

$logger->info('码王教育——可能是最具含金量的IT培训')

再次执行这段代码就能看到,我们在日的后面加上了uid和process_id。

祝福楼主

Monolog是php下比较全又容易扩展的记录日志组件。目前有包括Symfony 、Laravel、 CakePHP等诸多知名php框架都内置了Monolog。

Monolog可以把你的日志发送到文件,sockets,收件箱,数据库和各种web服务器上。一些特殊的组件可以给你带来特殊的日志策略。

使用例子

1 2 3 4 5 6 7 8 9 10 11 12<?php use Monolog/Loggeruse Monolog/Handler/StreamHandler// create a log channel $log = new Logger('name')$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING))// add records to the log $log->addWarning('Foo')$log->addError('Bar')核心概念

每个Logger实例都有一个通道和日志处理器栈。每当你添加一条日志记录,它会被发送到日志处理器栈。 你可以创建很多Logger,每个Logger定义一个通道(db,请求,路由),每个Logger有很多日志处理器。这些通道会过滤日志。

每个日志处理器都有一个Formatter(内置的日志显示格式处理器)。你还可以设定日志级别。

日志级别

DEBUG:详细的debug信息

INFO:感兴趣的事件。像用户登录,SQL日志

NOTICE:正常但有重大意义的事件。

WARNING:发生异常,使用了已经过时的API。

ERROR:运行时发生了错误,错误需要记录下来并监视,但错误不需要立即处理。

CRITICAL:关键错误,像应用中的组件不可用。

ALETR:需要立即采取措施的错误,像整个网站挂掉了,数据库不可用。这个时候触发器会通过SMS通知你,


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9445396.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存