Python FileHandler需手动创建父目录,建议用os.makedirs;推荐绝对路径;Formatter需datefmt="%Y-%m-%d %H:%M:%S,%f"并截毫秒;模块名用%(module)s;多Handler写同文件会冲突;dictConfig中formatter名须严格匹配。

FileHandler路径写相对路径会出错
Python的FileHandler不自动创建父目录,路径里任何一级目录不存在就会抛FileNotFoundError。比如写"logs/app.log",但logs/目录根本没建,程序直接崩。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 用
os.makedirs(os.path.dirname(log_path), exist_ok=True)提前建好目录 - 路径尽量用绝对路径,比如
os.path.join(os.path.dirname(__file__), "logs", "app.log") - 别依赖当前工作目录(
cwd),不同启动方式(IDE / shell / systemd)下cwd可能完全不同
Formatter时间戳默认不带毫秒,模块名字段名容易写错
想显示2024-05-22 14:30:45,123这种带毫秒的时间,光靠%(asctime)s不够,默认只到秒;模块名要用%(module)s,不是%(name)s(后者是logger名,比如"myapp.api")。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 在
Formatter初始化时传datefmt:例如datefmt="%Y-%m-%d %H:%M:%S,%f",注意%f是微秒,需截取前3位或用time.strftime手动处理 - 模块名字段必须写
%(module)s,如果想同时显示函数名和行号,加%(funcName)s:%(lineno)d - 完整格式字符串示例:
"%(asctime)s | %(levelname)-8s | %(module)s | %(message)s"
多个FileHandler共用一个文件时日志会乱序或丢失
多个进程、或同一进程里多个FileHandler实例指向同一个文件路径,会导致写入冲突——内容覆盖、换行错位、甚至部分日志彻底消失。这不是Python bug,是操作系统级的文件写入竞争。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 单进程场景下,确保全局只创建一次
FileHandler,复用它,不要每个模块都logging.FileHandler(...) - 多进程必须用
RotatingFileHandler或TimedRotatingFileHandler,并设置delay=True避免提前打开文件 - 真要多进程写同一文件,改用
concurrent_log_handler第三方包,它内部用文件锁规避冲突
配置字典里formatter引用名写错导致Handler没生效
用dictConfig配置时,handlers里写"formatter": "simple",但formatters段里定义的是"default",结果日志全按默认格式输出——没报错,但配置静默失效。
实操建议:
立即学习“Python免费学习笔记(深入)”;
- 检查
formatters和handlers里的名字是否完全一致(大小写敏感) - 用
logging.config.dictConfig(config)后,立刻调logging.getLogger().handlers确认handler是否真的挂上去了 - 调试时临时加一句
logging.getLogger().debug("test"),看输出格式是否符合预期,比查配置快得多
路径权限、时区、多线程下的asctime一致性,这些细节不会报错,但会让日志看起来“不太对”。动手前先跑个最小可复现脚本,比对着文档猜强得多。










