PSR 規範 PSR 3 日誌介面規範

2021-07-22 10:35:51 字數 4242 閱讀 7435

本文制定了日誌類庫的通用介面規範。

本規範的主要目的,是為了讓日誌類庫以簡單通用的方式,通過接收乙個 psr\log\loggerinte***ce 物件,來記錄日誌資訊。 框架以及cms內容管理系統如有需要,可以 對此介面進行擴充套件,但需遵循本規範, 這才能保證在使用第三方的類庫檔案時,日誌介面仍能正常對接。

為了避免歧義,文件大量使用了「能願動詞」,對應的解釋如下:

必須 (must):絕對,嚴格遵循,請照做,無條件遵守;

一定不可 (must not):禁令,嚴令禁止;

應該 (should) :強烈建議這樣做,但是不強求;

不該 (should not):強烈不建議這樣做,但是不強求;

可以 (may) 和 可選 (optional) :選擇性高一點,在這個文件內,此詞語使用較少;

參見:rfc 2119

loggerinte***ce 介面對外定義了八個方法,分別用來記錄 rfc 5424 中定義的八個等級的日誌:debug、 info、 notice、 warning、 error、 critical、 alert 以及 emergency 。

第九個方法 —— log,其第乙個引數為記錄的等級。可使用乙個預先定義的等級常量作為引數來呼叫此方法,必須 與直接呼叫以上八個方法具有相同的效果。如果傳入的等級常量引數沒有預先定義,則 必須 丟擲 psr\log\invalidargumentexception 型別的異常。在不確定的情況下,使用者 不該 使用未支援的等級常量來呼叫此方法。

以上每個方法都接受乙個字串型別或者是有 __tostring() 方法的物件作為記錄資訊引數,這樣,實現者就能把它當成字串來處理,否則實現者 必須 自己把它轉換成字串。

記錄資訊引數 可以 攜帶佔位符,實現者 可以 根據上下文將其它替換成相應的值。

其中佔位符 必須 與上下文陣列中的鍵名保持一致。

佔位符的名稱 必須 由乙個左花括號 包含。但花括號與名稱之間 一定不可有空格符。

佔位符的名稱 應該 只由 a-z、a-z、0-9、下劃線 _、以及英文的句號 . 組成,其它字元作為將來佔位符規範的保留。

實現者 可以 通過對佔位符採用不同的轉義和轉換策略,來生成最終的日誌。 而使用者在不知道上下文的前提下,不該 提前轉義佔位符。

以下是乙個佔位符使用的例子:

/**

* 用上下文資訊替換記錄資訊中的佔位符

*/

function

interpolate

($message

,array $context

=array

())

']=

$val

;

}

// 替換記錄資訊中的佔位符,最後返回修改後的記錄資訊。

return

strtr

($message

,$replace

);

}

// 含有帶花括號佔位符的記錄資訊。

$message

="user created"

;

// 帶有替換資訊的上下文陣列,鍵名為佔位符名稱,鍵值為替換值。

$context

=array

('username'

=>

'bolivar'

);

// 輸出 "username bolivar created"

echo interpolate

($message

,$context

);

1.3 上下文

每個記錄函式都接受乙個上下文陣列引數,用來裝載字串型別無法表示的資訊。它 可以 裝載任何資訊,所以實現者 必須 確保能正確處理其裝載的資訊,對於其裝載的資料, 一定不可 丟擲異常,或產生php出錯、警告或提醒資訊(error、warning、notice)。

如需通過上下文引數傳入了乙個 exception 物件,必須 以 exception 作為鍵名。 記錄異常資訊是很普遍的,所以如果它能夠在記錄類庫的底層實現,就能夠讓實現者從異常資訊中抽絲剝繭。 當然,實現者在使用它時,必須 確保鍵名為 exception 的鍵值是否真的是乙個 exception,畢竟它 可以 裝載任何資訊。

1.4 助手類和介面

psr\log\abstractlogger 類使得只需繼承它和實現其中的 log 方法,就能夠很輕易地實現 loggerinte***ce 介面,而另外八個方法就能夠把記錄資訊和上下文資訊傳給它。

同樣地,使用 psr\log\loggertrait 也只需實現其中的 log 方法。不過,需要特別注意的是,在 traits 可復用**塊還不能實現界面前,還需要 implement loggerinte***ce。

在沒有可用的日誌記錄器時,psr\log\nulllogger 介面 可以 為使用者提供乙個備用的日誌「黑洞」。不過,當上下文的構建非常消耗資源時,帶條件檢查的日誌記錄或許是更好的辦法。

psr\log\loggerawareinte***ce 介面僅包括乙個 setlogger(loggerinte***ce $logger) 方法,框架可以使用它實現自動連線任意的日誌記錄例項。

psr\log\loggerawaretrait trait可復用**塊可以在任何的類裡面使用,只需通過它提供的 $this->logger,就可以輕鬆地實現等同的介面。

psr\log\loglevel 類裝載了八個記錄等級常量。包

上述的介面、類和相關的異常類,以及一系列的實現檢測檔案,都包含在 psr/log 檔案包中。

<?

php

namespace

psr\log

;

/**

* 日誌記錄例項

*

* 日誌資訊變數 —— message,**必須** 是乙個字串或是實現了 __tostring() 方法的物件。

*

* 日誌資訊變數中 **可以** 包含格式如 「」 (代表 foo) 的佔位符,

* 它將會由上下文陣列中鍵名為「foo」的鍵值替代。

*

* 上下文陣列可以攜帶任意的資料,唯一的限制是,當它攜帶的是乙個 exception 物件時,它的鍵名 **必須** 是 "exception"。

*

* 詳情可參閱:

*/

inte***ce

loggerinte***ce

<?

php

namespace

psr\log

;

/**

* logger-aware 定義例項

*/

inte***ce

loggerawareinte***ce

<?

php

namespace

psr\log

;

/**

* 日誌等級常量定義

*/

class

loglevel

PSR 3 日誌介面規範

用上下文資訊替換記錄資訊中的佔位符 function interpolate message,array context array val 替換記錄資訊中的佔位符,最後返回修改後的記錄資訊。return strtr message,replace 含有帶花括號佔位符的記錄資訊。message us...

PSR 3 日誌介面規範

1.規範說明 1.1 基本規範 loggerinte ce 介面對外定義了八個方法,分別用來記錄 rfc 5424 中定義的八個等級的日誌 debug info notice warning error critical alert 以及 emergency 第九個方法 log,其第乙個引數為記錄的...

PSR 3 日誌介面規範說明

psr 3 制定了日誌類庫的通用介面規範。本規範的主要目的,是為了讓日誌類庫以簡單通用的方式,通過接收乙個 psr log loggerinte ce 物件,來記錄日誌資訊。框架以及cms內容管理系統如有需要,可以 對此介面進行擴充套件,但需遵循本規範,這才能保證在使用第三方的類庫檔案時,日誌介面仍...