旋转文件名中已有日期时间的文件

Rotating files with datetime already in the filename

我对 logrotate 的使用还很陌生,我还没有找到任何可以帮助我解决当前问题的东西。

我公司有一台服务器 (Debian),我们经常在其中创建 cron 任务来处理通过 FTP 上传的文件。为了跟踪这些提取可能带来的任何问题,cron 任务始终配置为写入日志(来自 echos 和 var_dump)以便能够轻松调试我们的脚本。

生成这些日志文件的文件名中带有时间戳,因此一个日志文件 = 执行一天。为了防止日志使用过多的磁盘space,并且不手动删除旧日志,我想使用 logrotate 来完成这项工作。

例如,这里是其中一个日志文件夹如下所示:

-rw-r----- 1 root root 0 May  1 21:55 index-no-guzzle-2022-05-01.log
-rw-r----- 1 root root 0 May  2 21:55 index-no-guzzle-2022-05-02.log
-rw-r----- 1 root root 0 May  3 21:55 index-no-guzzle-2022-05-03.log
-rw-r----- 1 root root 0 May  4 21:55 index-no-guzzle-2022-05-04.log
-rw-r----- 1 root root 0 May  5 21:55 index-no-guzzle-2022-05-05.log
-rw-r----- 1 root root 0 May  6 21:55 index-no-guzzle-2022-05-06.log
-rw-r----- 1 root root 0 May  7 21:55 index-no-guzzle-2022-05-07.log
-rw-r----- 1 root root 0 May  8 21:55 index-no-guzzle-2022-05-08.log
-rw-r----- 1 root root 0 May  9 21:55 index-no-guzzle-2022-05-09.log
-rw-r----- 1 root root 0 May 10 21:55 index-no-guzzle-2022-05-10.log
-rw-r----- 1 root root 0 May 11 21:55 index-no-guzzle-2022-05-11.log
-rw-r----- 1 root root 0 May 12 21:55 index-no-guzzle-2022-05-12.log
-rw-r----- 1 root root 0 May 13 21:55 index-no-guzzle-2022-05-13.log
-rw-r----- 1 root root 0 May 14 21:55 index-no-guzzle-2022-05-14.log
-rw-r----- 1 root root 0 May 15 21:55 index-no-guzzle-2022-05-15.log
-rw-r----- 1 root root 0 May 16 21:55 index-no-guzzle-2022-05-16.log
-rw-r----- 1 root root 0 May 17 21:55 index-no-guzzle-2022-05-17.log
-rw-r----- 1 root root 0 May 18 21:55 index-no-guzzle-2022-05-18.log
-rw-r----- 1 root root 0 May 19 10:14 index-no-guzzle-2022-05-19.log

这是我当前的 logrotate 配置文件:

/root/gun-logs/some-cron-logs-folder/*.log {
    daily
    missingok
    rotate 14
    maxage 14
    create 640 root root
}

但是,输出不是我所期望的:

root@myserver:/etc/logrotate.d# ls /root/gun-logs/some-cron-logs-folder/
index-no-guzzle-2022-05-01.log    index-no-guzzle-2022-05-07.log.1  index-no-guzzle-2022-05-14.log
index-no-guzzle-2022-05-01.log.1  index-no-guzzle-2022-05-08.log    index-no-guzzle-2022-05-14.log.1
index-no-guzzle-2022-05-02.log    index-no-guzzle-2022-05-08.log.1  index-no-guzzle-2022-05-15.log
index-no-guzzle-2022-05-02.log.1  index-no-guzzle-2022-05-09.log    index-no-guzzle-2022-05-15.log.1
index-no-guzzle-2022-05-03.log    index-no-guzzle-2022-05-09.log.1  index-no-guzzle-2022-05-16.log
index-no-guzzle-2022-05-03.log.1  index-no-guzzle-2022-05-10.log    index-no-guzzle-2022-05-16.log.1
index-no-guzzle-2022-05-04.log    index-no-guzzle-2022-05-10.log.1  index-no-guzzle-2022-05-17.log
index-no-guzzle-2022-05-04.log.1  index-no-guzzle-2022-05-11.log    index-no-guzzle-2022-05-17.log.1
index-no-guzzle-2022-05-05.log    index-no-guzzle-2022-05-11.log.1  index-no-guzzle-2022-05-18.log
index-no-guzzle-2022-05-05.log.1  index-no-guzzle-2022-05-12.log    index-no-guzzle-2022-05-18.log.1
index-no-guzzle-2022-05-06.log    index-no-guzzle-2022-05-12.log.1  index-no-guzzle-2022-05-19.log
index-no-guzzle-2022-05-06.log.1  index-no-guzzle-2022-05-13.log    index-no-guzzle-2022-05-19.log.1
index-no-guzzle-2022-05-07.log    index-no-guzzle-2022-05-13.log.1

我唯一需要的结果是自动删除超过 N 天(此处为 14)的文件。

我可以从文件名中删除时间戳,但我注意到使用“daily”意味着 logrotate 将在早上 6 点或 7 点左右执行,这是一个问题,因为我们的 cron 任务可以在夜间触发,这意味着日志将附加到错误的文件。

那么,我可以为此使用 logrotate 吗?如果可以,如何使用?如果没有,这是实现这一目标的最安全方法,考虑到我想自动创建这些配置文件(脚本将创建 cron 文件夹和所需的文件,创建日志文件夹,创建 cron任务并创建 logrotate 配置文件)。

非常感谢您或您的帮助!

好吧,看起来经过更多的挖掘,处理这个问题的最好方法是不使用 logrotate,而是使用 cron 任务来删除旧文件。

使用 this answer 对我来说是一个很好的解决方案,我可以每天 运行 使用另一个 cron 任务执行命令。

所以我的命令是:

/usr/bin/find /root/gun-logs/some-cron-logs-folder/ -mtime +14 -name "*.log" -print -delete