我有一个日志,每天都会生成一个新的日志文件。以下是自我打开日志记录以来创建的每个日志的列表:
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
使用dateext
and 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 个压缩。您可以按如下方式进行操作:
- 在 中创建一个文件
/etc/logrotate.d/myfiles
。 - 将以下内容粘贴到其中。
/var/log/remote/*.log
{ 每天
轮换 10 个 共享脚本 missingok compress } - 您可以
logrotate
在调试模式下测试它的运行情况。logrotate -d /etc/logrotate.d/myfiles
- 如果你真的想现在执行它。
logrotate -f /etc/logrotate.d/myfiles