问题: 通过AWS EBS Tomcat 7容器将微服务部署为战争后...注意到在UTC日边界发生的日志轮换会留下过时的inode文件。
日志轮换更像是一个copy n truncate,这会导致rsyslog过时的文件处理程序,它正在侦听catalina.out的更改。什么是防止过时的inode描述符的最佳方法?我应该在logback.xml或logrotate中指定翻转策略还是......?
输出sudo lsof /var/log/tomcat7/catalina.out(和sudo stat report最新inode)
rsyslogd 18970 root 2r REG 202,1 1250 134754 /var/log/tomcat7/catalina.out
但在调试模式下与rsyslog的日志输出不匹配。
4638.114765354:7fc839b8c700: stream checking for file change on '/var/log/tomcat7/catalina.out', inode 135952/135952file 7 read 0 bytes
解决方法 停止Tomcat,删除catalina.out,然后重启tomcat。这允许rsyslog继续传输新记录。
但是,几个小时后,rsyslog无法将更新的日志记录流式传输到rsyslog目标服务器。 rsyslog的调试日志包含与stat和lsof输出相同的inode。如果你运行
sudo stat /var/log/tomcat7/catalina.out
rsyslog再次开始流式传输。
您是否注意到rsyslog在日志翻转用例之外间歇性地停止流式传输?
为什么sudo stat /var/log/tomcat7/catalina.out
会导致rsyslog再次流式传输?
答案 0 :(得分:0)
一旦logrotated在catalina.out上轮换,rsyslog也不会发送新记录。发布一个统计数据并没有完全削减它,因为问题是tomcat停止写catalina.out(!)...在仔细阅读各种论坛和博客后,我能够通过以下步骤解决这个问题:
$WorkDirectory
;这允许rsyslog写入"状态文件"对于catalina.out(或者它监视的任何其他日志文件)postrotate
条目上重新启动rsyslog。catalina.out的logrotate设置(状态文件位于/ var / lib / rsyslog中):
/opt/tomcat/logs/catalina.out {
rotate 7
size 50M
notifempty
missingok
postrotate
service rsyslog stop
rm /var/lib/rsyslog/*
service rsyslog start
endscript
}