檢查應用程式日誌檔#

許多執行複雜處理、在背景運行或沒有控制台存取權限的程式,都會將操作記錄到檔案或專門的日誌收集設施。養成習慣,在調查失敗時首先檢查軟體的日誌檔

日誌檔的位置#

不同作業系統和平台的日誌檔位置不同:

Unix 系統:通常存放在 /var/log 目錄中的文字檔

  • auth.log:認證相關
  • daemon.log:背景程序
  • kern.log:核心訊息
  • debug:除錯資訊
  • messages:其他訊息

Windows 系統:使用 Eventvwr.msc 啟動 Event Viewer,或使用 PowerShell 的 GetEventLog 命令

macOS:使用 Console 應用程式

在不太繁忙的系統上,可以在應用程式產生日誌後立即執行 ls -tl /var/log | head,最近修改的日誌檔會出現在最上面。

調整日誌詳細程度#

許多應用程式可以透過以下方式調整日誌詳細程度(log verbosity)

  • 命令列選項
  • 設定檔選項
  • 在執行期發送特定信號

例如,SSH 連線除錯時,將 sshd_config 中的 LogLevelINFO 改為 DEBUG,就能看到更詳細的訊息,如找不到 authorized_keys 檔案等明確的錯誤原因。

日誌框架設定#

Unix syslog:透過 /etc/syslog.conf 設定 facility 和 level 的對應關係

security.*    /var/log/security
auth.info     /var/log/auth.log
*.=debug      /var/log/debug.log
*.emerg       *

Log4j(JVM 生態系):透過 XML、JSON、YAML 或 Java properties 檔案設定 loggersappenderslayouts

分析日誌的方法#

  • 使用系統的 GUI event viewer 搜尋和過濾
  • 編輯器中開啟日誌檔處理
  • 使用 Unix 命令列工具grepawksort 等)過濾、摘要和選擇欄位
  • 互動式監控日誌(如 tail -f
  • 使用日誌管理服務,如 ELK、Logstash、loggly 或 Splunk
  • Windows 上使用 wevtutil 命令列工具查詢和匯出日誌

分析策略#

  1. 從失敗發生的時間點附近開始檢查日誌條目
  2. 搜尋與失敗相關的字串(如失敗命令的名稱)
  3. 回溯搜尋錯誤、警告和異常條目
  4. 對於表象不明確的失敗,反覆從日誌中移除無關條目,直到重要資訊浮現

在編輯器中可以使用刪除匹配行的功能快速過濾日誌:Emacs 用 delete-matching-lines,Vim 用 :g/pattern/d,或在命令列用連續的 grep -v 命令。

重點回顧#

  • 調查失敗的應用程式時,首先檢查其日誌檔
  • 提高應用程式的日誌詳細程度,以記錄失敗原因
  • 設定並過濾日誌檔,以縮小問題範圍