问题是我们没有简单的根访问服务器。这就是为什么无需 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 中工作。
该消息
bad top line in state file
表明状态文件(您使用选项指定的文件-s
)确实存在,但其第一行也不存在或者
如果您自己创建了该文件(例如使用
touch /home/techyman/logrotate/logrotate.status
),则会出现此错误。如果该文件不存在,logrotate
如果目录权限允许,将在第一次运行时自动创建它,并自动添加适当的标题行。logrotate
使用该选项运行一次后-f
,它可能会自动修复。因为
logrotate
更新状态文件是先创建一个新文件,然后将其重命名为旧状态文件,所以目录权限必须允许logrotate
在状态文件目录中创建文件,否则更新状态文件根本不起作用。另请注意
logrotate(8)
手册页上的这一点:在您的 中
logrotate.conf
,该选项daily
指定日志每天仅轮换一次。如果将其更改为hourly
,则可以让日志每小时轮换一次,但logrotate
每小时运行一次以上仍然没有用。如果您希望日志每小时轮换一次以上,则必须删除所有时间间隔选项并指定一个
size
选项。此外,每分钟运行
logrotate
一次,尤其是在compress
启用该选项的情况下,很可能在下一个logrotate
作业尝试启动时上一个作业尚未完成。logrotate
尝试在启动时锁定状态文件,以防止这种情况发生。