如何为Crontab日志按需创建目录并按日期分目录存储日志
解决Crontab日志按年/月/日分层存储的问题
没问题,这个需求用shell的日期工具加上递归目录创建就能轻松搞定,我给你两种实用方案,按需选就行:
方案一:直接在Crontab命令里处理目录和日志路径
如果你不想修改原有脚本,直接改crontab的任务命令就可以。核心思路是用date命令动态生成年/月/日的目录结构,再用mkdir -p确保目录存在,最后把日志写入对应路径。
比如你原来的crontab任务可能是这样的:
* * * * * /path/to/your/task.sh > /tmp/result_$(date +%d_%m_%Y_%H%M).log 2>&1
把它改成下面这样(这里月份用数字格式,比如03代表3月):
* * * * * LOG_PATH="/tmp/$(date +%Y)/$(date +%m)/$(date +%d)"; mkdir -p "$LOG_PATH"; /path/to/your/task.sh > "$LOG_PATH/result_$(date +%H%M).log" 2>&1
如果想要月份用英文全称(比如March),只需要把$(date +%m)换成$(date +%B):
* * * * * LOG_PATH="/tmp/$(date +%Y)/$(date +%B)/$(date +%d)"; mkdir -p "$LOG_PATH"; /path/to/your/task.sh > "$LOG_PATH/result_$(date +%H%M).log" 2>&1
关键部分解释:
$(date +%Y):获取当前4位年份(比如2018)$(date +%m):获取两位数字月份(01-12),$(date +%B)获取英文全称(January-December)$(date +%d):获取两位数字日期(01-31)mkdir -p "$LOG_PATH":递归创建所有不存在的目录,即使父目录(比如年份、月份目录)还没创建也能一次性生成,不会报错2>&1:把错误输出也重定向到日志文件里,避免crontab因为任务报错给你发垃圾邮件
方案二:把目录逻辑写到脚本里(更整洁)
如果你的任务是运行一个自定义脚本,推荐把目录创建的逻辑整合到脚本里,这样crontab的命令会更简洁,也方便后续维护。
修改你的脚本(比如task.sh),在开头加上目录处理的代码:
#!/bin/bash # 生成日志目录路径,这里用数字月份,想要英文的话把%m换成%B LOG_DIR="/tmp/$(date +%Y)/$(date +%m)/$(date +%d)" # 递归创建目录 mkdir -p "$LOG_DIR" # 生成日志文件名,因为已经在日期目录里了,只保留时分就够,避免重复信息 LOG_FILE="$LOG_DIR/result_$(date +%H%M).log" # 原来的任务逻辑,把输出都定向到日志文件 your_original_task_commands_here > "$LOG_FILE" 2>&1
然后crontab里只需要保留最基础的任务调用:
* * * * * /path/to/your/task.sh
这样每次任务运行时,脚本会自动检查并创建对应的年/月/日目录,然后把日志写入正确的位置。
内容的提问来源于stack exchange,提问作者Achive Archive
相关产品推荐
相关产品推荐

