You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:56:18