
值得一提的是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通知你,
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)