题 在目录及其子目录中记录文件


有可能得到 logrotate 考虑目录及其所有子目录中的日志文件? (即没有明确列出子目录。)


55
2017-12-01 18:31






答案:


你的子目录有多深?

/var/log/basedir/*.log /var/log/basedir/*/*.log {
    daily
    rotate 5
}

将全部旋转 .LOG basedir /以及所有文件 .LOG 在basedir的任何直接子节点中的文件。如果你还需要更深一级,只需添加另一个 /var/log/basedir/*/*/*.log 直到你覆盖每个级别。

这可以通过使用单独的logrotate配置文件进行测试,该文件包含一个不能满足的约束(高minsize),然后在详细模式下运行log rotation

logrotate -d testconfig.conf

-d标志将列出它正在考虑旋转的每个日志文件。


74
2017-12-01 18:49



谢谢!好像 -d 实际上,logrotate处于干运行模式(即实际上并没有改变任何东西)。 - ithinkihaveacat
不是直接相关,但可能对某人有用。该 -f 选项告诉logrotate“强制运行”。命令末尾的单词是要使用的配置文件而不是默认值。所以 logrotate -f /some/config 意味着使用该配置文件运行,并且即使配置文件说它还没有时间运行,也总是运行。对于我未经训练的眼睛,以及那个用它做过cron工作的前任,似乎是 -f 只是指定配置文件。相当混乱。 - Dan Pritts


在我的例子中,子目录的深度可以在没有警告的情况下改变,因此我设置了一个bash脚本来查找所有子目录并为每个目录创建一个配置条目。对于我来说,在轮换之后保持子目录的结构也很重要,这些通配符(即@ DanR的答案)似乎没有。如果您正在进行日常日志记录,则可以将此脚本放在每日cron-job中。

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


4
2018-02-16 16:32





它是旧线程,但您可以执行以下操作:

/var/log/basedir/**/*.log {
    daily
    rotate 5
}

这两颗星将匹配零个或多个目录。但是,您必须小心定义要旋转的日志文件,因为您可以旋转已经旋转的文件。我会在这里引用logrotate的手册。

请谨慎使用通配符。如果指定*,则logrotate将旋转所有文件,包括先前旋转的文件。解决这个问题的方法是使用olddir指令或更精确的通配符(例如* .log)。


1
2018-03-24 12:28



这种通配符模式对我不起作用。在RHEL 7.3上Logrotate 3.8.6 - northben
也许你应该启用 globstar 在运行logrotate之前。这将使它成为bash shopt -s globstar。 - bat_ventzi
我也有同样的问题。在Ubuntu 16.04.3上Logrotate 3.8.7。 ls /var/log/basedir/**/*.log按照描述工作,但logrotate没有。 - frogstarr78