logrotate 继续旋转并压缩已经旋转的日志

logrotate 继续旋转并压缩已经旋转的日志

我有一个日志,每天都会生成一个新的日志文件。以下是自我打开日志记录以来创建的每个日志的列表:

2019-01-04
2019-01-05
2019-01-06
2019-01-07
2019-01-08

这是 logrotate 配置。我已经尝试了几次迭代,但都没有导致日志被压缩,然后“不管它”直到它滚落(希望在 90 天之内)。

/etc/logrotate.d/remote

/var/log/remote/*/*[!.]gz
/var/log/remote/*/*.[!g]z
/var/log/remote/*/*.g[!z]
/var/log/remote/*/*[!.][!g]z
/var/log/remote/*/*[!.]g[!z]
/var/log/remote/*/*.[!g][!z]
/var/log/remote/*/*[!.][!g][!z]
{
    rotate 90
    daily
    missingok
    compress
}

这是显示 logrotate 正在执行的操作的文件夹列表。

drwxr-xr-x 2 root root 4.0K Jan  8 06:25 ./
drwxr-xr-x 6 root root 4.0K Jan  4 09:44 ../
-rw-r----- 1 root adm     0 Jan  8 06:25 2019-01-04
-rw-r----- 1 root adm    20 Jan  7 06:25 2019-01-04.1.gz
-rw-r----- 1 root adm    20 Jan  6 06:25 2019-01-04.2.gz
-rw-r----- 1 root adm  5.2K Jan  4 23:57 2019-01-04.3.gz
-rw-r----- 1 root adm     0 Jan  8 06:25 2019-01-05
-rw-r----- 1 root adm    20 Jan  7 06:25 2019-01-05.1.gz
-rw-r----- 1 root adm    20 Jan  6 06:25 2019-01-05.2.gz
-rw-r----- 1 root adm  7.4K Jan  5 23:58 2019-01-05.3.gz
-rw-r----- 1 root adm     0 Jan  8 06:25 2019-01-06
-rw-r----- 1 root adm    20 Jan  7 06:25 2019-01-06.1.gz
-rw-r----- 1 root adm  8.0K Jan  6 23:56 2019-01-06.2.gz
-rw-r----- 1 root adm     0 Jan  8 06:25 2019-01-07
-rw-r----- 1 root adm  7.8K Jan  7 23:55 2019-01-07.1.gz
-rw-r----- 1 root adm  101K Jan  8 13:16 2019-01-08

我想管理保留日志的天数,并在执行此操作时压缩旧日志。这就是我想要的结果:

drwxr-xr-x 2 root root 4.0K Jan  8 06:25 ./
drwxr-xr-x 6 root root 4.0K Jan  4 09:44 ../
-rw-r----- 1 root adm    20 Jan  7 06:25 2019-01-04.1.gz
-rw-r----- 1 root adm    20 Jan  7 06:25 2019-01-05.1.gz
-rw-r----- 1 root adm    20 Jan  7 06:25 2019-01-06.1.gz
-rw-r----- 1 root adm  7.8K Jan  7 23:55 2019-01-07.1.gz
-rw-r----- 1 root adm  101K Jan  8 13:16 2019-01-08

答案1

您基本上想要轮换指定目录中以数字结尾的日志文件,因此日志匹配变为:

/var/log/remote/*/*[0-9]

您遇到的一个问题是,logrotate可能将该create选项设置为默认值,这意味着在轮换日志文件(意味着它被重命名并且可能被压缩)后,将创建一个具有原始名称的新日志文件。使用该nocreate选项可以防止这种情况。

但是,您最大的问题是您的日志文件没有固定名称。logrotate保留具有相同名称的日志文件的 X 个版本;由于名称每天都会更改,因此logrotate每天都会保留一个版本,因此不会删除任何内容。

如果您可以说服创建这些日志文件的任何内容具有诸如“log-”之类的前缀,以便名称变为“log-2019-01-09”等,那么它可能会起作用。现在您可以告诉logrotate使用dateextand dateformat -%Y-%m-%d,希望这会欺骗logrotate假设日期部分是logrotate自己创建的。然后配置就变成了这样:

/var/log/remote/*/log {
    nocreate
    dateext
    dateformat -%Y-%m-%d
    delaycompress
}

但是,如果我是你,我不会尝试强制logrotate处理这些行为与预期不同的日志文件logrotate。我会推出自己的日志过期脚本,例如:

#!/bin/sh
DAYS=90
TOPDIR=/var/log/remote
cd $TOPDIR
for i in *; do
    if ! [ -d $TOPDIR/$i ]; then
        continue
    fi
    cd $TOPDIR/$i
    find -maxdepth 1 -type f -name '????-??-??' -mtime +1 -exec gzip {} \;
    find -maxdepth 1 -type f -name '????-??-??.gz' -mtime +$DAYS -delete
done

答案2

对我来说,你问的问题很正常。假设您的file1.log, file2.log and file3.log文件夹中有 3 个文件/var/log/remote/,并且您希望每天轮换它们并保持最后 10 个压缩。您可以按如下方式进行操作:

  1. 在 中创建一个文件/etc/logrotate.d/myfiles
  2. 将以下内容粘贴到其中。

    /var/log/remote/*.log
    { 每天
    轮换 10 个 共享脚本 missingok compress }




  3. 您可以logrotate在调试模式下测试它的运行情况。

    logrotate -d /etc/logrotate.d/myfiles

  4. 如果你真的想现在执行它。

    logrotate -f /etc/logrotate.d/myfiles

相关内容