首頁  >  文章  >  後端開發  >  PHP PSR-3 日誌介面規格

PHP PSR-3 日誌介面規格

WBOY
WBOY原創
2016-07-23 08:54:41966瀏覽
複製代碼
日誌介面規範

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

本規範的主要目的,是為了讓日誌類別庫以簡單通用的方式,透過接收一個 PsrLogLoggerInterface 對象,來記錄日誌資訊。
框架以及CMS內容管理系統如有需要,可以對此接口進行擴展,但需遵循本規範,
這才能保證在使用第三方的類庫文件時,日誌接口仍能正常對接。

關鍵字「必須」("MUST")、「一定不可/一定不能」("MUST NOT")、「需要」("REQUIRED")、
「將會」("SHALL")、 「不會」("SHALL NOT")、「應該」("SHOULD")、「不該」("SHOULD NOT")、
「推薦」("RECOMMENDED")、「可以」("MAY" )和」可選「("OPTIONAL")的詳細描述可參見[RFC 2119][] 。

本文中的 實作者 指的是實作了 LoggerInterface 介面的類別庫或框架,反過來講,他們就是 LoggerInterface 的 使用者。

規範說明


1.1 基本規範

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

第九個方法 —— log,其第一個參數為記錄的等級。可使用一個預先定義的等級常數作為參數來呼叫此方法,必須與直接呼叫以上八個方法具有相同的效果。如果傳入的等級常數參數沒有預先定義,則必須拋出 PsrLogInvalidArgumentException 類型的例外。在不確定的情況下,使用者不該使用未支援的等級常數來呼叫此方法。

1.2 記錄資訊

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

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

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

佔位符的名稱必須由一個左花括號 { 以及一個右括號 } 包含。但花括號與名稱之間一定不能有空格符。

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

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

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

  1. /**
  2. * 以上下文資訊取代記錄資訊中的佔位符
  3. */
  4. function interpolate($message, array $context = array ())
  5. {
  6. // 建立一個花括號包含的鍵名的替換數組
  7. $replace = array();
  8. foreach ($context as $key => $val) {
  9. $replace['{' . $key . '}'] = $val;
  10. }
  11. // 取代記錄資訊中的佔位符,最後傳回修改後的記錄資訊。
  12. return strtr($message, $replace);
  13. }
  14. // 含有帶花括號佔位符的記錄資訊。
  15. $message = "User {username} created";
  16. // 帶有替換資訊的上下文數組,鍵名為佔位符名稱,鍵值為替換值。
  17. $context = array('username' => 'bolivar');
  18. // 輸出"Username bolivar created"
  19. echo interpolate($message, $context);
複製程式碼
1.3 上下文

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

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

1.4 助手類別和接口

PsrLogAbstractLogger 類別使得只需繼承它和實現其中的 log 方法,就能夠很輕易地實現 LoggerInterface 接口,而另外八個方法就能夠把記錄資訊和上下文資訊傳給它。

同樣地,使用 PsrLogLoggerTrait 也只需實作其中的 log 方法。不過,要特別注意的是,在traits可重複使用程式碼區塊還不能實作介面前,還需要 implement LoggerInterface。

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

PsrLogLoggerAwareInterface 介面僅包含一個
setLogger(LoggerInterface $logger) 方法,框架可以使用它實作自動連接任意的日誌記錄實例。

PsrLogLoggerAwareTrait trait可重複使用程式碼區塊可以在任何的類別裡面使用,只需透過它提供的 $this->logger,就可以輕鬆實現等同的介面。

PsrLogLogLevel 類別裝載了八個記錄等級常數。


上述的介面、類別和相關的異常類,以及一系列的實作偵測文件,都包含在 psr/log 文件包中。

PsrLogLoggerInterface


  1. 命名空間PsrLog;
  2. /**
  3. * 日誌記錄實例
  4. *
  5. * 日誌資訊變數 —— message, **必須**是一個字串或是實作了 __toString() 方法的物件。
  6. *
  7. * 日誌資訊變數中**可以**包含格式如「{foo}」 (代表foo) 的佔位符,
  8. * 它將會由上下文數組中鍵名為"foo " 的鍵值替代。
  9. *
  10. * 上下文數組可以攜帶任意的數據,唯一的限制是,當它攜帶的是一個 exception 物件時,它的鍵名 必須 是 "exception"。
  11. *
  12. * 詳情可參考: https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-3-logger-interface-cn.md
  13. */
  14. 接口LoggerInterface
  15. {
  16. /**
  17. * 系統不可用
  18. *
  19. * @param string $message
  20. * @param array $context
  21. * @return null
  22. */
  23. 公用函數Emergency($message, array $context = array());
  24. /**
  25. * **必須**立刻採取行動
  26. *
  27. * 例如:在整個網站都垮掉了、資料庫不可用了或者其他的情況下,**應該**發送一條警報短信把你叫醒。
  28. *
  29. * @param string $message
  30. * @param array $context
  31. * @return null
  32. */
  33. 公用函數>
  34. /**
  35. * 緊急情況
  36. *
  37. * 例如:程式組件無法使用或出現非預期的異常。
  38. *
  39. * @param string $message
  40. * @param array $context
  41. * @return null
  42. */
  43. 公用函數Alert($message, array $context = array());
  44. /**
  45. * 運行時出現的錯誤,不需要立刻採取行動,但必須記錄下來以備檢測。
  46. *
  47. * @param string $message
  48. * @param array $context
  49. * @return null
  50. */
  51. public function critical($message, array $context = array());
  52. /**
  53. * 出現非錯誤性的異常。
  54. *
  55. * 例如:使用了被棄用的API、錯誤地使用了API或非預想的不必要錯誤。
  56. *
  57. * @param string $message
  58. * @param array $context
  59. * @return null
  60. */
  61. 公用函數錯誤($message, array $context = array());
  62. /**
  63. * 一般性重要的事件。
  64. *
  65. * @param string $message
  66. * @param array $context
  67. * @return null
  68. */
  69. 公用函數警告($message, array $context = array());
  70. /**
  71. * 重要事件
  72. *
  73. * 例如:使用者登入和SQL記錄。
  74. *
  75. * @param string $message
  76. * @param array $context
  77. * @return null
  78. */
  79. 公用函數通知($message, array $context = array());
  80. /**
  81. * 除錯詳情
  82. *
  83. * @param string $message
  84. * @param array $context
  85. * @return null
  86. */
  87. public function info($message, array $context = array());
  88. /**
  89. * 任意等級的日誌記錄
  90. *
  91. * @param mixed $level
  92. * @param string $message
  93. * @param array $context
  94. * @return null
  95. * @param array $context
  96. * @return null
  97. */
  98. public function debug( $message, array $context = array());
/** * logger-aware 定義實例*/
public function log($level, $message, array $context = array());

}


複製程式碼
  1. PsrLogLoggerAwareInterface
  2. 命名空間PsrLog;
  3. /**
  4. * 設定一個日誌記錄實例
  5. *
  6. * @param LoggerInterface $logger
  7. * @return null
  8. */
  9. 介面LoggerAInterwareInterface>/**
* 日誌等級常數定義
*/介面LoggerAInterwareInterface> { /***/
public function setLogger(LoggerInterface $logger);

}


複製程式碼🎜>
  1. 複製碼🎜>
  2. 命名空間PsrLog;
  3. /***/
  4. class Logo>
  5. /***/
  6. class Logf
  7. Lef>Level
  8. Level const EMERGENCY = '緊急';
  9. const ALERT = '警報';
  10. const CRITICAL = '嚴重';
const ERROR = '錯誤';
const WARNING = '警告' ; const NOTICE = 'notice'; const INFO = 'info';
const DEBUG = 'debug';

}

轉自Github(PizzaLiu)
PHP、PSR

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn