Python 中如何把日志写入文件?

Python 写日志到文件:logging.basicConfig(filename='app.log') 最简单;FileHandler 更灵活;RotatingFileHandler 支持轮转。本文介绍各种方式。

最佳实践
Python 中如何把日志写入文件?封面

最简单: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,或各进程写独立文件。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台