Python 中如何把日志写入文件?
Python 写日志到文件:logging.basicConfig(filename='app.log') 最简单;FileHandler 更灵活;RotatingFileHandler 支持轮转。本文介绍各种方式。
最简单:logging.basicConfig(filename="app.log", level=logging.INFO),之后的 logging 调用自动写入文件。需要轮转用 RotatingFileHandler。
方式一:basicConfig 一行搞定
import logging
logging.basicConfig(
filename="app.log",
filemode="a", # a=追加(默认),w=每次覆盖
level=logging.INFO,
format="%(asctime)s [%(levelname)s] %(name)s: %(message)s"
)
logging.info("程序启动")
logging.warning("磁盘空间不足")
方式二:FileHandler(更灵活)
import logging
logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler("app.log", encoding="utf-8")
fh.setFormatter(logging.Formatter("%(asctime)s [%(levelname)s] %(message)s"))
logger.addHandler(fh)
logger.info("写入文件的日志")
方式三:RotatingFileHandler(生产推荐)
防止日志文件无限增长:
from logging.handlers import RotatingFileHandler
fh = RotatingFileHandler(
"app.log",
maxBytes=10*1024*1024, # 单文件最大 10MB
backupCount=5, # 保留 5 个旧文件
encoding="utf-8"
)
写满 10MB 自动轮转为 app.log.1、app.log.2……最旧的被删除。
观测云对照
写到文件的日志由观测云 DataKit 采集到平台统一检索告警;容器环境更推荐直接输出到 stdout 由平台采集。
常见问题(FAQ)
Q:日志同时输出到文件和控制台?
A:再加一个 StreamHandler,两个 handler 挂到同一个 logger 上。
Q:中文日志乱码?
A:FileHandler 加 encoding="utf-8"。
Q:多个进程写同一个日志文件安全吗?
A:不安全,可能交错写坏。多进程场景用 concurrent_log_handler 的 ConcurrentRotatingFileHandler,或各进程写独立文件。