记录目录及其子目录中的文件

记录目录及其子目录中的文件

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

答案1

你的子目录有多深?

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

将轮换所有。日志basedir/ 中的文件以及所有。日志basedir 的任何直接子目录中的文件。如果您还需要进一步深入 1 级,只需添加另一级,/var/log/basedir/*/*/*.log直到覆盖每个级别。

可以使用单独的 logrotate 配置文件进行测试,该文件包含无法满足的约束(较高的最小尺寸),然后在详细模式下自行运行 log rotate

logrotate -d testconfig.conf

-d 标志将列出正在考虑轮换的每个日志文件。

答案2

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

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

这两个星号将匹配零个或多个目录。不过,您必须小心定义要轮换的日志文件,因为您可以轮换已经轮换的文件。我在这里引用了 logrotate 的手册。

请谨慎使用通配符。如果您指定 *,logrotate 将轮换所有文件,包括之前轮换过的文件。解决此问题的方法是使用 olddir 指令或更精确的通配符(例如 *.log)。

答案3

就我而言,子目录的深度可能会在没有警告的情况下发生变化,因此我设置了一个 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

答案4

经过反复试验,最终我的通配符模式成功了,因为我在一个文件夹中有日志文件,后面是 IP,然后是主机名,然后是实际的日志文件夹。

我有第二个硬盘作为虚拟机,因此我指定日志使用以下路径:

/mnt/logs/var/log/remotes/10.4.11.12/pve2-test

我在 remotes 文件夹中列出了几个远程服务器,后面是其主机名。我不想改变这个结构,所以想出了如何使用真正有效的通配符。

/mnt/logs/var/log/remotes/1*/**/*.log

我试过 /mnt/logs/var/log/remotes /** /** /*.log,但没有成功。我猜是因为我尝试使用全通配符,然后使用另一个全通配符,但它不喜欢。(请原谅通配符中的多余空格,因为它在编辑时被截断了??)

希望这可以帮助。

相关内容