1.核心概念
每个logger实例都有一个通道和日志处理栈,当你向logger添加一条记录时,它会开始遍历处理栈直到被完全处理。
这样提供了很灵活的记录步骤:例如在栈底的StreamHandler类将记录所有的信息到磁盘,在这个类上面添加一个MailHandler的类,其将在记录下一个ERROR日志时发送邮件。处理类同时还有一个bubble属性,它定义了该类在处理记录时是否阻止了它向下传递。在本例子中,将MailHandler的bubble属性置false意味着被该类处理的记录将不会再向StreamHandler传递。
你可以建立许多的Logger,每个都定义了一个通道,每个都有各种可被共享的处理器。
同时每个logger还有一个带默认值的Formmater,用来定义记录日志的格式
2.日志等级
monolog定义了多个日志等级:DEBUG(100)~~~等
3.配置一个日志
下面是一个记录日志文件基础的步骤
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\FirePHPHandler;
// 创建一个Logger
$logger = new Logger('my_logger');
// 添加一些日志处理类
$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG));
$logger->pushHandler(new FirePHPHandler());
// 使用你的Logger
$logger->addInfo('My logger is now ready');
第一步是建立你要使用的Logger(参数是通道的名字),Logger类自己并不知道如何处理一条记录,而是依赖于一些Handler,
文的代码中注册了两个处理器到处理栈中,以便于通过两种不同的方式来处理一条记录。
注意:FirePHPHandler先被调用,因为它被添加到了栈的上面。
3.向记录中添加额外的数据
3.1 第一个方式是使用日志上下文。在记录中以数组的形式传递数据:
<?php
$logger->addInfo('Adding a new user', array('username' => 'Seldaek'));
3.2 第二个方式是使用processor
<?php
$logger->pushProcessor(function ($record) {
$record['extra']['dummy'] = 'Hello world!';
return $record;
});
monolog提供了一些内置的Processor。
4.交互通道
当两个通道共用一个Handler,在用这个Handler记录日志时,使用通道能够让我们识别出是那个logger处理的。我们可以在简单的在这个文件中过滤这个或者那个通道。
<?php
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
use Monolog\Handler\FirePHPHandler;
// 创建一些处理类
$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
$firephp = new FirePHPHandler();
// 为应用创建主要的log
$logger = new Logger('my_logger');
$logger->pushHandler($stream);
$logger->pushHandler($firephp);
//用另外的通道创建一个安全相关材料的log
$securityLogger = new Logger('security');
$securityLogger->pushHandler($stream);
$securityLogger->pushHandler($firephp);
//或者通过克隆一个之前的log改变通道的名字
$securityLogger = $logger->withName('security');
5.定制日志格式
大多数处理器使用$record[‘formatted’]的值来自动作为记录策略,这个值依赖fomatter的设定
// the default date format is "Y-m-d H:i:s"
$dateFormat = "Y n j, g:i a";
// the default output format is "[%datetime%] %channel%.%level_name%: %message% %context% %extra%\n"
$output = "%datetime% > %level_name% > %message% %context% %extra%\n";
// finally, create a formatter
$formatter = new LineFormatter($output, $dateFormat);
// Create a handler
$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
$stream->setFormatter($formatter);
// bind it to a logger object
$securityLogger = new Logger('security');
$securityLogger->pushHandler($stream);
formatter 是可以在N个 Handler 之间复用的,并且可在N个 Logger 之间共享 Handler。
Monolog内置很多很实用的handler,它们几乎囊括了各种的使用场景,这里介绍一些使用的:
StreamHandler:把记录写进PHP流,主要用于日志文件。
SyslogHandler:把记录写进syslog。
ErrorLogHandler:把记录写进PHP错误日志。
NativeMailerHandler:使用PHP的mail()函数发送日志记录。
SocketHandler:通过socket写日志。
AmqpHandler:把记录写进兼容amqp协议的服务。
BrowserConsoleHandler:把日志记录写到浏览器的控制台。由于是使用浏览器的console对象,需要看浏览器是否支持。
RedisHandler:把记录写进Redis。
MongoDBHandler:把记录写进Mongo。
ElasticSearchHandler:把记录写到ElasticSearch服务。
BufferHandler:允许我们把日志记录缓存起来一次性进行处理
同样的,这里介绍几个自带的Formatter:
LineFormatter:把日志记录格式化成一行字符串。
HtmlFormatter:把日志记录格式化成HTML表格,主要用于邮件。
JsonFormatter:把日志记录编码成JSON格式。
LogstashFormatter:把日志记录格式化成logstash的事件JSON格式。
ElasticaFormatter:把日志记录格式化成ElasticSearch使用的数据格式。
Processor
前面说过,Processor可以为日志记录添加额外的信息,Monolog也提供了一些很实用的processor:
IntrospectionProcessor:增加当前脚本的文件名和类名等信息。
WebProcessor:增加当前请求的URI、请求方法和访问IP等信息。
MemoryUsageProcessor:增加当前内存使用情况信息。
MemoryPeakUsageProcessor:增加内存使用高峰时的信息。