使用 Python 輸出日誌的完整指南~從初學者到實戰全面掌握

1. 使用 Python 輸出日誌的完整指南|從除錯到實務應用

在使用 Python 進行程式開發時,「輸出日誌」對於錯誤追蹤與功能確認是非常重要的。
本文將從基礎概念到實用技巧進行說明,幫助 Python 初學者有效掌握日誌的使用方法。

2. 什麼是 Python 的日誌輸出?基本概念與必要性解析

日誌輸出是指在程式執行過程中,記錄資訊或錯誤的機制。妥善利用日誌有以下幾個好處:

日誌輸出的好處

  1. 有助於錯誤分析
    能夠協助快速定位錯誤發生的位置與原因。
  2. 可追蹤程式執行情況
    能清楚掌握程式哪些部分運作正常,哪些部分發生異常。
  3. 可進行系統監控
    在正式環境中,可以持續監控系統狀態,是營運維護的基礎。

print()的差異

初學者常使用的print()函式雖然方便,但在正式開發中有以下限制:

  • 無法靈活指定輸出位置(例如:檔案或外部服務)。
  • 無法管理日誌等級(訊息的重要性分類)。

透過 Python 標準的 logging 模組,可以解決上述問題。


3. 使用 Python 標準的 logging 模組開始輸出日誌

Python 提供標準的 logging 模組,可輕鬆進行日誌輸出。本節將說明其基本使用方法。

日誌等級概要

logging 模組中,可以為日誌訊息設定表示重要性的「日誌等級」。以下是主要的日誌等級:

  • DEBUG:除錯資訊,用於開發階段。
  • INFO:資訊訊息,顯示程式執行的進度。
  • WARNING:警告訊息,提示可能潛在問題。
  • ERROR:錯誤訊息,表示程式出現問題無法正確執行。
  • CRITICAL:重大錯誤,代表系統可能崩潰或異常中止。

基本用法

以下是使用 logging 模組進行簡單日誌輸出的範例:

import logging

# 基本日誌設定
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 各種日誌等級輸出範例
logging.debug('這是除錯資訊')
logging.info('這是一般資訊訊息')
logging.warning('這是警告訊息')
logging.error('這是錯誤訊息')
logging.critical('這是重大錯誤訊息')

程式碼說明

  • basicConfig:設定日誌輸出方式。透過 level 參數可指定最低輸出等級。
  • 格式設定format 參數可自訂日誌訊息格式。
  • 例如:%(asctime)s 表示時間戳記、%(levelname)s 表示日誌等級、%(message)s 表示日誌內容。

4. 將 Python 日誌輸出到檔案或主控台的方法

日誌不僅可以輸出到螢幕,也可以儲存到檔案或傳送到外部系統。本節將說明如何設定不同的輸出位置。

輸出到主控台

使用 logging 模組的預設設定時,日誌會輸出到主控台(Console)。

import logging

logging.basicConfig(level=logging.INFO)
logging.info('主控台日誌輸出範例')

輸出到檔案

若要將日誌儲存到檔案,可在 basicConfig 中指定 filename 參數。

import logging

logging.basicConfig(filename='app.log', level=logging.INFO, format='%(asctime)s - %(message)s')
logging.info('這是輸出到檔案的日誌範例')

同時輸出到主控台與檔案

若需同時輸出到多個位置,可使用 logging 的 Handler 機制。

import logging

# 建立 logger
logger = logging.getLogger('my_logger')
logger.setLevel(logging.DEBUG)

# 主控台處理器
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)

# 檔案處理器
file_handler = logging.FileHandler('app.log')
file_handler.setLevel(logging.INFO)

# 設定格式
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# 加入處理器到 logger
logger.addHandler(console_handler)
logger.addHandler(file_handler)

logger.info('這是同時輸出到主控台與檔案的日誌範例')

 


年収訴求

5. 在 Python 專案中有效使用日誌的技巧

本節將介紹在實際專案中實用的日誌最佳實踐。學習這些技巧可幫助提升除錯效率並改善日誌管理。

一致性的日誌設定

在大型專案中,維持一致的日誌設定非常重要。當多個模組或開發者共同協作時,統一格式與日誌等級設定能使分析與除錯更有效率。

以下是一個統一日誌設定的範例:

import logging

# 共用的日誌設定函式
def setup_logger(name, log_file, level=logging.INFO):
    handler = logging.FileHandler(log_file)
    handler.setFormatter(logging.Formatter('%(asctime)s - %(levelname)s - %(message)s'))

    logger = logging.getLogger(name)
    logger.setLevel(level)
    logger.addHandler(handler)
    return logger

# 為各模組建立 logger
app_logger = setup_logger('app_logger', 'app.log')
db_logger = setup_logger('db_logger', 'db.log')

# 日誌輸出範例
app_logger.info('應用程式的日誌訊息')
db_logger.error('資料庫的錯誤訊息')

例外處理與日誌輸出的結合

進行例外處理時,若能同時記錄日誌,將有助於更快速掌握錯誤的詳細內容。

以下為發生例外時的日誌記錄範例:

import logging

logging.basicConfig(filename='error.log', level=logging.ERROR, format='%(asctime)s - %(levelname)s - %(message)s')

try:
    # 故意觸發錯誤的程式碼
    1 / 0
except ZeroDivisionError as e:
    logging.error(f'發生除以零錯誤:{e}')

加入背景資訊的日誌訊息

根據專案需求,在日誌中加入額外的背景資訊(例如使用者 ID、交易 ID)可以讓分析更加全面。

import logging

logging.basicConfig(filename='context.log', level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

user_id = 12345
transaction_id = 'txn_001'

logging.info(f'使用者 ID: {user_id}, 交易 ID: {transaction_id} - 操作成功')

適當過濾日誌內容

當日誌產出量龐大時,可透過自訂過濾器來僅輸出需要的訊息。以下是過濾器的範例:

import logging

class DebugFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.DEBUG

logger = logging.getLogger('filtered_logger')
handler = logging.StreamHandler()
handler.addFilter(DebugFilter())

logger.addHandler(handler)
logger.setLevel(logging.DEBUG)

logger.debug('這是除錯日誌')
logger.info('這則訊息不會顯示')

6. 增強 Python 日誌功能的三大推薦套件

除了標準的 logging 模組之外,Python 社群還提供多個強大實用的日誌套件。本節將介紹三款特別受歡迎的工具。

Loguru:適合初學者的簡易日誌套件

特色:

  • 安裝與設定非常簡單。
  • 語法比標準 logging 更直觀。

安裝方式:

pip install loguru

基本用法:

from loguru import logger

logger.info('這是使用 Loguru 輸出的日誌')
logger.error('也能輕鬆記錄錯誤訊息')

Logzero:輕量級且易用的日誌套件

特色:

  • 輕鬆自訂設定。
  • 內建日誌輪替(rotation)功能。

安裝方式:

pip install logzero

基本用法:

from logzero import logger

logger.info('這是使用 Logzero 輸出的日誌')
logger.warning('這是一則警告訊息')

Structlog:專為結構化日誌設計的套件

特色:

  • 可輕鬆輸出 JSON 格式的日誌。
  • 適用於分散式系統與雲端環境。

安裝方式:

pip install structlog

基本用法:

import structlog

logger = structlog.get_logger()
logger.info('event', user='12345', action='login')

 


RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

7. 解決有關 Python 日誌輸出的常見疑問!

Q1. 為什麼日誌沒有被輸出?

解答:
請確認是否正確設定了日誌等級。預設情況下,只有 WARNING 以上等級的訊息會被輸出。

Q2. 如果日誌檔案變得太大怎麼辦?

解答:
可以使用 RotatingFileHandler,根據檔案大小自動進行輪替,避免單一檔案過大。

Q3. 要如何選擇第三方日誌套件?

解答:
可根據專案的規模與需求選擇。若是小型專案建議使用 Loguru;若需要結構化日誌則推薦 Structlog

8. 精通 Python 日誌輸出,提升開發效率!

本文從 Python 日誌輸出的基礎知識到進階技巧,以及實用的第三方套件都進行了說明。透過適當的日誌設計,不僅能有效除錯,還能大幅提升系統監控與維運的效率。
趕快開始在你的專案中實踐這些技巧吧!