iT邦幫忙

2025 iThome 鐵人賽

DAY 14
0
Software Development

軟體開發養成計畫:以小程式實作深化開發能力系列 第 14

[Day14]一週回顧 & 小程式升級:加上logging日誌功能

  • 分享至 

  • xImage
  •  

1.第二週回顧

這一週我總共寫了六篇文章:

  • 第八天: 分享隨機數與模擬應用(random 模組)
  • 第九天: 用 Python寫第四個小程式──檔案整理器
  • 第十天: 網頁爬蟲基礎觀念
  • 第十一天: 實戰設計模式:掌握程式架構的基石——單例模式與 MVC
  • 第十二天:用Python 寫第五個小程式──井字遊戲
  • 第十三天: Debug 技巧入門

這六天的文章中,兩篇偏技術性,兩篇偏觀念性,兩篇偏實作性。
這些主題中,我發現自己不只是單純寫程式,而是逐漸開始關注更全面的能力:

一方面透過模組與工具讓程式更實用;另一方面則透過設計模式與 Debug 技巧,去學習如何寫出更有架構、也更能維護的程式。

特別是在井字遊戲的實作過程中,我更深刻體會到:即使是一個小遊戲,也能涵蓋輸入處理、邏輯判斷、勝負條件檢查等挑戰,這讓我認識到「實戰」的重要性。而 Debug 的學習部份也提醒我,錯誤並不是失敗,而是程式設計成長過程中必經的階段。

如果說第一週的重點是用 GUI 讓小程式變得更「好用」,那麼第二週我想要嘗試的是讓小程式變得更「專業化」。因此,我的計畫將我的小程式加入 logging 模組,讓程式能自動記錄執行過程與錯誤,目的是為了能在發生問題時快速定位,也能幫助我追蹤程式的行為,讓每個小專案更像真正的工具,這會是我下一步的學習方向。

2.logging 小知識大解析

(1)什麼是 logging?

logging,是一個用來記錄程式執行時所發生事件的工具。
它就像是程式的日記,能夠將重要的訊息、警告或錯誤等內容,按照我們所指定的格式和等級,記錄下來並儲存到檔案中,或顯示在螢幕上。

平常寫程式時我們最常用的除錯方式是用 print() 把訊息輸出到終端機,但是若程式越來越複雜,print() 會變得不好管理,舉個例子:

  • 一旦程式大了,訊息會充滿整個畫面,很難分辨重點。
  • 無法清楚知道訊息的等級是普通提示、警告還是錯誤。
  • 訊息不會自動保存,程式關閉後就消失了。

這時候,Python 內建的 logging 模組就能派上用場了!

(2)logging 模組特色

  1. 分級管理
    logging 提供了 5 個等級,方便標註訊息的重要性:
    DEBUG:最詳細的訊息(程式內部細節)。
    INFO:一般訊息(程式正常執行的狀況)。
    WARNING:警告訊息(不影響執行,但要注意)。
    ERROR:錯誤訊息(某些功能無法執行)。
    CRITICAL:嚴重錯誤(程式可能無法繼續執行)。

  2. 可保存紀錄
    可以把 log 存到檔案裡,像是 app.log,方便日後回顧。

  3. 可格式化
    可以自訂輸出的格式,例如:

2025-09-20 15:30:21 - INFO - 檔案整理完成
  1. 靈活設定
    可以同時把 log 輸出到螢幕和檔案,或者根據需求只顯示警告以上的訊息。

3.檔案整理器 + logging 實作

接下來要進行範例實作啦!會由我之前寫的小程式「檔案整理器」加上logging來做示範。

(1)匯入模組

目前程式已經有 os、shutil(檔案操作)和 tkinter(GUI),這邊只需要再加上 logging。

import logging

(2)設定 logging 基本配置

在程式一開始(模組區之後,函式之前),我們可以設定 logging:

logging.basicConfig(
    level=logging.INFO, 
    format="%(asctime)s - %(levelname)s - %(message)s",  
    filename="file_organizer.log",  
    filemode="a"  
)

(3)核心整理函式(organize_files)

這裡釋放logging的最佳區域,因為所有檔案移動錯誤都在這裡發生。
我們可以在這三個地方加入logging:

  • 建立資料夾時:用 logging.info() 紀錄
  • 移動檔案成功時:用 logging.info() 紀錄
  • 發生錯誤時:用 logging.error() 紀錄
if not os.path.exists(target_path):
    os.makedirs(target_path)
    logging.info(f"建立資料夾:{destination_folder}")

try:
    shutil.move(file_path, os.path.join(target_path, filename))
    logging.info(f"已移動檔案:{filename} -> {destination_folder}")
except shutil.Error as e:
    logging.error(f"移動檔案時出錯 {filename}:{e}")

(4)GUI 介面(organize_files_gui)

這部分主要是跟使用者互動。
這裡我們可以紀錄:

  • 使用者選擇了哪個資料夾(logging.info)
  • 使用者取消選擇(logging.warning)
source_path = filedialog.askdirectory()
if not source_path:
    logging.warning("使用者取消選擇資料夾")
    result_text.set("")
    return

logging.info(f"選擇資料夾:{source_path}")

(5)主程式區

在程式一啟動時,記錄一個訊息:

logging.info("檔案整理小工具啟動")

(6)成果展示

加上logging之前:
22
加上logging之後:
25
26
點擊查看日誌,藉由以記事本呈現的方式出現logging紀錄。

4.心得

這一週寫下來,我發現自己做的小程式雖然功能越來越多,介面也因為 GUI 變得更友善,但在可追蹤性這一塊還是有缺口。比如說我之前寫的檔案整理器,檔案移動成功或失敗,其實都只有當下在程式裡能看到,過一段時間就沒跡可循。藉由許許多多網路查詢,終於找到能夠解決的方法——Logging日誌紀錄。

老實說,在還沒學 logging 前,我一直以為它只是把 print() 的內容改存到檔案而已。但實際用過才知道,它在錯誤追蹤、功能驗證上的幫助非常大。簡單來說,就像幫程式自動寫日記一樣,能隨時回頭檢視過去的動作。對我來說,logging 的重要性完全不輸給 GUI,以後的小程式我也會繼續沿用這項工具,也會與 GUI 結合,打造出既好用又可追溯的應用程式。


上一篇
[Day13]Debug 技巧入門:程式出錯了該怎麼辦?
下一篇
[Day15]讓程式與世界連線:API 串接與 JSON 處理攻略
系列文
軟體開發養成計畫:以小程式實作深化開發能力17
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言