摘要:當你添加一條記錄時,記錄會依次通過堆棧的處理。而每個也可以決定是否把記錄傳遞到下一個堆棧里的下一個。同時我們把放在堆棧的最上面,通過設置日志等級把錯誤日志通過郵件發送出去。可以創建多個,每個都可以定義自己的頻道名和堆棧。
Monolog是PHP的一個日志類庫。相比于其他的日志類庫,它有以下的特點:
功能強大。可以把日志發送到文件、socket、郵箱、數據庫和各種web services。
遵循PSR3的接口規范。可以很輕易的替換成其他遵循同一規范的日志類庫。
良好的擴展性。通過Handler、Formatter和Processor這幾個接口,可以對Monolog類庫進行各種擴展和自定義。
基本用法安裝最新版本:
composer require monolog/monolog
要求PHP版本為5.3以上。
phppushHandler(new StreamHandler("path/to/your.log", Logger::WARNING)); // 添加日志記錄 $log->addWarning("Foo"); $log->addError("Bar");核心概念
每一個Logger實例都包含一個頻道名(channel)和handler的堆棧。當你添加一條記錄時,記錄會依次通過handler堆棧的處理。而每個handler也可以決定是否把記錄傳遞到下一個堆棧里的下一個handler。
通過handler,我們可以實現一些復雜的日志操作。例如我們把StreamHandler放在堆棧的最下面,那么所有的日志記錄最終都會寫到硬盤文件里。同時我們把MailHandler放在堆棧的最上面,通過設置日志等級把錯誤日志通過郵件發送出去。Handler里有個$bubble屬性,這個屬性定義了handler是否攔截記錄不讓它流到下一個handler。所以如果我們把MailHandler的$bubble參數設置為false,則出現錯誤日志時,日志會通過MailHandler發送出去,而不會經過StreamHandler寫到硬盤上。
Logger可以創建多個,每個都可以定義自己的頻道名和handler堆棧。handler可以在多個Logger中共享。頻道名會反映在日志里,方便我們查看和過濾日志記錄。
如果沒有指定日志格式(Formatter),Handler會使用默認的Formatter。
日志的等級不能自定義,目前使用的是RFC 5424里定義的8個等級:debug、info、notice、warning、error、critical、alert和emergency。如果對日志記錄有其他的需求,可以通過Processo對日志記錄添加內容。
日志等級DEBUG (100): 詳細的debug信息。
INFO (200): 關鍵事件。
NOTICE (250): 普通但是重要的事件。
WARNING (300): 出現非錯誤的異常。
ERROR (400): 運行時錯誤,但是不需要立刻處理。
CRITICA (500): 嚴重錯誤。
EMERGENCY (600): 系統不可用。
用法詳解 多個handlerphppushHandler(new StreamHandler(__DIR__."/my_app.log", Logger::DEBUG)); $logger->pushHandler(new FirePHPHandler()); // 開始使用 $logger->addInfo("My logger is now ready");
第一步我們先創建一個Logger實例,傳入的是頻道名,這個頻道名可以用于區分多個Logger實例。
實例本身并不知道如何處理日志記錄,它是通過handler進行處理的。handler可以設置多個,例如上面的例子設置了兩個handler,可以對日志記錄進行兩種不同方式的處理。
需要注意的是,由于handler是采用堆棧的方式保存,所以后面添加的handler位于棧頂,會首先被調用。
添加額外的數據Monolog有兩種方式對日志添加額外的信息。
使用上下文第一個方法是使用$context參數,傳入一個數組:
phpaddInfo("Adding a new user", array("username" => "Seldaek"));使用processor
第二個方法是使用processor。processor可以是任何可調用的方法,這些方法把日志記錄作為參數,然后經過處理修改extra部分后返回。
phppushProcessor(function ($record) { $record["extra"]["dummy"] = "Hello world!"; return $record; });
Processor不一定要綁定在Logger實例上,也可以綁定到某個具體的handler上。使用handler實例的pushProcessor方法進行綁定。
頻道的使用使用頻道名可以對日志進行分類,這在大型的應用上是很有用的。通過頻道名,可以很容易的對日志記錄進行刷選。
例如我們想在同一個日志文件里記錄不同模塊的日志,我們可以把相同的handler綁定到不同的Logger實例上,這些實例使用不同的頻道名:
phppushHandler($stream); $logger->pushHandler($firephp); // 通過不同的頻道名創建一個用于安全相關的logger $securityLogger = new Logger("security"); $securityLogger->pushHandler($stream); $securityLogger->pushHandler($firephp);Handler
Monolog內置很多很實用的handler,它們幾乎囊括了各種的使用場景,這里介紹一些使用的:
StreamHandler:把記錄寫進PHP流,主要用于日志文件。
SyslogHandler:把記錄寫進syslog。
ErrorLogHandler:把記錄寫進PHP錯誤日志。
NativeMailerHandler:使用PHP的mail()函數發送日志記錄。
SocketHandler:通過socket寫日志。
phpsetPersistent(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協議的服務。
BrowserConsoleHandler:把日志記錄寫到瀏覽器的控制臺。由于是使用瀏覽器的console對象,需要看瀏覽器是否支持。
RedisHandler:把記錄寫進Redis。
MongoDBHandler:把記錄寫進Mongo。
ElasticSearchHandler:把記錄寫到ElasticSearch服務。
BufferHandler:允許我們把日志記錄緩存起來一次性進行處理。
更多的Handler請看 https://github.com/Seldaek/monolog#handlers。
Formatter同樣的,這里介紹幾個自帶的Formatter:
LineFormatter:把日志記錄格式化成一行字符串。
HtmlFormatter:把日志記錄格式化成HTML表格,主要用于郵件。
JsonFormatter:把日志記錄編碼成JSON格式。
LogstashFormatter:把日志記錄格式化成logstash的事件JSON格式。
ElasticaFormatter:把日志記錄格式化成ElasticSearch使用的數據格式。
更多的Formatter請看 https://github.com/Seldaek/monolog#formatters。
Processor前面說過,Processor可以為日志記錄添加額外的信息,Monolog也提供了一些很實用的processor:
IntrospectionProcessor:增加當前腳本的文件名和類名等信息。
WebProcessor:增加當前請求的URI、請求方法和訪問IP等信息。
MemoryUsageProcessor:增加當前內存使用情況信息。
MemoryPeakUsageProcessor:增加內存使用高峰時的信息。
更多的Processor請看 https://github.com/Seldaek/monolog#processors。
擴展handlerMonolog內置了很多handler,但是并不是所有場景都能覆蓋到,有時需要自己去定制handler。寫一個handler并不難,只需要實現MonologHandlerHandlerInterface這個接口即可。
下面這個例子實現了把日志記錄寫到數據庫里。我們不需要把接口里的方法全部實現一次,可以直接使用Monolog提供的抽象類AbstractProcessingHandler進行繼承,實現里面的write方法即可。
phppdo = $pdo; parent::__construct($level, $bubble); } protected function write(array $record) { if (!$this->initialized) { $this->initialize(); } $this->statement->execute(array( "channel" => $record["channel"], "level" => $record["level"], "message" => $record["formatted"], "time" => $record["datetime"]->format("U"), )); } private function initialize() { $this->pdo->exec( "CREATE TABLE IF NOT EXISTS monolog " ."(channel VARCHAR(255), level INTEGER, message LONGTEXT, time INTEGER UNSIGNED)" ); $this->statement = $this->pdo->prepare( "INSERT INTO monolog (channel, level, message, time) VALUES (:channel, :level, :message, :time)" ); } }
然后我們就可以使用它了:
phppushHandler(new PDOHandler(new PDO("sqlite:logs.sqlite")); // You can now use your logger $logger->addInfo("My logger is now ready");參考
https://github.com/Seldaek/monolog
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/30255.html
摘要:中文網系統要求運行需要以上版本。注中的路徑為相對于的路徑這個時候,你就可以調用你自己編寫的函數庫或者類庫了注本文內容參考了中文網,后續還會更新其它的實用功能 1.簡介 Composer 是 PHP 的一個依賴管理工具。它允許你申明項目所依賴的代碼庫,它會在你的項目中為你安裝他們。《Composer 中文網》 2.系統要求 運行 Composer 需要 PHP 5.3.2+ 以上版本。C...
摘要:然而各自為政的打包方式依賴關系的處理,導致了很難將兩個開源項目集成到一起。雖然有這種官方支持的包管理工具,但是依然沒有很好的統一的依賴關系管理的辦法。項目編譯和打包依賴關系的解決都可以很輕松的實現。 簡介 現在軟件規模越來越大,PHP項目的開發模式和許多年前已經有了很大變化。記得初學PHP那會兒,boblog是一個很好的例子,幾乎可以代表PHP項目的開發模式。當時PHP 5.x以上的版...
閱讀 3145·2021-11-22 12:01
閱讀 3767·2021-08-30 09:46
閱讀 783·2019-08-30 13:48
閱讀 3209·2019-08-29 16:43
閱讀 1657·2019-08-29 16:33
閱讀 1847·2019-08-29 13:44
閱讀 1410·2019-08-26 13:45
閱讀 2228·2019-08-26 11:44