成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

[PHP 類庫(kù)] Monolog - Logging for PHP 5.3+

Gilbertat / 1289人閱讀

摘要:當(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、FormatterProcessor這幾個(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è)handler
phppushHandler(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ò)展handler

Monolog內(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

相關(guān)文章

  • composer

    摘要:自動(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 ...

    Miyang 評(píng)論0 收藏0
  • php-composer的安裝與使用方法(簡(jiǎn)化版)

    摘要:中文網(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...

    mikasa 評(píng)論0 收藏0
  • Composer管理PHP依賴關(guān)系

    摘要:然而各自為政的打包方式依賴關(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以上的版...

    Mertens 評(píng)論0 收藏0
  • Composer

    摘要:背景是的依賴管理工具,它涉及和,它并不是包管理器。將這樣為你解決問(wèn)題你有一個(gè)項(xiàng)目依賴于若干個(gè)庫(kù)。其中一些庫(kù)依賴于其他庫(kù)。會(huì)找出哪個(gè)版本的包需要安裝,并安裝它們將它們下載到你的項(xiàng)目中。上述條命令的作用依次是下載安裝腳本到當(dāng)前目錄。 composer背景 Composer是PHP的依賴管理工具,它涉及 packages 和 libraries,它并不是包管理器。它受到npm和bundler...

    zoomdong 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<