Logrotate 创建长名称并且不删除日志

iEl*_*ric 7 linux logrotate

postgres_db_dump_20091016.gz.1.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091017.gz.1.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091018.gz.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091019.gz.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091020.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
postgres_db_dump_20091021.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
Run Code Online (Sandbox Code Playgroud)

这是我强制运行 logrotate 时的示例输出(文件名)。不知何故,它无法识别旧文件。

调试输出示例:

glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/backup/postgres/postgres_db_dump_20091019.gz.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021 to /var/backup/postgres/postgres_db_dump_20091019.gz.1.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
rotating log /var/backup/postgres/postgres_db_dump_20091020.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021, log->rotateCount is 4
dateext suffix '-20091021'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/backup/postgres/postgres_db_dump_20091020.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021 to /var/backup/postgres/postgres_db_dump_20091020.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
rotating log /var/backup/postgres/postgres_db_dump_20091021.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021, log->rotateCount is 4
dateext suffix '-20091021'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
glob finding old rotated logs failed
renaming /var/backup/postgres/postgres_db_dump_20091021.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021 to /var/backup/postgres/postgres_db_dump_20091021.gz.1.1.1.1.1.1.1.1.1-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021-20091021
Run Code Online (Sandbox Code Playgroud)

和配置文件:

daily
rotate 4
create 666 root root
maxage 30
dateext
compress
missingok
notifempty
noolddir

# system-specific logs may be also be configured here.
/var/log/* {
    size=10M
    postrotate 
        /usr/bin/killall -HUP syslog-ng
    endscript
}

/var/backup/postgres/postgres* {
    nocompress
    nocreate
}
Run Code Online (Sandbox Code Playgroud)

EEA*_*EAA 7

/var/log/* {
    size=10M
    postrotate 
        /usr/bin/killall -HUP syslog-ng
    endscript
}
Run Code Online (Sandbox Code Playgroud)

/var/log/*是你的问题。这匹配 /var/log 中的所有文件,包括已经压缩的文件。您需要优化该 glob 匹配模式以仅匹配非压缩文件。

  • 好吧,够公平。不过,他的 /var/backup/postgres/postgres* 指令也是如此。 (2认同)

Pau*_*lin 7

logrotate 的联机帮助页说

   Please  use wildcards with caution.  If you specify *, logrotate will rotate all files,
   including previously rotated ones.  A way around this is to use the olddir directive or
   a more exact wildcard (such as *.log).
Run Code Online (Sandbox Code Playgroud)

  • 我总是喜欢有人从男人那里找出解决只写用户问题的东西;) (2认同)

Jef*_*der 6

这里的其他答案是正确的,您需要更改配置匹配的文件。/var/log 中的文件可能会出现同样的问题,但压缩和 10M 大小限制的组合阻止了它发生。

您将遇到的另一个问题是我想指出的。Logrotate 的构建依赖于一致的日志文件名来轮换旧文件。当它处理日志文件时,它使用它作为基本名称,通过搜索旧版本将具有的特定扩展名来查找它的所有旧版本。这就是调试日志中的 glob 内容正在寻找的内容。由于您的文件名每次都会因日期而更改,因此它永远不会回去查看那些旧文件,因为它现在正在处理的文件名不匹配。

你可以做两件事。第一个选项是设置 postgres 或任何创建该转储文件的脚本以不使用日期。保持文件名一致将使 logrotate 做它的事情并清除旧的。或者,您可以完全跳过 logrotate 并在您的 crontab 中放置类似的内容:

0 4 * * * find /var/backup/postgres/postgres_db_dump_*.gz -mtime +10 -delete
Run Code Online (Sandbox Code Playgroud)

这将每晚运行并删除超过 10 天的转储文件。