Monolog-PHP日志

Monolog是php下比較全又容易擴展的記錄日志類庫。目前有包括Symfony 、Laravel、 CakePHP等諸多知名php框架都內(nèi)置了Monolog。Monolog可以把你的日志發(fā)送到文件,sockets,收件箱,數(shù)據(jù)庫和各種web services。

Monolog遵循PSR3的接口規(guī)范,可以很輕易的替換成其他遵循同一規(guī)范的日志類庫。Monolog具有良好的擴展性,通過Handler、Formatter和Processor這幾個接口,可以對Monolog類庫進行各種擴展和自定義。

基本用法

可以通過github或者composer安裝Monolog,以下是使用composer安裝最新版本:

composer require monolog/monolog

要求PHP版本為5.3以上。

<?php 
use Monolog\Logger; 
use Monolog\Handler\StreamHandler; 
 
// 創(chuàng)建日志頻道 
$log = new Logger('name'); 
$log->pushHandler(new StreamHandler('path/to/your.log', Logger::WARNING)); 
 
// 添加日志記錄 
$log->addWarning('Foo'); 
$log->addError('Bar');

核心概念

每一個Logger實例都包含一個頻道名(channel)和handler的堆棧。當(dāng)你添加一條記錄時,記錄會依次通過handler堆棧的處理。而每個handler也可以決定是否把記錄傳遞到下一個堆棧里的下一個handler。

通過handler,我們可以實現(xiàn)一些復(fù)雜的日志操作。例如我們把StreamHandler放在堆棧的最下面,那么所有的日志記錄最終都會寫到硬盤文件里。同時我們把MailHandler放在堆棧的最上面,通過設(shè)置日志等級把錯誤日志通過郵件發(fā)送出去。Handler里有個$bubble屬性,這個屬性定義了handler是否攔截記錄不讓它流到下一個handler。所以如果我們把MailHandler的$bubble參數(shù)設(shè)置為false,則出現(xiàn)錯誤日志時,日志會通過MailHandler發(fā)送出去,而不會經(jīng)過StreamHandler寫到硬盤上。

Logger可以創(chuàng)建多個,每個都可以定義自己的頻道名和handler堆棧。handler可以在多個Logger中共享。頻道名會反映在日志里,方便我們查看和過濾日志記錄。

如果沒有指定日志格式(Formatter),Handler會使用默認的Formatter。

日志的等級不能自定義,目前使用的是RFC 5424里定義的8個等級:debug、info、notice、warning、error、critical、alert和emergency。如果對日志記錄有其他的需求,可以通過Processo對日志記錄添加內(nèi)容。

日志等級

DEBUG (100): 詳細的debug信息。

INFO (200): 關(guān)鍵事件。

NOTICE (250): 普通但是重要的事件。

WARNING (300): 出現(xiàn)非錯誤的異常。

ERROR (400): 運行時錯誤,但是不需要立刻處理。

CRITICA (500): 嚴重錯誤。

EMERGENCY (600): 系統(tǒng)不可用。

用法詳解

多個handler

<?php 
 
use Monolog\Logger; 
use Monolog\Handler\StreamHandler; 
use Monolog\Handler\FirePHPHandler; 
 
// 創(chuàng)建Logger實例 
$logger = new Logger('my_logger'); 
// 添加handler 
$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG)); 
$logger->pushHandler(new FirePHPHandler()); 
 
// 開始使用 
$logger->addInfo('My logger is now ready');

第一步我們先創(chuàng)建一個Logger實例,傳入的是頻道名,這個頻道名可以用于區(qū)分多個Logger實例。

實例本身并不知道如何處理日志記錄,它是通過handler進行處理的。handler可以設(shè)置多個,例如上面的例子設(shè)置了兩個handler,可以對日志記錄進行兩種不同方式的處理。

需要注意的是,由于handler是采用堆棧的方式保存,所以后面添加的handler位于棧頂,會首先被調(diào)用。

添加額外的數(shù)據(jù)

Monolog有兩種方式對日志添加額外的信息。

第一個方法是使用上下文,使用$context參數(shù),傳入一個數(shù)組:

<?php 
$logger->addInfo('Adding a new user', array('username' => 'Seldaek'));

第二個方法是使用processor。processor可以是任何可調(diào)用的方法,這些方法把日志記錄作為參數(shù),然后經(jīng)過處理修改extra部分后返回。

<?php 
$logger->pushProcessor(function ($record) { 
    $record['extra']['dummy'] = 'Hello world!'; 
 
    return $record; 
});

Processor不一定要綁定在Logger實例上,也可以綁定到某個具體的handler上。使用handler實例的pushProcessor方法進行綁定。

頻道的使用

使用頻道名可以對日志進行分類,這在大型的應(yīng)用上是很有用的。通過頻道名,可以很容易的對日志記錄進行刷選。

例如我們想在同一個日志文件里記錄不同模塊的日志,我們可以把相同的handler綁定到不同的Logger實例上,這些實例使用不同的頻道名:

<?php 

use Monolog\Logger; 
use Monolog\Handler\StreamHandler; 
use Monolog\Handler\FirePHPHandler; 

// 創(chuàng)建handler 
$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG); 
$firephp = new FirePHPHandler(); 

// 創(chuàng)建應(yīng)用的主要logger 
$logger = new Logger('my_logger'); 
$logger->pushHandler($stream); 
$logger->pushHandler($firephp); 

// 通過不同的頻道名創(chuàng)建一個用于安全相關(guān)的logger 
$securityLogger = new Logger('security'); 
$securityLogger->pushHandler($stream); 
$securityLogger->pushHandler($firephp);

Handler

Monolog內(nèi)置很多很實用的handler,它們幾乎囊括了各種的使用場景,這里介紹一些使用的:

  • StreamHandler:把記錄寫進PHP流,主要用于日志文件。

  • SyslogHandler:把記錄寫進syslog。

  • ErrorLogHandler:把記錄寫進PHP錯誤日志。

  • NativeMailerHandler:使用PHP的mail()函數(shù)發(fā)送日志記錄。

  • SocketHandler:通過socket寫日志。

<?php 

use Monolog\Logger; 
use Monolog\Handler\SocketHandler; 

// Create the logger 
$logger = new Logger('my_logger'); 

// Create the handler 
$handler = new SocketHandler('unix:///var/log/httpd_app_log.socket'); 
$handler->setPersistent(true); 

// Now add the handler 
$logger->pushHandler($handler, Logger::DEBUG); 

// You can now use your logger 
$logger->addInfo('My logger is now ready');
    
  • AmqpHandler:把記錄寫進兼容amqp協(xié)議的服務(wù)。

  • BrowserConsoleHandler:把日志記錄寫到瀏覽器的控制臺。由于是使用瀏覽器的console對象,需要看瀏覽器是否支持。

  • RedisHandler:把記錄寫進Redis。

  • MongoDBHandler:把記錄寫進Mongo。

  • ElasticSearchHandler:把記錄寫到ElasticSearch服務(wù)。

  • BufferHandler:允許我們把日志記錄緩存起來一次性進行處理。

Formatter

同樣的,這里介紹幾個自帶的Formatter:

  • LineFormatter:把日志記錄格式化成一行字符串。

  • HtmlFormatter:把日志記錄格式化成HTML表格,主要用于郵件。

  • JsonFormatter:把日志記錄編碼成JSON格式。

  • LogstashFormatter:把日志記錄格式化成logstash的事件JSON格式。

  • ElasticaFormatter:把日志記錄格式化成ElasticSearch使用的數(shù)據(jù)格式。

Processor

前面說過,Processor可以為日志記錄添加額外的信息,Monolog也提供了一些很實用的processor:

  • IntrospectionProcessor:增加當(dāng)前腳本的文件名和類名等信息。

  • WebProcessor:增加當(dāng)前請求的URI、請求方法和訪問IP等信息。

  • MemoryUsageProcessor:增加當(dāng)前內(nèi)存使用情況信息。

  • MemoryPeakUsageProcessor:增加內(nèi)存使用高峰時的信息。

更多有關(guān)Monolog的信息,請參照Monolog官網(wǎng):https://github.com/Seldaek/monolog

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容