管理由 cron 作业创建的日志文件

Posted

技术标签:

【中文标题】管理由 cron 作业创建的日志文件【英文标题】:Managing log files created by cron jobs 【发布时间】:2017-06-04 22:58:57 【问题描述】:

我有一个每天将其日志文件复制到我的主文件夹的 cron 作业。

每天它都会覆盖目标文件夹中的现有文件,这是预期的。我想保留以前日期的日志,以便下次将文件复制到目标文件夹时,它会保留以前日期的文件。

我该怎么做?

【问题讨论】:

你在 crontab 中的命令是什么?我认为您可以在日志文件名中添加一个日期,例如 filename_20170120.log 以避免覆盖。 Append current date to the filename via Cron?、Sending cron output to a file with a timestamp in its name、How to add the logs to a crontab with time stamp、How can cron output to a new log file based on date?、How to log cron jobs? 等可能重复 为什么不使用 logrotate 呢? 【参考方案1】:

插入

`date +%F`

到你的cp 命令,像这样:

cp /path/src_file /path/dst_file_`date +%F`

所以它会将src_file复制到dst_file_2017-01-20

更新:

正如@tripleee 所注意到的,% 字符应该在cron 中转义,因此您的 cron 作业将如下所示:

0 3 * * * cp /path/src_file /path/dst_file_`date +\%F`

【讨论】:

请注意,您不能在 crontab 中执行此操作,因为 cron 使用 % 表示换行符。在您的 cron 中,您需要对任何文字 % 进行反斜杠转义。【参考方案2】:

管理 cron 日志的最佳方法是对每个作业进行包装。包装器至少可以做这些事情:

初始化环境 将 stdout 和 stderr 重定向到日志 运行作业 检查作业是否成功 必要时发送通知 清理日志

这是 cron 包装器的基本版本:

#!/bin/bash

log_dir=/tmp/cron_logs/$(date +'%Y%m%d')
mkdir -p "$log_dir" ||  echo "Can't create log directory '$log_dir'"; exit 1; 

#
# we write to the same log each time
# this can be enhanced as per needs: one log per execution, one log per job per execution etc.
#
log_file=$log_dir/cron.log

#
# hitherto, both stdout and stderr end up in the log file
#
exec 2>&1 1>>"$log_file"

#
# Run the environment setup that is shared across all jobs.
# This can set up things like PATH etc. 
#
# Note: it is not a good practice to source in .profile or .bashrc here
#
source /path/to/setup_env.sh

#
# run the job
#
echo "$(date): starting cron, command=[$*]"
"$@"
echo "$(date): cron ended, exit code is $?"

您的 cron 命令行如下所示:

/path/to/cron_wrapper command ...

一旦完成,我们可以有另一个名为cron_log_cleaner 的作业,它可以删除旧日志。最后从 cron 包装器本身调用日志清理器不是一个坏主意。


一个例子:

# run the cron job from command line
cron_wrapper 'echo step 1; sleep 5; echo step 2; sleep 10'

# inspect the log
cat /tmp/cron_logs/20170120/cron.log

运行打包的 cron 作业后,日志将包含以下内容:

Fri Jan 20 04:35:10 UTC 2017: starting cron, command=[echo step 1; sleep 5; echo step 2; sleep 10]
step 1
step 2
Fri Jan 20 04:35:25 UTC 2017: cron ended, exit code is 0

【讨论】:

包装器可能会有所帮助,但请注意 cron 的日志级别 7 已经记录了开始、结束、命令及其错误 + 退出代码。参照。 man(8) (当然是指 Vixie Cron)。

以上是关于管理由 cron 作业创建的日志文件的主要内容,如果未能解决你的问题,请参考以下文章

如果命令输出重定向到日志文件,则cron停止发送错误邮件

如何为crontab日志创建文件夹(如果不存在),并根据日期将日志写入特定文件夹?

如何记录 cron 作业?

cron 作业无法读取以前的 cron 日志

shell脚本每天创建带有时间戳的文件夹并推送时间戳生成的日志

logrotate cron 作业不旋转某些日志