Python脚本通过crontab运行,如何配置logging同时写入两个日志位置?
问题分析与解决方案
你的问题核心原因是:logging.StreamHandler默认输出到标准错误流(stderr),而crontab配置里的>>仅重定向标准输出流(stdout),所以StreamHandler的内容不会被写入/var/log/app/script_log.txt;而print语句默认输出到stdout,所以之前能被捕获。
当然可以配置logger同时写入两个日志位置,下面给两种可行方案:
方案一:修改StreamHandler的输出流为stdout,适配crontab的重定向
直接让StreamHandler输出到stdout,这样crontab的>>就能捕获到日志内容,同时保留FileHandler写入data.log。
修改后的logging配置代码:
import sys import logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler("data.log"), logging.StreamHandler(sys.stdout) # 指定输出到stdout ] )
这样配置后,日志会同时写入data.log和被crontab重定向到/var/log/app/script_log.txt。
方案二:直接添加FileHandler指向目标日志文件
如果不想依赖crontab的重定向,也可以直接给logger添加一个指向/var/log/app/script_log.txt的FileHandler,让日志主动写入该文件,同时保留原有的data.log输出。
示例代码:
import logging logger = logging.getLogger(__name__) logger.setLevel(logging.INFO) # 配置格式器 formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') # 处理data.log的handler data_handler = logging.FileHandler("data.log") data_handler.setFormatter(formatter) logger.addHandler(data_handler) # 处理script_log.txt的handler script_handler = logging.FileHandler("/var/log/app/script_log.txt") script_handler.setFormatter(formatter) logger.addHandler(script_handler)
这种方式更直接,日志会主动写入两个文件,不受crontab重定向的影响。
额外注意事项
- 如果使用相对路径的
data.log,要注意脚本运行时的工作目录(crontab的默认工作目录通常是用户主目录),建议改为绝对路径避免找不到文件的问题。 - 确保运行脚本的用户对
/var/log/app/目录有写入权限,否则日志会写入失败。
内容的提问来源于stack exchange,提问作者Mate Mrše
相关产品推荐
相关产品推荐

