[CodeIgniter4]-記錄日誌資訊
- 2020 年 3 月 5 日
- 筆記
記錄日誌資訊
- 配置
- 使用多個日誌調度器
- 根據上下文修改記錄資訊
- 使用第三方日誌器
- LoggerAware Trait(程式碼復用)
你可以通過 log_message()
方法將資訊記錄在本地日誌文件中,並且必須在第一個參數中指定錯誤的」級別」,來表明這個資訊的類型(debug,error等)。 第二個參數就是資訊本身:
if ($some_var == '') { log_message('error', 'Some variable did not contain a value.'); }
總共有八種不同的事件報錯級別,與 RFC 5424 中所定義的錯誤級別一一對應,它們是:
* **debug** - 詳細的debug資訊。 * **info** - 你的應用中的一些有意義的事件,例如用戶登錄,記錄SQL語句等。 * **notice** - 你的應用中的一些正常但明顯有價值的事件。 * **warning** - 出現了異常,但不是錯誤,例如使用了被廢棄的API,某個API的調用異常,或其他不期望出現的,但不是錯誤的情況。 * **error** - 運行時錯誤,不需要立即被處理但通常需要被記錄或者監控。 * **critical** - 危險情況,例如某個程式組件不可用,或出現未被捕獲的異常等。 * **alert** - 告警,必須採取行動來修復,例如整個網站宕機或資料庫無法訪問等。 * **emergency** - 系統不可用。
日誌系統不提供警告系統管理員或網站管理者的方法,只是單純的記錄資訊。對於諸多更為危險的錯誤級別,日誌就會被異常調度器自動拋出,如上所述。
配置
你可以修改 /app/Config/Logger.php
配置文件來修改哪些級別的事件會被實際記錄,以及為不同的事件等級分配不同的日誌記錄器等。
配置文件中的 threshold
(報錯閾值)決定了從哪個級別開始的事件將會在整個應用中記錄下來。如果應用中有任何低於報錯閾值的事件記錄被記錄時,這些請求將會被忽略。 最為簡單的使用閾值的方法就是將其設為你希望記錄的報錯等級的最低值。舉例來說,如果你想記錄warning資訊,而不是information資訊,就需要將報錯閾值設為 5
。所有報錯等級低於5的日誌記錄請求 (包括運行時錯誤,系統錯誤等)將會被記錄,而info, notice和debug級別的錯誤就會被忽略:
public $threshold = 5;
關於報錯級別和對應的閾值的列表列舉在配置文件中以供參閱。
你可以通過給報錯閾值賦值一個包含報錯等級數字的數組,來選擇特定的報錯級別:
// 只記錄debug和info類型的報錯 public $threshold = [5, 8];
使用多個日誌調度器
日誌系統支援同時使用多種調度器來處理日誌記錄。每一種調度器可以獨立地設置用於特定的錯誤等級,並忽略其他的。現狀而言,我們默認安裝了兩種調度器以供使用:
- 文件調度器 是默認的調度器,它將會每天在本地創建一個獨立的日誌文件,同時這也是較為被推薦的日誌記錄方式。
- ChromeLogger 調度器 如果你在Chrome瀏覽器上安裝了 ChromeLogger 擴展 ,你可以使用這種調度器將日誌輸出到Chrome的控制台窗口中。
調度器配置於主配置文件中的 $handlers
屬性中,這一屬性的格式為一個包含一組調度器和它們對應的配置的數組。 每個調度器被定義數組的鍵,格式為完整命名空間格式的類名,而對應的值就是一個數組。 每個調度器配置塊中都會有一個通用的屬性: handle
,對應著該調度器將要記錄的報錯級別的 名字
public $handlers = [ //-------------------------------------------------------------------- // 文件調度器 //-------------------------------------------------------------------- 'CodeIgniterLogHandlersFileHandler' => [ 'handles' => ['critical', 'alert', 'emergency', 'debug', 'error', 'info', 'notice', 'warning'], ] ];
根據上下文修改記錄資訊
我們經常會根據上下文來修改記錄資訊的某些細節。比如說,可能會記錄用戶ID,IP地址,當前的POST變數等。 你可以通過在資訊中使用通配符來實現。每個通配符必須被大括弧({}) 包裹起來。在第三個參數中,你需要提供一個包含有通配符名,與其對應值的數組。 這些內容將會插入到記錄資訊字元串中:
// 生成一條例如這樣的資訊:用戶123登錄系統,登錄IP為127.0.0.1 $info = [ 'id' => $user->id, 'ip_address' => $this->request->ip_address() ]; log_message('info', 'User {id} logged into the system from {ip_address}', $info);
如果你想記錄一條異常或一個錯誤,你可以使用」exception」作為鍵,對應的值就是這條異常或錯誤本身。 這樣一來這個異常或錯誤對象包含的錯誤資訊,文件名和對應行號就會生成一條字元串。 你需要在記錄資訊中中提供exception通配符:
try { ... 一些能拋出異常的程式碼 } catch (Exception $e) { log_message('error', '[ERROR] {exception}', ['exception' => $e]); }
以下是幾個核心通配符,它們將會在請求頁面時自動被替換成指定的數據:
+----------------+---------------------------------------------------+
通配符 | 對應的替換數據 |
+================+===================================================+ | {post_vars} | $_POST 變數 | +—————-+—————————————————+ | {get_vars} | $_GET 變數 | +—————-+—————————————————+ | {session_vars} | $_SESSION 變數 | +—————-+—————————————————+ | {env} | 當前環境名,例如development | +—————-+—————————————————+ | {file} | 生成日誌的文件的名字 | +—————-+—————————————————+ | {line} | {file}中生成日誌的指定行號 | +—————-+—————————————————+ | {env:foo} | 在$_ENV數組中foo這個鍵對應的值 | +—————-+—————————————————+
使用第三方日誌器
你可以使用任何自己喜歡的日誌器,只要它繼承了 PsrLogLoggerInterface
並符合 PSR3 規範。 這意味著你可以使用任何符合PSR-3規範的日誌器,或者造一個自己的。
你需要將第三方日誌器放入 /app/Config/Autoload.php
配置文件中或者通過某個自動載入器,比如Composer,來保證第三方日誌器在系統中可被找到。 接下來你需要修改 /app/Config/Services.php
,將 logger
的別名設置為新的日誌器的類名。
現在開始,對 log_message()
的所有調用都會使用你自定義的日誌器進行日誌記錄。
LoggerAware Trait(程式碼復用)
當你需要將你的日誌庫以框架不感知的形式調用時,你可以使用實現了 setLogger
方法的 CodeIgniterLogLoggerAwareTrait
。 從而當在不同框架環境下使用日誌庫時,你的日誌器依舊可如同預期一般運行,只要它能找到一個符合PSR3的日誌器。