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