生產環境日誌需按日期歸檔管理。Python logging.handlers.TimedRotatingFileHandler 支援多種時間維度輪轉,但直接套用官方配置會導致 Tornado 內建 Logger 失效。本文提供完整 YAML 配置方案,確保根 Logger 與 Tornado Logger 共用輪轉處理器。
logging.yaml 完整配置
# logging.yaml
version: 1
disable_existing_loggers: false
formatters:
simple:
format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
loggers:
all:
handlers: [all]
propagate: false
tornado:
handlers: [all]
propagate: false
handlers:
console:
class: logging.StreamHandler
level: INFO
formatter: simple
stream: ext://sys.stdout
all:
class: logging.handlers.TimedRotatingFileHandler
level: INFO
formatter: simple
when: midnight
filename: ./logs/server.log
root:
level: INFO
handlers: [console, all]
propagate: true
關鍵配置解析
| 配置項 | 作用 |
disable_existing_loggers: false | 保留現有 Logger(關鍵!預設 true 會關閉 Tornado Logger) |
loggers.tornado | 明確指定 tornado Logger 使用同一處理器 |
propagate: false | 避免重複傳遞至 root 造成雙重記錄 |
when: midnight | 每日午夜 00:00 輪轉(而非啟動後 24 小時) |
filename | 基礎日誌檔名,輪轉後自動加後綴 (如 server.log.2024-01-15) |
應用程式啟動載入
import logging.config
import yaml
logging.config.dictConfig(yaml.load(open('logging.yaml', 'r')))
when 參數選項
| 值 | 輪轉週期 | 說明 |
S | 秒 | 高頻除錯用 |
M | 分 | |
H | 時 | |
D | 天 | 從啟動時間起算 24 小時 |
midnight | 每日午夜 | 推薦生產環境 |
W0-W6 | 每週 | 0=週一 |
CentOS 依賴安裝
sudo yum install python-yaml
驗證輪轉效果
ls -la logs/
# server.log (當前)
# server.log.2024-01-15
# server.log.2024-01-14