返回

Logrotate 如何将不同文件名日志文件压缩成单个存档文件?

Linux

使用 Logrotate 从具有不同文件名的日志文件中创建单个压缩归档文件

问题

如果你拥有多个日志文件,其文件名采用“DATE-mylogfile.log”的格式(其中 DATE 使用“%d-%m-%Y”格式),并且希望使用 logrotate 将这些日志文件每周旋转并压缩一次,但是 logrotate 却为每个日志文件创建了一个单独的 gz 存档。你的目标是创建包含整个星期所有日志文件的单个 gz 归档文件。

解决方案

要实现这个目标,你需要修改 logrotate 配置文件。以下是修改后的配置:

/var/USER/mylogs/*.log {
  weekly
  rotate 4
  compress
  missingok
  dateext
  dateformat -%Y-%m
  create 644 testuser testgroup 0644 mylogfile.log 1
  postrotate
    mv /var/USER/mylogs/mylogfile.log-*.gz /var/USER/mylogs/mylogfile.log-$(date +%Y-%m).gz
  endscript
}

修改说明

  • dateformat -%Y-%m:将日期格式更改为“%Y-%m”,它将生成“mylogfile.log-2024-03”格式的存档名称,其中“2024-03”表示年份和月份。
  • create 644 testuser testgroup 0644 mylogfile.log 1:在每次旋转之前,此命令创建一个空日志文件“mylogfile.log”,该文件具有指定的所有者、组和权限。
  • postrotate 块:此块包含在旋转后执行的命令。
  • mv /var/USER/mylogs/mylogfile.log-*.gz /var/USER/mylogs/mylogfile.log-$(date +%Y-%m).gz:此命令将所有 gz 存档文件移动到一个名为“mylogfile.log-(date +%Y-%m).gz”的单个归档文件中,其中“(date +%Y-%m)”是当前年份和月份。

现在,logrotate 将每周创建一个包含整个星期所有日志文件的单个 gz 归档文件。

示例

例如,假设你的日志文件夹包含以下日志文件:

12-01-2024-mylogfile.log
13-01-2024-mylogfile.log
14-01-2024-mylogfile.log
15-01-2024-mylogfile.log
16-01-2024-mylogfile.log
17-01-2024-mylogfile.log
18-01-2024-mylogfile.log

使用修改后的配置,logrotate 将在星期一(第一个星期天的后一天)创建以下 gz 归档文件:

mylogfile.log-2024-03.gz

此归档文件将包含从 2024 年 3 月 12 日到 2024 年 3 月 18 日的所有日志文件。

结论

通过修改 logrotate 配置,你可以创建单个 gz 归档文件,其中包含整个星期所有具有不同文件名的日志文件。这可以帮助你更轻松地管理和存档日志数据。

常见问题解答

1. 为什么 logrotate 默认为每个日志文件创建单独的 gz 存档?

logrotate 的默认行为是为每个日志文件创建单独的存档,因为它更简单且不容易出错。

2. 我可以将归档文件移动到其他位置吗?

是的,你可以在 postrotate 块中使用 mv 命令将归档文件移动到其他位置。

3. 我可以更改归档文件的压缩级别吗?

是的,你可以在 logrotate 配置中使用 compresscmd 选项来指定压缩级别。

4. 我可以为不同的日志文件创建不同的归档文件吗?

是的,你可以通过创建多个 logrotate 配置来实现这一点。

5. logrotate 是否支持其他类型的压缩格式?

除了 gz 之外,logrotate 还支持 bz2、xz 和 lzma 等其他压缩格式。