是否可以logrotate
考虑目录及其所有子目录中的日志文件?(即,没有明确列出子目录。)
是否可以logrotate
考虑目录及其所有子目录中的日志文件?(即,没有明确列出子目录。)
Answers:
您的子目录有多深?
/var/log/basedir/*.log /var/log/basedir/*/*.log {
daily
rotate 5
}
将旋转所有的.log在BASEDIR /文件,以及所有的.log在BASEDIR的任何直接的子文件。如果您还需要更深一层,只需添加另一层,/var/log/basedir/*/*/*.log
直到覆盖了每个层。
这可以通过使用单独的logrotate配置文件进行测试,该文件包含不满足的约束(最小大小),然后以详细模式运行日志自己旋转
logrotate -d testconfig.conf
-d标志将列出要轮换的每个日志文件。
-f
选项告诉logrotate“强制运行”。命令末尾的裸字是要使用的配置文件,而不是默认文件。因此,logrotate -f /some/config
意味着使用该配置文件运行,并且即使该配置文件显示尚未运行,也始终运行。对我未经训练的眼睛,以及对我进行此工作的前任来说,似乎-f
只是在指定配置文件。相当混乱。
就我而言,子目录的深度可以更改而不会发出警告,因此我设置了一个bash脚本来查找所有子目录并为每个目录创建一个配置条目。
对于我来说,旋转后保持子目录的结构也很重要,通配符(即@DanR的答案)似乎并没有这样做。如果您每天进行日志轮换,则可以将此脚本放入日常cron作业中。
basedir=/var/log/basedir/
#destdir=${basedir} # if you want rotated files in the same directories
destdir=/var/log/archivedir/ #if you want rotated files somewhere else
config_file=/wherever/you/keep/it
> ${config_file} #clear existing config_file contents
subfolders = $(find ${basedir} -type d)
for ii in ${subfolders}
do
jj=${ii:${#basedir}} #strip off basedir, jj is the relative path
#append new entry to config_file
echo "${basedir}${jj}/* {
olddir ${destdir}${jj}/
daily
rotate 5
}" >> ${config_file}
#add one line as spacing between entries
echo "\n" >> ${config_file}
#create destination folder, if it doesn't exist
[ -d ${destdir}${jj} ] || mkdir ${destdir}${jj}
done
就像@DanR建议的那样,用 logrotate -d
它是旧线程,但是您可以执行以下操作:
/var/log/basedir/**/*.log {
daily
rotate 5
}
这两颗星将匹配零个或多个目录。但是,您必须小心如何定义要轮换的日志文件,因为您可以轮换已经轮换的文件。我将在此处引用logrotate的手册。
请谨慎使用通配符。如果指定*,logrotate将旋转所有文件,包括先前旋转的文件。一种解决方法是使用olddir指令或更精确的通配符(例如* .log)。
globstar
在运行logrotate之前启用它。这将使其启用bash shopt -s globstar
。
-d
实际上使logrotate处于空运行模式(即实际上并未更改任何内容)。