Loguru日志异常:错误信息仅输出至终端不写入日志文件
问题解决:Loguru在cron任务中缺失错误日志的处理方案
核心问题分析
- cron环境下相对路径易失效,导致Loguru写入的日志文件并非预期路径
- 未配置
catch=True,Loguru无法捕获全局未处理异常,异常直接输出到sys.stderr而非日志文件 - 非交互式环境下的日志缓冲机制可能导致日志丢失
- bash脚本与Loguru同时写入同一日志文件,易引发写入冲突
解决方案步骤
1. 修复Loguru配置,确保路径正确并捕获异常
修改Python代码中的Loguru配置,使用绝对路径、添加catch=True和enqueue=True参数:
import sys import os from loguru import logger # 计算绝对路径,避免cron环境下路径错误 script_dir = os.path.dirname(os.path.abspath(__file__)) # 根据项目目录结构调整root_dir层级 root_dir = os.path.dirname(os.path.dirname(script_dir)) log_file_path = os.path.join(root_dir, "backend", "cron_run.log") logger.remove(0) log_format = "<green>{time:YYYY-MM-DD HH:mm:ss.SSS zz}</green> | <level>{level: <8}</level> | <yellow>Line {line: >4} ({file}):</yellow> <b>{message}</b>" # 输出到stdout的配置 logger.add( sys.stdout, level=log_level, format=log_format, colorize=True, backtrace=True, diagnose=True, catch=True, # 捕获全局未处理异常 enqueue=True # 异步写入避免缓冲丢失 ) # 输出到文件的配置 logger.add( log_file_path, rotation="2 MB", level=log_level, format=log_format, colorize=False, backtrace=True, diagnose=True, catch=True, enqueue=True )
2. 修改bash脚本,避免日志文件冲突
移除bash中手动写入cron_run.log的逻辑,交由Loguru统一管理日志;如需记录启动时间,可写入单独文件:
#!/bin/bash # 获取脚本目录并切换到项目根目录 CURR_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" cd $CURR_DIR/.. # 激活虚拟环境 source backend/venv/bin/activate # (可选)将启动时间写入单独日志文件,避免与Loguru冲突 start_log="backend/cron_start.log" if [ -s $start_log ]; then echo -e "\n\n[$(TZ=America/Los_Angeles date)]" >> $start_log else echo -e "[$(TZ=America/Los_Angeles date)]" >> $start_log fi # 运行Python程序 python3 backend/Scripts/recap/recap.py
关键参数说明
- 绝对路径:cron默认工作目录为用户home目录,相对路径会导致Loguru写入错误位置,用
os.path模块计算绝对路径确保日志写入预期文件 - catch=True:拦截所有未被程序捕获的异常,将其转为Loguru的ERROR级别日志写入所有sink
- enqueue=True:启用异步日志队列,解决非交互式环境下的输出缓冲问题,确保日志及时写入文件
- 分离日志写入:避免bash与Loguru同时操作同一个文件,防止内容混乱或日志丢失
内容的提问来源于stack exchange,提问作者NFeruch - FreePalestine
相关产品推荐
相关产品推荐

