编写Shell脚本实现Python输出每日轮换日志(无需logrotate)
解决日志文件每日自动轮换问题(不使用logrotate)
原脚本的问题很明确:循环末尾的>> "log/$filename"是在循环启动前就绑定了当日的日志文件句柄,后续哪怕循环里更新了filename变量,系统已经打开的文件连接不会自动切换,自然没法写入新日期的日志文件。
方案一:简单直接版(适合输出频率不高的场景)
每次处理一行日志时,都重新定位到当日的日志文件,确保写入正确的目标文件:
# 先确保日志目录存在,避免因目录缺失报错 mkdir -p log python3 -u HelloWord_every10secs.py 2>&1 | while IFS= read -r line; do # 生成带毫秒级时间戳的日志内容 timestamped_line="$(date +%Y-%m-%d__%H:%M:%S:%3N) $line" # 获取当前日期对应的日志文件名 today_log="log/log-$(date +%Y-%m-%d).log" # 将内容追加到当日日志文件 echo "$timestamped_line" >> "$today_log" done
方案二:性能优化版(适合高频率输出场景)
通过复用文件描述符,减少频繁打开/关闭文件的开销,只在日期变更时切换日志文件:
mkdir -p log # 初始化当日日志文件并打开专属文件描述符 current_log="log/log-$(date +%Y-%m-%d).log" exec 3>>"$current_log" # 用文件描述符3指向当前日志文件 python3 -u HelloWord_every10secs.py 2>&1 | while IFS= read -r line; do # 检查当前日期是否已变更 new_log="log/log-$(date +%Y-%m-%d).log" if [ "$new_log" != "$current_log" ]; then exec 3>&- # 关闭旧的文件描述符 exec 3>>"$new_log" # 切换到新的日志文件 current_log="$new_log" fi # 将带时间戳的内容写入当前日志 echo "$(date +%Y-%m-%d__%H:%M:%S:%3N) $line" >&3 done # 脚本结束后关闭文件描述符 exec 3>&-
两个方案都能实现日期变更时自动切换日志文件,完全不需要依赖logrotate工具。
内容的提问来源于stack exchange,提问作者NNN123
相关产品推荐
相关产品推荐

