Java 如何在不禁用进一步日志记录的情况下清除catalina.out?

Java 如何在不禁用进一步日志记录的情况下清除catalina.out?,java,tomcat,Java,Tomcat,每隔一段时间,我们的catalina.out文件就会变得非常大(是的,我将在我的应用程序中实现slf4j和logback,以防止将来出现这种情况)。但是现在,当我循环日志时,我将catalina.out复制到catalina.{date}并执行cat/dev/null>catalina.out。问题是,在我这样做之后,tomcat将不再捕获更多日志,直到第二天早上tomcat重新启动,这并不理想。为什么会发生这种情况?有没有办法避免这种情况呢?您正在寻找的是日志轮换。由于这需要在流程运行时进行低

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

您正在寻找的是日志轮换。由于这需要在流程运行时进行低级别的测试,因此您应该间接地执行此操作。您可以使用来实现这一点。这也记录在。

简单如蛋糕:
echo>catalina.out
。文件描述符不会更改,
java
可以继续写入该文件。

传统的方法是

cat /dev/null > catalina.out
它将清除日志文件,并且不会中断当前持有打开的文件句柄的进程

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

/var/log/tomcat/catalina.out {   copytruncate   daily   rotate 7   compress   missingok   size 5M  }
然后使用命令重新启动logrotate(以root用户身份)


您应该让日志文件每天轮换一次,如果大小超过5M,则保留最后七个日志以进行调试。

您可以截断该文件。这也是合乎逻辑的,因为它本质上就是你想要做的

truncate-s0米catalina.out

仅供参考:执行
cat/dev/null>文件
不会更改文件的inode

logs]$ls -i test.log
19794063 test.log
logs]$
logs]$cat /dev/null > test.log
logs]$ls -i test.log
19794063 test.log

另外,在这些命令执行期间,我还有一个单独的命令将实时数据拖入
test.log
。运行这些命令后,
test.log
的尾部仍然可以正常工作。这并不能回答您关于它为什么停止工作的问题,但有助于排除inode中的更改。

转到/opt/tomcat/logs文件夹/ 输入命令行 sudo echo>catalina.out

不停地。这将永远有效。
您还可以每天或每周安排此命令

转到/opt/tomcat/logs文件夹/ 输入命令行--

sudo echo>catalina.out

您可以在不关闭tomcat服务器的情况下运行此操作。
您还可以每天或每周安排此命令

注意:如果tomcat catalina.out文件位于不同的路径,则可能需要修改日志文件位置。同样,您可以阅读有关logrotate的内容,并根据自己的喜好修改其他值。我使用了传统的方法,但它显然会中断当前持有打开文件句柄的进程……解释您正在创建的logrotate文件的内容对您非常有帮助。另外,创建名为
tomcat
的文件只有在进程名正确的情况下才合适?例如,在Ubuntu14上,tomcat7的进程实际上是
tomcat7
。您能否详细说明文件描述符没有改变,包括为什么cat/dev/null会改变它,而echo不会改变它?@Jibbyj,老实说。我不知道。关于文件描述符:你能解释一下为什么截断比cat/dev/null好吗?@Jibbyj op问如何截断文件。我想问题是为什么有人会
echo/dev/null>catalina.out
而不是使用
truncate
。后者在语义和技术上都是正确的方法。该死!我当时正在做一个
echo/dev/null
,我想知道为什么它不起作用。你确定你备份旧catalina.out时是在做
cp
而不是
mv
logs]$ls -i test.log
19794063 test.log
logs]$
logs]$cat /dev/null > test.log
logs]$ls -i test.log
19794063 test.log