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:增加記憶體使用高峰時的資訊。