我们使用 linux logrotate 来轮换我们的日志文件,
例子 :
/location/tomcat/logs/* /location/jboss/log/* {
copytruncate
daily
rotate 10
compress
size 20M
olddir rotated
create 0644 test test
}
根据 LINUX 中给出的复制截断定义,
copytruncate
Truncate the original log file in place after creating a copy,
instead of moving the old log file and optionally creating a new
one, It can be used when some program can not be told to close
its logfile and thus might continue writing (appending) to the
previous log file forever. Note that there is a very small time
slice between copying the file and truncating it, so some log-
ging data might be lost. When this option is used, the create
option will have no effect, as the old log file stays in place.
因此在旋转过程中日志文件中会出现数据丢失。我注意到大约 5 到 20 秒的日志丢失,有没有一种方法/配置可以在不丢失数据的情况下执行相同的过程?
答案1
我知道在 syslog-ng 中,您可以设置输出文件名以使用变量,包括日期等内容,因此它会在新的一天的凌晨 12:00 自动开始写入新文件,且损失为零。
不过,它需要将您的 syslog 程序更改为 syslog-ng。但灵活性听起来正是您所需要的。
答案2
您可以从日志文件记录和轮换logrotate
转向journald
使用systemd-cat -t indentifier cmdline
.设置日志/条目大小/etc/systemd/journald.conf
或使用journalctl --vacuum-size=, --vacuum-time=, --vacuum-files=
另一种方法是logrotate
每天一次,使用预轮换/后轮换功能停止服务器,轮换日志并再次启动服务器。 logrotation 时间取决于您的 systemdlogrotate.timer
或 (ana)cron 作业,可以定时为凌晨 4 点或流量低至零时。
prerotate
# stop jboss/tomcat server
endscript
daily
rotate 10
compress
size 20M
postrotate
#start servers
endscript
答案3
这就是我对日志的处理方式Catalina
:
/var/log/tomcat/catalina.out {
daily
size 100m
compressext .gz
compress
delaycompress
compressoptions "-9"
dateformat -%Y%m%d-%s
ifempty
copytruncate
prerotate
SIZE=$(stat --printf='%s' /var/log/tomcat/catalina.out)
/bin/bash -c "tail -c +$SIZE -f /var/log/tomcat/catalina.out > /var/log/tomcat/tmp.log" &
endscript
postrotate
pgrep tail | xargs kill -9
cat /var/log/tomcat/tmp.log >> /var/log/tomcat/catalina.out
rm /var/log/tomcat/tmp.log -f
endscript
}
您可以选择指定-s
withtail
来减少tail
命令本身的刷新间隔。而且因为您使用-c
选项,所以速度很快。