成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[PHP 類庫] Monolog - Logging for PHP 5.3+

Gilbertat / 1238人閱讀

摘要:當(dāng)你添加一條記錄時,記錄會依次通過堆棧的處理。而每個也可以決定是否把記錄傳遞到下一個堆棧里的下一個。同時我們把放在堆棧的最上面,通過設(shè)置日志等級把錯誤日志通過郵件發(fā)送出去。可以創(chuàng)建多個,每個都可以定義自己的頻道名和堆棧。

Monolog是PHP的一個日志類庫。相比于其他的日志類庫,它有以下的特點:

功能強大。可以把日志發(fā)送到文件、socket、郵箱、數(shù)據(jù)庫和各種web services。

遵循PSR3的接口規(guī)范。可以很輕易的替換成其他遵循同一規(guī)范的日志類庫。

良好的擴展性。通過Handler、FormatterProcessor這幾個接口,可以對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的堆棧。當(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會使用默認(rèn)的Formatter。

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

日志等級

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

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

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

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

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

CRITICA (500): 嚴(yán)重錯誤。

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

用法詳解 多個handler
phppushHandler(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ù)組:

phpaddInfo("Adding a new user", array("username" => "Seldaek"));
使用processor

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

phppushProcessor(function ($record) {
    $record["extra"]["dummy"] = "Hello world!";

    return $record;
});

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

頻道的使用

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

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

phppushHandler($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寫日志。

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協(xié)議的服務(wù)。

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

RedisHandler:把記錄寫進Redis。

MongoDBHandler:把記錄寫進Mongo。

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

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

更多的Handler請看 https://github.com/Seldaek/monolog#handlers。

Formatter

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

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

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

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

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

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

更多的Formatter請看 https://github.com/Seldaek/monolog#formatters。

Processor

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

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

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

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

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

更多的Processor請看 https://github.com/Seldaek/monolog#processors。

擴展handler

Monolog內(nèi)置了很多handler,但是并不是所有場景都能覆蓋到,有時需要自己去定制handler。寫一個handler并不難,只需要實現(xiàn)MonologHandlerHandlerInterface這個接口即可。

下面這個例子實現(xiàn)了把日志記錄寫到數(shù)據(jù)庫里。我們不需要把接口里的方法全部實現(xiàn)一次,可以直接使用Monolog提供的抽象類AbstractProcessingHandler進行繼承,實現(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/30255.html

相關(guān)文章

  • composer

    摘要:自動加載為了實現(xiàn)類的隨取隨用,類的命名空間定義建議遵從一定的規(guī)則。這種規(guī)則可以是某一項目組約定的。不過為了使得類庫統(tǒng)一,項目指定了一種命名空間的規(guī)范,被一些流行項目采用。用來指定在軟件包級別上區(qū)別。注意默認(rèn)類庫是使用規(guī)范自動加載的。 簡介 composer是一個php中管理依賴的工具。它使你可以在項目中聲明用到的包/庫,之后它會自動安裝相關(guān)包。 Composer is not a ...

    Miyang 評論0 收藏0
  • php-composer的安裝與使用方法(簡化版)

    摘要:中文網(wǎng)系統(tǒng)要求運行需要以上版本。注中的路徑為相對于的路徑這個時候,你就可以調(diào)用你自己編寫的函數(shù)庫或者類庫了注本文內(nèi)容參考了中文網(wǎng),后續(xù)還會更新其它的實用功能 1.簡介 Composer 是 PHP 的一個依賴管理工具。它允許你申明項目所依賴的代碼庫,它會在你的項目中為你安裝他們?!禖omposer 中文網(wǎng)》 2.系統(tǒng)要求 運行 Composer 需要 PHP 5.3.2+ 以上版本。C...

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

    摘要:然而各自為政的打包方式依賴關(guān)系的處理,導(dǎo)致了很難將兩個開源項目集成到一起。雖然有這種官方支持的包管理工具,但是依然沒有很好的統(tǒng)一的依賴關(guān)系管理的辦法。項目編譯和打包依賴關(guān)系的解決都可以很輕松的實現(xiàn)。 簡介 現(xiàn)在軟件規(guī)模越來越大,PHP項目的開發(fā)模式和許多年前已經(jīng)有了很大變化。記得初學(xué)PHP那會兒,boblog是一個很好的例子,幾乎可以代表PHP項目的開發(fā)模式。當(dāng)時PHP 5.x以上的版...

    Mertens 評論0 收藏0
  • Composer

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

    zoomdong 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<