【PHP系列】PHP推薦標準之PSR-3,日誌記錄器介面

来源:http://www.cnblogs.com/riverdubu/archive/2017/02/25/6440596.html
-Advertisement-
Play Games

上節聊完了PHP官方的相關代碼規範,下麵給大家帶來了PHP系列的PHP推薦標準的另外兩個,PSR-3,PSR-4。 首先,我們先來瞭解下PSR-3是怎麼回事。 PHP-FIG發佈的第三個推薦規範與前兩個不同,不是一系列的指導方針,而是一個介面,規定PHP日誌記錄器組件可以實現的方法。 基礎 The  ...


上節聊完了PHP官方的相關代碼規範,下麵給大家帶來了PHP系列的PHP推薦標準的另外兩個,PSR-3,PSR-4。

首先,我們先來瞭解下PSR-3是怎麼回事。

PHP-FIG發佈的第三個推薦規範與前兩個不同,不是一系列的指導方針,而是一個介面,規定PHP日誌記錄器組件可以實現的方法。

基礎

The LoggerInterface exposes eight methods to write logs to the eight RFC 5424levels (debug, info, notice, warning, error, critical, alert, emergency).

<?php

namespace Psr\Log;

/**
 * Describes a logger instance
 *
 * The message MUST be a string or object implementing __toString().
 *
 * The message MAY contain placeholders in the form: {foo} where foo
 * will be replaced by the context data in key "foo".
 *
 * The context array can contain arbitrary data, the only assumption that
 * can be made by implementors is that if an Exception instance is given
 * to produce a stack trace, it MUST be in a key named "exception".
 *
 * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md
 * for the full interface specification.
 */
interface LoggerInterface
{
    /**
     * System is unusable.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function emergency($message, array $context = array());

    /**
     * Action must be taken immediately.
     *
     * Example: Entire website down, database unavailable, etc. This should
     * trigger the SMS alerts and wake you up.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function alert($message, array $context = array());

    /**
     * Critical conditions.
     *
     * Example: Application component unavailable, unexpected exception.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function critical($message, array $context = array());

    /**
     * Runtime errors that do not require immediate action but should typically
     * be logged and monitored.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function error($message, array $context = array());

    /**
     * Exceptional occurrences that are not errors.
     *
     * Example: Use of deprecated APIs, poor use of an API, undesirable things
     * that are not necessarily wrong.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function warning($message, array $context = array());

    /**
     * Normal but significant events.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function notice($message, array $context = array());

    /**
     * Interesting events.
     *
     * Example: User logs in, SQL logs.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function info($message, array $context = array());

    /**
     * Detailed debug information.
     *
     * @param string $message
     * @param array $context
     * @return null
     */
    public function debug($message, array $context = array());

    /**
     * Logs with an arbitrary level.
     *
     * @param mixed $level
     * @param string $message
     * @param array $context
     * @return null
     */
    public function log($level, $message, array $context = array());
}

A ninth method, log, accepts a log level as the first argument. Calling this method with one of the log level constants MUST have the same result as calling the level-specific method.

Message參數

1、Every method accepts a string as the message, or an object with a__toString() method. Implementors MAY have special handling for the passed objects. If that is not the case, implementors MUST cast it to a string.

2、The message MAY contain placeholders which implementors MAY replace with values from the context array.

Placeholder names MUST correspond to keys in the context array.

Implementors MAY use placeholders to implement various escaping strategies and translate logs for display. Users SHOULD NOT pre-escape placeholder values since they can not know in which context the data will be displayed.

總的來講,占位符是為後面的Context參數提供占位服務,$context參數用於構造複雜的日誌消息,$context參數的值是一個關聯數組,鍵是占位符的名稱(不能有花括弧),對應的值用於替換Message參數中的占位符

The following is an example implementation of placeholder interpolation provided for reference purposes only:

/**
 * Interpolates context values into the message placeholders.
 */
function interpolate($message, array $context = array())
{
    // build a replacement array with braces around the context keys
    $replace = array();
    foreach ($context as $key => $val) {
        // check that the value can be casted to string
        if (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {
            $replace['{' . $key . '}'] = $val;
        }
    }

    // interpolate replacement values into the message and return
    return strtr($message, $replace);
}

// a message with brace-delimited placeholder names
$message = "User {username} created";

// a context array of placeholder names => replacement values
$context = array('username' => 'bolivar');

// echoes "User bolivar created"
echo interpolate($message, $context);

Context參數

1、Every method accepts an array as context data. This is meant to hold any extraneous information that does not fit well in a string.

2、If an Exception object is passed in the context data, it MUST be in the'exception' key.

這個參數是可選的,提供用於替換message參數中的占位標記的值。

輔助類和介面

1、The Psr\Log\AbstractLogger class lets you implement the LoggerInterface very easily by extending it and implementing the generic log method. The other eight methods are forwarding the message and context to it.

2、Similarly, using the Psr\Log\LoggerTrait only requires you to implement the generic log method. Note that since traits can not implement interfaces, in this case you still have to implement LoggerInterface.

3、The Psr\Log\NullLogger is provided together with the interface. It MAY be used by users of the interface to provide a fall-back “black hole” implementation if no logger is given to them. However, conditional logging may be a better approach if context data creation is expensive.

4、The Psr\Log\LoggerAwareInterface only contains a setLogger(LoggerInterface $logger) method and can be used by frameworks to auto-wire arbitrary instances with a logger.

<?php

namespace Psr\Log;

/**
 * Describes a logger-aware instance
 */
interface LoggerAwareInterface
{
    /**
     * Sets a logger instance on the object
     *
     * @param LoggerInterface $logger
     * @return null
     */
    public function setLogger(LoggerInterface $logger);
}

5、The Psr\Log\LoggerAwareTrait trait can be used to implement the equivalent interface easily in any class. It gives you access to $this->logger.

6、The Psr\Log\LogLevel class holds constants for the eight log levels.

<?php

namespace Psr\Log;

/**
 * Describes log levels
 */
class LogLevel
{
    const EMERGENCY = 'emergency';
    const ALERT     = 'alert';
    const CRITICAL  = 'critical';
    const ERROR     = 'error';
    const WARNING   = 'warning';
    const NOTICE    = 'notice';
    const INFO      = 'info';
    const DEBUG     = 'debug';
}

總結

如果你想自己寫個PSR-3日誌記錄器,那可沒什麼必要了,因為已經有很多人乾過這件事了。

如果你正在使用Yii2.0框架寫代碼,你可以搜索下Logger.php這個文件,已經實現的非常好了。你需要做的只是一句簡單的:

Yii::info($message, $category);

即可,後面我會帶大家討論更多框架的事。

如果你不適用框架,楓爺這裡給大家推薦一個很好的組件:monolog/monolog。

Monolog已經完全實現了PSR-3的介面,而且便於使用自定義的消息格式化程式和處理程式擴展功能。

如果大家對monolog感興趣,可以去到他的官網進行查看,http://monolog.ow2.org/doc/index.html。

有了日誌收集功能,如何進行日誌的篩選,日誌的盤查啥的,楓爺再推薦大家一款非常好用的軟體,splunk,免費500M,超過部分要收錢,當然了,國人不會放過任何領域的,如果要免費,那就用用日誌易吧,我就用的他,感覺不錯的。

splunk:http://10data.com/splunk/

日誌易:https://www.rizhiyi.com/

至於怎麼用,大家可以先行去他們的官網先行瞭解,以後有機會,楓爺再教大家搭建日誌平臺的相關知識。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 引入線程池的原因 通常我們需要使用線程去完成某項任務的時候都會去創建一個線程,一般都會這麼寫: 這樣操作直接且簡單,當然是沒有錯的,但是卻存在這一些問題。在應付一些線程併發不多的情況時是完全夠用的,但是如果併發的線程數量很多,就會造成系統的效率降低。主要會造成如下影響: 頻繁創建和銷毀線程占用大量不 ...
  • 運算符優先順序: siwtch語句註意事項: for迴圈 continue :跳過迴圈體中剩餘的語句執行下一次迴圈 break:退出指定的迴圈,直接執行迴圈後面的代碼 使用Scanner工具類來獲取用戶輸入的信息 示例:接收3個班級各4名學生的成績,計算每個班級的學生的平均分並列印出來。 ...
  • 隱藏細節 現實生活中有很多隱藏細節的案例,比如我們平時用的電腦,當我們按電源按鈕後電腦就自動開始啟動了,對用戶來講很簡單隻需要知道按按鈕就行。但電腦內部的工作原理其實是很複雜的一個流程,這裡不多說。 如果不隱藏細節會怎樣? 我想可能的結果就是電腦只能是特別特別的專業人員才能操作,永遠無法像現在一樣成 ...
  • Hibernate學習筆記1 本筆記學習自 "Hibernate官方文檔" 。 1. Architecture(總體結構) 俗話說有圖有真相,先看一張圖: 上圖清楚地描述了Hibernate在一個Java應用中所處的位置:位於 Data Access Layer(數據訪問層) 和 Relation ...
  • PHP 中 include 與 require Php include (或 require)語句會獲取指定文件中存在的所有文本/代碼/標記,並複製到使用 include 語句的文件中。 這意味著您可以為所有頁面創建標準頁頭、頁腳或者菜單文件。然後,在頁頭需要更新時,您只需更新這個頁頭包含文件即可。 ...
  • (原創,未經允許不得轉載) 經典的八皇後問題 題目: 八皇後問題就是在8*8的棋盤上放置8個皇後,使其任意兩個不在同一行、同一列、同一斜線上。 解題思路: 去掉行這個因素,然後去考慮是否在同一列或同一斜線上。每個擺放成功的棋子在(i,x[i]),然後設置當前行,然後在該行從第一列一直試探到第8列,看 ...
  • 一、Solr官網下載http://lucene.apache.org/solr/下載Solr項目文件 在該項目文件中,可以找到我們在本地環境下運行Solr伺服器所需要的資源文件,在這裡我們以4.10.3為例, 在dist目錄下我們可以得到solr-4.10.3.war文件,該war包目前在Tomca ...
  • 第一章總結: 1.java的是sun公司(現甲骨文有限公司)於1995年推出的高級編程語言,java技術可以應用在幾乎所有類型和規模的設備上,小到電腦晶元、蜂窩電話,大到超級電腦,無所不在。 2.在當前的軟體開發行業中,java已經成為了絕對的主流,java領域的java SE、java EE已 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...