Slim研讀筆記七亂入篇之Monolog(下)

Monolog將您的日誌發送到文件,Socket,收件箱,數據庫和各種Web服務。  特殊的處理程序允許您構建高級日誌記錄策略。

該庫實現了可以在自己的庫中提示的PSR-3接口,以保持最大的互操作性。 您也可以在您的應用程序中使用它,以確保您以後可以隨時使用其他兼容的記錄器。


核心概念

每個記錄器實例都有一個通道(名稱)和一系列處理程序。無論何時向記錄器添加記錄,它都會遍歷處理器堆棧。每個處理程序決定它是否完全處理記錄,如果是,則記錄的傳播在那裏結束。
這允許靈活的日誌記錄設置,例如在堆棧的底部有一個StreamHandler,它可以將任何東西記錄到磁盤上,最重要的是添加一個只有在記錄錯誤信息時才發送郵件的MailHandler。處理程序還有一個$ bubble屬性,它定義了是否阻止記錄,如果他們處理它。在這個例子中,將MailHandler的$ bubble參數設置爲false意味着由MailHandler處理的記錄不會再傳播到StreamHandler。
您可以創建許多記錄器,每個記錄器定義一個通道(例如:db,request,router,..),每個記錄器組合不同的處理器,可以共享或不共享。頻道反映在日誌中,並允許您輕鬆查看或過濾記錄。
每個處理程序也有一個格式化程序,一個默認的設置,如果你沒有設置一個有意義的將被創建。格式化程序對輸入記錄進行歸一化和格式化,以便處理程序可以使用它們輸出有用的信息。

自定義嚴重性級別不可用。只有八個RFC 5424級別(調試,信息,通知,警告,錯誤,關鍵,警報,緊急)出現在基本的過濾目的中,但是對於需要靈活性的排序和其他用例,您應該將處理器添加到記錄器可以在處理之前向記錄添加額外的信息(tags, user ip, ..)。


定製日誌格式

Monolog支持RFC 5424中描述的日誌記錄級別。
調試(100):詳細的調試信息。
信息(200):有趣的事件。 示例:用戶登錄,SQL日誌。
通知(250):正常但重要的事件。
警告(300):特殊事件不是錯誤。 示例:使用已棄用的API,糟糕的API使用,不期望的事情不一定是錯誤的。
錯誤(400):運行時錯誤,不需要立即採取行動,但通常應該被記錄和監視。
關鍵(500):關鍵條件。 示例:應用程序組件不可用,意外異常。
警告(550):必須立即採取行動。 例如:整個網站關閉,數據庫不可用等。這應該會觸發SMS警報並喚醒您。

緊急(600):緊急:系統不可用。


配置記錄器

這裏是一個基本的設置,記錄到一個文件和firephp,並使用DEBUG級別:

<?php

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

// Create the logger
$logger = new Logger('my_logger');
// Now add some handlers
$logger->pushHandler(new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG));
$logger->pushHandler(new FirePHPHandler());

// You can now use your logger
$logger->info('My logger is now ready');

我們來解釋一下。 第一步是創建將在您的代碼中使用的記錄器實例。 參數是一個通道名稱,當您使用多個記錄器時,該名稱很有用(請參閱下面有關它的更多詳細信息)。
記錄器本身不知道如何處理記錄。 它委託給一些處理程序。 上面的代碼在堆棧中註冊了兩個處理程序,以允許以兩種不同的方式處理記錄。

請注意,FirePHPHandler首先被調用,因爲它被添加到堆棧頂部。 這允許您臨時添加一個禁用冒泡的記錄器,如果您想覆蓋其他配置的記錄器。


在記錄中添加額外的數據

Monolog提供了兩種不同的方式來在簡單的文本消息中添加額外的信息。

使用日誌上下文

第一種方法是上下文,允許傳遞記錄中的數據:
<?php

$logger->info('Adding a new user', array('username' => 'Seldaek'));
簡單的處理程序(例如StreamHandler)將簡單地將數組格式化爲字符串,但更豐富的處理程序可以利用上下文(例如FirePHP能夠以相當的方式顯示數組)。

使用處理器

第二種方法是使用處理器爲所有記錄添加額外的數據。處理器可以是任何可調用的。他們將得到的記錄作爲參數,必須在最終改變額外的部分後返回。讓我們編寫一個處理器,在記錄中添加一些虛擬數據:

<?php

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

    return $record;
});

Monolog提供了一些可以在您的項目中使用的內置處理器。看看列表的專用章節。

提示:處理器也可以在特定的處理程序而不是記錄器上註冊,僅適用於此處理程序。


使用通道

通道是確定記錄與哪個應用程序相關的一個很好的方法。這在大型應用程序中很有用(在Symfony2中由MonologBundle使用)。

圖片兩個記錄器共享一個處理程序,寫入單個日誌文件。頻道將允許您識別發佈每條記錄的記錄器。您可以輕鬆地通過過濾這個或那個通道的日誌文件。

<?php

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

// Create some handlers
$stream = new StreamHandler(__DIR__.'/my_app.log', Logger::DEBUG);
$firephp = new FirePHPHandler();

// Create the main logger of the app
$logger = new Logger('my_logger');
$logger->pushHandler($stream);
$logger->pushHandler($firephp);

// Create a logger for the security-related stuff with a different channel
$securityLogger = new Logger('security');
$securityLogger->pushHandler($stream);
$securityLogger->pushHandler($firephp);

// Or clone the first one to only change the channel
$securityLogger = $logger->withName('security');

定製日誌格式

在Monolog中,很容易定製寫入文件,套接字,郵件,數據庫和其他處理程序的日誌格式。大多數處理程序使用

$record['formatted']

值自動放入日誌設備。該值取決於格式化程序設置。您可以在預定義的格式器類中進行選擇,也可以編寫自己的格式器(例如,用於可讀輸出的多行文本文件)。

要配置預定義的格式化類,只需將其設置爲處理程序的字段即可:

// 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);

您也可以在多個處理程序之間重用相同的格式化程序,並在多個記錄程序之間共享這些處理程序。







發佈了47 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章