Skip to content

控制台與檔案日誌

學習控制台和檔案日誌之間的差異,以及何時使用每種方法。

🖥️ 控制台日誌

控制台日誌直接輸出到終端,非常適合開發和除錯。

基本控制台設定

python
from pretty_loguru import create_logger

# 僅使用控制台日誌
logger = create_logger(
    name="demo",
    console_only=True
)

logger.info("這會出現在控制台")
logger.debug("開發用的除錯資訊")
logger.success("操作成功完成!")
logger.warning("這是一條警告訊息")
logger.error("發生了錯誤")

控制台輸出格式化

python
from pretty_loguru import create_logger

# 配置控制台的自訂格式
logger = create_logger(
    name="console_demo",
    level="DEBUG",
    console_only=True,
    format="<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | <level>{message}</level>"
)

logger.info("乾淨的控制台輸出")
logger.debug("帶時間戳的除錯資訊")

Rich 控制台功能

python
from pretty_loguru import create_logger

# 建立日誌記錄器實例
logger = create_logger(
    name="demo",
    log_path="logs",
    level="INFO"
)

# 在控制台使用視覺化功能
logger.block("狀態報告", [
    "✅ 資料庫:已連接",
    "✅ API:執行於連接埠 8000",
    "⚠️  快取:已使用 85%"
], border_style="green")

logger.ascii_header("系統啟動", font="slant")

📁 檔案日誌

檔案日誌將日誌儲存到磁碟,用於持久化、稽核和分析。

基本檔案設定

python
from pretty_loguru import create_logger

# 僅使用檔案日誌
logger = create_logger(
    name="demo",
    log_path="logs",
    console_only=False  # 啟用檔案日誌
)

logger.info("這條訊息會儲存到檔案")
logger.error("錯誤會被持久化以供調查")

自訂檔案配置

python
from pretty_loguru import create_logger

# 配置帶輪換的檔案日誌
logger = create_logger(
    name="my_app",
    level="INFO",
    log_path="application_logs",
    rotation="10MB",  # 檔案達到 10MB 時輪換
    retention="7 days",  # 保留日誌 7 天
    compression="gz"  # 壓縮舊檔案
)

logger.info("已啟用輪換的檔案日誌")

多個日誌檔案

python
from pretty_loguru import create_logger, get_logger

# 初始化基礎日誌記錄器
logger = create_logger(
    name="multi_file",
    level="DEBUG", 
    log_path="logs"
)

# 使用 loguru 的原生功能添加特定錯誤檔案
logger.add(
    "logs/errors.log",
    level="ERROR",
    rotation="5MB",
    retention="30 days",
    format="{time} | {level} | {name}:{function}:{line} - {message}"
)

# 添加稽核追蹤檔案
logger.add(
    "logs/audit.log",
    level="INFO",
    filter=lambda record: "audit" in record["extra"],
    rotation="daily"
)

# 使用方式
logger.info("一般日誌訊息")
logger.error("這會同時記錄到一般日誌和錯誤日誌")
logger.bind(audit=True).info("稽核追蹤條目")  # 僅記錄到 audit.log

🔄 控制台 + 檔案組合日誌

最常見的設定是同時使用控制台和檔案輸出。

混合配置

python
from pretty_loguru import create_logger

# 同時初始化控制台和檔案
logger = create_logger(
    name="web_app",
    level="DEBUG",
    log_path="logs"
    # console_only=False 是預設值
)

# 控制台顯示 INFO 及以上,檔案捕獲所有內容
logger.debug("除錯資訊(僅檔案)")
logger.info("資訊訊息(控制台 + 檔案)")
logger.error("錯誤訊息(控制台 + 檔案)")

控制台與檔案的不同等級

python
from pretty_loguru import create_logger

# 基礎初始化
logger = create_logger(
    name="level_demo",
    level="DEBUG", 
    log_path="logs"
)

# 移除預設控制台處理器並添加自訂處理器
logger.remove()

# 控制台:INFO 及以上,帶顏色
logger.add(
    sink=lambda msg: print(msg, end=""),
    format="<green>{time:HH:mm:ss}</green> | <level>{level: <8}</level> | <level>{message}</level>",
    level="INFO",
    colorize=True
)

# 檔案:包括除錯的所有內容
logger.add(
    "logs/app.log",
    format="{time} | {level} | {name}:{function}:{line} - {message}",
    level="DEBUG",
    rotation="20MB",
    retention="14 days"
)

# 測試不同等級
logger.debug("除錯:僅在檔案中")
logger.info("資訊:控制台和檔案")
logger.warning("警告:控制台和檔案")
logger.error("錯誤:控制台和檔案")

📊 比較表

功能控制台日誌檔案日誌組合
持久性❌ 重啟後遺失✅ 永久儲存✅ 兩全其美
即時監控✅ 即時反饋❌ 需手動檢查檔案✅ 即時 + 歸檔
效能⚠️ 可能拖慢應用✅ 非同步寫入⚠️ 中等影響
儲存❌ 無儲存⚠️ 需要磁碟空間⚠️ 需要磁碟空間
分析❌ 難以分析✅ 日誌聚合工具✅ 靈活分析
開發✅ 非常適合開發❌ 不太方便✅ 理想設定
生產❌ 不適合✅ 稽核必需✅ 推薦使用

🎯 何時使用

僅控制台

  • 開發環境
  • 快速除錯會話
  • 互動式腳本
  • 一次性工具
python
# 開發設定
from pretty_loguru import create_logger

logger = create_logger(
    name="console_demo",
    log_path=None,  # 僅控制台
    level="INFO"
)
logger.info("非常適合開發")

僅檔案

  • 背景服務
  • 批次處理
  • 無監控的生產系統
  • 無法存取控制台輸出時
python
# 背景服務
from pretty_loguru import create_logger
import sys

# 停用控制台輸出
logger = create_logger(
    name="background_service",
    level="INFO",
    log_path="service_logs"
)

# 移除所有控制台處理器
for handler_id in logger._core.handlers.copy():
    if logger._core.handlers[handler_id]._sink._stream in (sys.stdout, sys.stderr):
        logger.remove(handler_id)

logger.info("服務已啟動 - 僅記錄到檔案")

組合(推薦)

  • 網路應用程式
  • API 和微服務
  • 有監控的生產系統
  • 任何需要即時反饋和持久性的系統
python
# 生產就緒設定
from pretty_loguru import create_logger

logger = create_logger(
    name="api_server",
    level="INFO",
    log_path="logs",
    rotation="50MB",
    retention="30 days"
)

logger.info("API 伺服器啟動中...")
logger.success("伺服器準備就緒 - 同時記錄到控制台和檔案")

🔧 進階場景

基於環境的配置

python
import os
from pretty_loguru import create_logger

env = os.getenv('ENVIRONMENT', 'development')

if env == 'development':
    # 開發:僅控制台,除錯等級
    logger = create_logger(name="dev", level="DEBUG", console_only=True)
elif env == 'testing':
    # 測試:僅檔案,避免混亂測試輸出
    logger = create_logger(name="test", level="INFO", log_path="test_logs", console_only=False)
    logger.remove()  # 移除控制台處理器
    logger.add("test_logs/test.log", level="INFO")
else:
    # 生產:控制台和檔案都使用
    logger = create_logger(
        name="prod_app",
        level="INFO",
        log_path="logs",
        rotation="100MB",
        retention="90 days"
    )

logger.info(f"日誌記錄器已配置為 {env} 環境")

動態切換

python
from pretty_loguru import create_logger

class LoggerManager:
    def __init__(self):
        self.logger = create_logger(name="managed", level="INFO")
        self.file_handler_id = None
        self.console_handler_id = None
        
    def enable_console(self):
        if self.console_handler_id is None:
            self.console_handler_id = self.logger.add(
                sink=lambda msg: print(msg, end=""),
                format="<green>{time:HH:mm:ss}</green> | <level>{level}</level> | <level>{message}</level>",
                level="INFO",
                colorize=True
            )
    
    def disable_console(self):
        if self.console_handler_id is not None:
            self.logger.remove(self.console_handler_id)
            self.console_handler_id = None
    
    def enable_file(self, path="logs/app.log"):
        if self.file_handler_id is None:
            self.file_handler_id = self.logger.add(
                path,
                level="DEBUG",
                rotation="10MB"
            )
    
    def disable_file(self):
        if self.file_handler_id is not None:
            self.logger.remove(self.file_handler_id)
            self.file_handler_id = None

# 使用方式
log_manager = LoggerManager()
log_manager.enable_console()
log_manager.logger.info("控制台已啟用")

log_manager.enable_file()
log_manager.logger.info("檔案日誌已啟用")

log_manager.disable_console()
log_manager.logger.info("控制台已停用 - 僅檔案")

根據您的應用程式需求和環境選擇正確的日誌策略!

基於 MIT 許可證發布