天天看點

monolog文檔解讀

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

php