如何清除catalina.out而不禁用进一步的日志记录?

Jib*_*bby 14 java tomcat

我们的catalina.out文件每隔一段时间变得非常大(是的,我在我的应用程序中实现了slf4j和logback以防止将来出现这种情况).但是现在,当我去循环日志时,我将catalina.out复制到catalina.{date}并执行cat /dev/null > catalina.out.问题是,在我这样做之后,tomcat将不再捕获日志,直到第二天早上tomcat重新启动,这并不理想.为什么会这样?有没有办法避免它?

Mic*_*l-O 24

像蛋糕一样容易:echo > catalina.out.文件描述符不会更改,java可以继续写入该文件.

  • @Jibbyj,说实话。我不知道。它完成它的工作。 (3认同)

Edw*_*uck 13

传统的方式是

cat /dev/null > catalina.out
Run Code Online (Sandbox Code Playgroud)

它将清除日志文件,并且不会中断当前保存打开文件句柄的进程.

更好的方法是通过旋出日志文件来丢失您的日志记录信息.为此,请创建或编辑文件/etc/logrotate.d/tomcat并读取其内容

/var/log/tomcat/catalina.out {   copytruncate   daily   rotate 7   compress   missingok   size 5M  }
Run Code Online (Sandbox Code Playgroud)

然后使用命令重启logrotate(以root身份)

/usr/sbin/logrotate /etc/logrotate.conf
Run Code Online (Sandbox Code Playgroud)

并且您应该每天将日志文件轮换出来,或者如果大小超过5M,则保留最后七个日志以进行调试.


Jos*_*nez 9

您可以截断该文件.这也具有逻辑意义,因为它基本上就是你要做的事情.

truncate -s 0 M catalina.out

仅供参考:执行a cat /dev/null > file不会改变文件的inode.

logs]$ls -i test.log
19794063 test.log
logs]$
logs]$cat /dev/null > test.log
logs]$ls -i test.log
19794063 test.log
Run Code Online (Sandbox Code Playgroud)

另外,test.log在这些命令中,我有一个单独的命令将实时数据拖入其中.运行这些命令后,尾部test.log仍然可以正常工作.这不能回答你为何停止工作的问题,但它有助于排除inode的变化.

  • @Jibbyj op 询问如何截断文件。我认为问题是为什么有人会“echo /dev/null > catalina.out”而不是使用“truncate”。后者在语义上和技术上都是正确的方法。 (2认同)