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接入时,配置与轮转命名匹配的路径,写入一条带唯一标识的测试日志,再在轮转后重复验证;同时核对读取权限与多行异常是否完整。

常见问题(FAQ)

Q:日志同时输出到文件和控制台?
A:再加一个 StreamHandler,两个 handler 挂到同一个 logger 上。

Q:中文日志乱码?
A:FileHandler 加 encoding="utf-8"。

Q:多个进程写同一个日志文件安全吗?
A:不安全,可能交错写坏。多进程场景用 concurrent_log_handler 的 ConcurrentRotatingFileHandler,或各进程写独立文件。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

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

立即开始

选择观测云版本

代码托管平台