Table of Contents
基本知識
Log 的重要性程度 (Log Level)
重要性由低至高排列如下:DEBUG,INFO,WARNING,ERROR,CRITICAL
我們必須要在程式碼中指定要記錄的最低底限。
logging 模組的重要元件
Logger
Log 的生產者,模組內建的 Logger 叫做 root,其預設的接受端為 stdout (也就是終端機螢幕),Log Level 為 WARNING。
我們也可以自訂建立不同的 Logger,配合不同的 Log Level 來做分流。
Handler
Log 的接受者:可以是 stdout, file…
程式碼範例
1、最簡單的程式碼
使用內建的 root logger
這會直接把 Log 顯示在標準輸出 (也就是終端機螢幕) 上
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 這段不會顯示,因為預設的 Log Level 是 WARNING</span></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">info</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Hello world!</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">warning</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Hi</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>如果要讓 INFO 也能顯示,得做些設定
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">basicConfig</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">level</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">INFO</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">info</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Hello world!</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">warning</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Hi</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>將 Log 寫入檔案
這會將 Log 寫入 log.txt 這個檔案。
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">basicConfig</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">level</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">INFO</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">filename</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">log.txt</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">info</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Hello world!</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>設定輸出格式
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="color: #88C0D0">format</span><span style="color: #81A1C1">=</span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C">[</span><span style="color: #EBCB8B">%(asctime)s</span><span style="color: #A3BE8C">][</span><span style="color: #EBCB8B">%(name)-5s</span><span style="color: #A3BE8C">][</span><span style="color: #EBCB8B">%(levelname)-5s</span><span style="color: #A3BE8C">] </span><span style="color: #EBCB8B">%(message)s</span><span style="color: #A3BE8C"> (</span><span style="color: #EBCB8B">%(filename)s</span><span style="color: #A3BE8C">:</span><span style="color: #EBCB8B">%(lineno)d</span><span style="color: #A3BE8C">)</span><span style="color: #ECEFF4">"</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">basicConfig</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9">level</span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">INFO</span><span style="color: #ECEFF4">,</span><span style="color: #D8DEE9FF"> </span><span style="color: #D8DEE9">format</span><span style="color: #81A1C1">=</span><span style="color: #88C0D0">format</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">info</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Hello world!</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">warning</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Hi</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>2、建立自訂的 Handler
這個範例我們採用自訂的 Handler 配合 logging 預設的 root Logger 來達到與之前範例相同的效果
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 建立一個寫入 mylog.txt 檔案的 Handler </span></span>
<span class="line"><span style="color: #D8DEE9FF">file_handler </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">FileHandler</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">mylog.txt</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 建立一個格式</span></span>
<span class="line"><span style="color: #D8DEE9FF">formatter </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Formatter</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C">[</span><span style="color: #EBCB8B">%(asctime)s</span><span style="color: #A3BE8C">][</span><span style="color: #EBCB8B">%(name)-5s</span><span style="color: #A3BE8C">][</span><span style="color: #EBCB8B">%(levelname)-5s</span><span style="color: #A3BE8C">] </span><span style="color: #EBCB8B">%(message)s</span><span style="color: #A3BE8C"> (</span><span style="color: #EBCB8B">%(filename)s</span><span style="color: #A3BE8C">:</span><span style="color: #EBCB8B">%(lineno)d</span><span style="color: #A3BE8C">)</span><span style="color: #ECEFF4">"</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 告訴 Handler 使用這個格式 </span></span>
<span class="line"><span style="color: #D8DEE9FF">file_handler</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">setFormatter</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">formatter</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 將 Handler 連結到預設的 root Logger</span></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">getLogger</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">''</span><span style="color: #ECEFF4">).</span><span style="color: #88C0D0">addHandler</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">file_handler</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 另一種設定 Log Level 的方式</span></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">getLogger</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">''</span><span style="color: #ECEFF4">).</span><span style="color: #88C0D0">setLevel</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">INFO</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">info</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Hello world!</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"><span style="color: #D8DEE9FF"> </span></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">warning</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Hi</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>建立自訂的 Logger
假設除了之前預設的 root Looger 外,我們還想建立一個 Error Logger,專門用來存放錯誤訊息 ( ERROR message)
<span class="line"><span style="color: #81A1C1">import</span><span style="color: #D8DEE9FF"> logging</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 建立自訂的 Error Logger</span></span>
<span class="line"><span style="color: #D8DEE9FF">error_logger </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Logger</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">error</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 建立一個寫入 errorlog.txt 檔案的 Handler </span></span>
<span class="line"><span style="color: #D8DEE9FF">error_file_handler </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">FileHandler</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">errorlog.txt</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 建立一個格式</span></span>
<span class="line"><span style="color: #D8DEE9FF">formatter </span><span style="color: #81A1C1">=</span><span style="color: #D8DEE9FF"> logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">Formatter</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">"</span><span style="color: #A3BE8C">[</span><span style="color: #EBCB8B">%(asctime)s</span><span style="color: #A3BE8C">][</span><span style="color: #EBCB8B">%(name)-5s</span><span style="color: #A3BE8C">][</span><span style="color: #EBCB8B">%(levelname)-5s</span><span style="color: #A3BE8C">] </span><span style="color: #EBCB8B">%(message)s</span><span style="color: #A3BE8C"> (</span><span style="color: #EBCB8B">%(filename)s</span><span style="color: #A3BE8C">:</span><span style="color: #EBCB8B">%(lineno)d</span><span style="color: #A3BE8C">)</span><span style="color: #ECEFF4">"</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 告訴 Handler 使用這個格式 </span></span>
<span class="line"><span style="color: #D8DEE9FF">error_file_handler</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">setFormatter</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">formatter</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 將 Handler 連結到自訂的 Error Logger</span></span>
<span class="line"><span style="color: #D8DEE9FF">error_logger</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">addHandler</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">error_file_handler</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 設定 Log Level 的方式</span></span>
<span class="line"><span style="color: #D8DEE9FF">error_logger</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">setLevel</span><span style="color: #ECEFF4">(</span><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #D8DEE9FF">ERROR</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 這個會發送到預設的 root logger,然後顯示於 stdout</span></span>
<span class="line"><span style="color: #D8DEE9FF">logging</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">error</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Somethins wrong</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #616E88"># 這個會透過自訂的 logger,寫入 errorlog.txt</span></span>
<span class="line"><span style="color: #D8DEE9FF">error_logger</span><span style="color: #ECEFF4">.</span><span style="color: #88C0D0">error</span><span style="color: #ECEFF4">(</span><span style="color: #ECEFF4">'</span><span style="color: #A3BE8C">Somebody help me</span><span style="color: #ECEFF4">'</span><span style="color: #ECEFF4">)</span></span>參考資料
https://docs.python.org/3/library/logging.html
https://jacychu.medium.com/python-logging%E6%A8%A1%E7%B5%84%E4%BB%8B%E7%B4%B9-f678707808ed
Comments