问题是我们没有简单的根访问服务器。这就是为什么无需 root 即可运行 logrotate 非常方便。这是我在网上阅读文章后所做的。
- 创建目录 /home/techyman/logrotate,其中包含两个文件 logrotate.conf 和 logrotate.status
- 将 logrotate 配置文件放在 logrotate.conf 中
/home/techyman/glassfish4/glassfish/domains/*/logs/*.log {
su techyman techyman
daily
copytruncate
missingok
rotate 30
compress
notifempty
dateext dateformat -%Y-%m-%d-%s
}
- 运行 cron 作业
0 1 * * * /usr/sbin/logrotate -s /home/techyman/logrotate/logrotate.status /home/techyman/logrotate/logrotate.conf
该服务每天凌晨 1 点运行。要每 1 秒测试一次,只需* * * * *
在 cron job 中执行即可。但这不起作用。当我强制它时,它会说“状态文件顶部的坏行”,否则看不到任何操作。我只看到application.log。
我该如何解决这个问题?我究竟做错了什么?
我删除了notifempty
还是不行。
然后我删除了su techyman techyman
它仍然不起作用。
最后手动完成这项工作。但 cron 作业仍然不起作用。
/usr/sbin/logrotate -s /home/techyman/logrotate/logrotate.status
-f /home/techyman/logrotate/logrotate.conf
输出head -5 logrotate.status
logrotate state -- version 2
"/home/techyman/glassfish4/glassfish/domains/b/logs/application.log" 2023-11-19-17:46:26
"/home/techyman/glassfish4/glassfish/domains/domain1/logs/application.log" 2023-11-19-17:46:26
"/home/techyman/glassfish4/glassfish/domains/e/logs/application.log" 2023-11-19-17:46:26
"/home/techyman/glassfish4/glassfish/domains/c/logs/application.log" 2023-11-19-17:46:26
我daily
从 logrotate.conf 中删除,希望它能解决问题,但它仍然无法在 cron 中工作。
答案1
该消息bad top line in state file
表明状态文件(您使用该选项指定的文件-s
)确实存在,但其第一行也不存在
logrotate state -- version 1
或者
logrotate state -- version 2
如果您自己创建了该文件(例如使用touch /home/techyman/logrotate/logrotate.status
),则会出现此错误。如果该文件不存在,logrotate
如果目录权限允许,将在第一次运行时自动创建它,并自动添加适当的标题行。logrotate
使用该选项运行一次后-f
,它可能会自动修复。
因为logrotate
更新状态文件是先创建一个新文件,然后将其重命名为旧状态文件,所以目录权限必须允许logrotate
在状态文件目录中创建文件,否则更新状态文件根本不起作用。
另请注意logrotate(8)
手册页上的这一点:
通常,
logrotate
作为每日 cron 作业运行。它不会在一天内多次修改日志除非该日志的标准基于日志的大小并且 logrotate 每天运行多次,或者除非使用 -f 或 --force 选项。
在您的 中logrotate.conf
,该选项daily
指定日志每天仅轮换一次。如果将其更改为hourly
,则可以让日志每小时轮换一次,但logrotate
每小时运行一次以上仍然没有用。
如果您希望日志每小时轮换一次以上,则必须删除所有时间间隔选项并指定一个size
选项。
此外,logrotate
每分钟运行一次,尤其是在compress
启用该选项的情况下,很可能在下logrotate
一个作业尝试开始时上一个作业尚未完成。logrotate
尝试在启动时锁定状态文件,以防止这种情况发生。