#日誌的處理工作是由系統自動進行的,在開啟日誌記錄的情況下,會記錄下允許的日誌等級的所有日誌資訊。
其中,為了效能考慮,SQL日誌等級必須在偵錯模式開啟下有效,否則就不會記錄。系統的日誌記錄由核心的Think\Log類別及其驅動完成,提供了多種方式記錄了不同的等級的日誌資訊。
預設只是在偵錯模式記錄日誌,要在部署模式開啟日誌記錄,必須在設定中開啟LOG_RECORD
參數,以及可以在應用程式設定檔中配置需要記錄的日誌級別,例如:
<span class="str">'LOG_RECORD'<span class="pln"> <span class="pun">=><span class="pln"> <span class="kwd">true<span class="pun">,<span class="pln"> <span class="com">//開啟日誌記錄</span></span></span></span></span></span></span></span>
<span class="str">#'LOG_LEVEL'<span class="pln"> <span class="pun">=><span class="str">'EMERG,ALERT,CRIT,ERR'<span class="pun">,<span class="pln"> <span class="com">// 只記錄EMERG ALERT CRIT ERR 錯誤</span></span></span></span></span> </span></span>
日誌等級
ThinkPHP對系統的日誌依照層級來分類,包括:
- EMERG 嚴重錯誤,導致系統崩潰無法使用
- ALERT 警戒錯誤,必須立即修改的錯誤
- CRIT# 臨界值錯誤,超過臨界值的錯誤
- ERR 一般性錯誤
- WARN 警告性錯誤,需要發出警告的錯誤
- #NOTICE 通知,程式可以運作但是還不夠完美的錯誤
- INFO 訊息,程式輸出訊息
- DEBUG調試,用於調試資訊
- SQL SQL語句,該等級只在調試模式開啟時有效
記錄方式
日誌的記錄方式預設是檔案方式,可以透過驅動的方式來擴展支援更多的記錄方式。
記錄方式由LOG_TYPE參數配置,例如:
<span class="str">#'LOG_TYPE'<span class="pln"> <span class="pun">=><span class="pln"> <span class="str">'File '<span class="pun">,<span class="pln"> <span class="com">// 日誌記錄類型預設為檔案方式</span></span></span></span></span></span></span></span>
#File方式記錄,對應的驅動程式檔案位於系統的
Library/Think/Log/Driver/File.class.php
。
手動記錄
一般情況下,系統的日誌記錄是自動的,無需手動記錄,但是某些時候也需要手動記錄日誌信息,Log類提供了3個方法用於記錄日誌。
方法 | 描述 |
---|---|
#Log::record() | 記錄日誌資訊到記憶體 |
Log::save() | #把儲存在記憶體中的日誌資訊(用指定的記錄方式)寫入 |
Log::write() | 即時寫入一條日誌訊息 |
由於系統在請求結束後會自動呼叫Log::save方法,所以通常,你只需要呼叫Log::record記錄日誌資訊。
record方法用法如下:
<span class="pln">\Think\Log<span class="pun">::<span class="pln">record<span class="pun">(<span class="str">'測試日誌訊息'<span class="pun">);</span></span></span></span></span></span>
#預設的話記錄的日誌等級是ERR,也可以指定日誌級別:
<span class="pln">\Think\Log<span class="pun">::<span class="pln">record<span class="pun">(<span class="str">'測試日誌訊息,這是警告等級'<span class="pun">, <span class="str">'WARN'<span class="pun">);</span></span></span></span></span></span></span></span>
record方法只會記錄目前配置允許記錄的日誌等級的信息,如果應用配置為:
<span class="str">'LOG_LEVEL'<span class="pln"> <span class="pun">=><span class="str">'EMERG, ALERT,CRIT,ERR'<span class="pun">,<span class="pln"> <span class="com">// 只記錄EMERG ALERT CRIT ERR 錯誤</span></span></span></span></span></span></span>
那麼上面的record方法記錄的日誌資訊會被直接過濾,或者你可以強制記錄:
<span class="pln">\Think\Log<span class="pun"> ::<span class="pln">record<span class="pun">(<span class="str">'測試日誌訊息,這是警告等級'<span class="pun">,<span class="str">'WARN'<span class="pun">,<span class="kwd">true<span class="pun">);</span></span></span></span></span></span></span></span></span></span>
#採用record方法記錄的日誌資訊不是即時儲存的,如果需要即時記錄的話,可以採用write方法,例如:
<span class="pln">\Think\Log<span class="pun">::<span class="pln">write<span class="pun">(<span class="str">'測試日誌訊息,這是警告級別,並且即時寫入'<span class="pun">,<span class="str">'WARN'<span class="pun">);</span></span></span></span></span></span></span> </span>