我目前systemd service
在一台将和Ubuntu 18.04
重定向到自定义路径的机器上有一个:StandardOuput
StandardError
StandardError=file:/opt/my_tests/my.log
StandardOutput=file:/opt/my_test/my.log
但我想添加日志轮换并避免将来出现磁盘空间问题。我发现实现此目的的方法是使用logrotate
,因为另一个解决方案(journald.conf
)要求我将日志放在/var/log/journal/
。
对以下文件进行一些测试后/etc/logrotate.d/
/opt/my_tests/my.log {
missingok
rotate 10
maxsize 200k
copytruncate
compress
notifempty
create 0640 my_user my_user
dateext
dateformat -%Y_%m_%d-%H_%M_%S
postrotate
echo "A rotation took place"
endscript
}
我只能在sudo logrotate /etc/logrotate.conf --force
独立于大小或时间标志(例如hourly
、daily
或maxsize
)运行时进行旋转。我这里漏掉了什么吗?还有其他解决方案可以在自定义路径上进行日志旋转吗?
输出sudo logrotate -v /etc/logrotate.d/my_conf
为:
rotating pattern: /opt/my_tests/my.log 1048576 bytes (10 rotations)
empty log files are not rotated, log files >= 204800 are rotated earlier, old logs are removed
considering log /opt/my_tests/my.log
Now: 2020-10-23 21:00
Last rotated at 2020-10-27 18:13
log needs rotating
rotating log /opt/my_tests/my.log, log->rotateCount is 10
Converted ' -%Y_%m_%d-%H_%M_%S' -> '-%Y_%m_%d-%H_%M_%S'
dateext suffix '-2020_10_23-21_00_30'
glob pattern '-[0-9][0-9][0-9][0-9]_[0-9][0-9]_[0-9][0-9]-[0-9][0-9]_[0-9][0-9]_[0-9][0-9]'
copying /opt/my_tests/my.log to /opt/my_tests/my.log.log-2020_10_23-21_00_30
truncating /opt/my_tests/my.log.log
running postrotate script
A rotation took place
compressing log with: /bin/gzip
removing old log /opt/my_tests/my.log.log-2020_10_26-20_32_32.gz
答案1
如果它使用 执行旋转--force
,则意味着您的配置很好,但logrotate
不认为该文件此时需要旋转。
您可以运行logrotate -v /etc/logrotate.d/[your conf file]
,它应该会提供一条消息,说明跳过该文件的原因。如果没有,logrotate -d
则会提供额外的调试信息,这些信息可能有助于查明原因。
但是,查看您发布的配置,我猜测最可能的原因是实际上没有写入任何内容/opt/my_tests/my.log
(即,文件大小为 0),并且您的配置状态为notifempty
,因此如果文件大小为 0,则会跳过该文件。
答案2
- logrotate 可以在您配置的任何目录上运行,不仅仅是
/var/logs
- 您的配置缺少句点什么时候应该发生旋转(
daily
,,weekly
...) - 在 Ubuntu 上,logrotate 任务由 触发
cron
。因此,看看/etc/cron.d/
它何时运行 - 根据您的配置,logrotate 可能需要几天时间才能真正轮换文件