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

Posted

技术标签:

【中文标题】如何在不禁用进一步日志记录的情况下清除 catalina.out?【英文标题】:How to clear catalina.out without disabling further logging? 【发布时间】:2016-09-02 20:30:50 【问题描述】:

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

【问题讨论】:

当您备份旧的 catalina.out 时,您确定您正在执行 cp 而不是 mv /dev/null 是一个永恒的空字符流!输入cat /dev/null 你就会明白我的意思了。顺便说一句..ctrl + c 应该停止这个过程。最好的方法 对于其他发现自己处于类似情况的人,解决您的问题的最佳方法是按照我上面所说的去做。这会将流从您的描述符中拉到标准输出中。从那里中断杀死它。旧的“trap n' kill”XD 【参考方案1】:

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

【讨论】:

您能否详细说明文件描述符没有改变,包括为什么 cat /dev/null 会改变它而 echo 不会? @Jibbyj,说实话。我不知道。它完成了它的工作。 关于文件描述符:https://***.com/questions/5256599/what-are-file-descriptors-explained-in-simple-terms @Michael-O echo 没有要回显的字符串将不会写入任何内容。 > 重定向将采用“无”输出并覆盖文件。这与 cat-ing /dev/null 没有什么不同,后者还提供了“无”来触发 > 覆盖文件。【参考方案2】:

传统的方式是

cat /dev/null > catalina.out

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

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

/var/log/tomcat/catalina.out    copytruncate   daily   rotate 7   compress   missingok   size 5M  

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

/usr/sbin/logrotate /etc/logrotate.conf

并且您应该每天轮换日志文件,或者如果大小超过 5M,则保留最后七个日志以用于调试目的。

【讨论】:

请注意,如果您的 tomcat catalina.out 文件位于不同的路径,您可能需要修改日志文件的位置。同样,您可以阅读 logrotate 并修改其他值以满足您的喜好。 我使用的是传统方式,但它似乎肯定会破坏当前持有打开文件句柄的进程...... 解释您正在创建的 logrotate 文件的内容对您很有帮助。另外,创建一个名为tomcat 的文件仅在进程名称正确的情况下才合适?例如,在 Ubuntu 14 for tomcat 7 上,进程实际上是 tomcat7 传统方式只是归档/压缩/更改名称,例如full_file.log,到(full_file.log.1、full_file.1、full_file.~、full_file.log.09262021 等)中的任何一个,并以旧名称启动一个新名称。很多时候我需要超级旧的日志文件来保存机器的当前状态。 更改名称如何防止打开的文件句柄写入新名称?以及如何在没有明确设计用于创建新文件的程序的情况下以旧名称启动新的日志文件(就像收到信号后这样做的程序)?许多提供设施来满足您的要求,但不是全部,我认为 cmets 的不足让您遗漏了几个步骤。为什么不写一个完整的答案呢?【参考方案3】:

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

truncate -s 0 M catalina.out

仅供参考:执行 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

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

【讨论】:

你能解释一下为什么截断比 cat /dev/null 更好吗? @Jibbyj op 询问如何截断文件。我认为问题是为什么有人会echo /dev/null > catalina.out 而不是使用truncate。后者在语义和技术上都是正确的做法。 该死!我正在做一个echo /dev/null 并想知道为什么它不起作用【参考方案4】:

您正在寻找的是日志轮换。由于这需要在进程运行时使用低级别的signal support,因此您应该间接执行此操作。您可以使用this procedure 来实现此目的。这也记录在Tomcat Wiki。

【讨论】:

【参考方案5】:

转到文件夹 /opt/tomcat/logs/ 输入命令行 须藤回声> catalina.out

没有停止tomcat。 .这将永远有效。 您还可以每天或每周安排此命令。 .

【讨论】:

为什么要每周清除一次日志?这是系统管理员拥有的最有价值的工具之一。【参考方案6】:

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

sudo echo > catalina.out

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

【讨论】:

以上是关于如何在不禁用进一步日志记录的情况下清除 catalina.out?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不使用日志库的情况下记录对 hapi 服务器的所有请求?

如何在不重启Yarn服务的情况下启用DEBUG日志记录

如何在不清除 GoogleMap 的情况下更新多个位置

如何在不注销的情况下清除所有会话变量

如何在不保留任何到期时间的情况下清除 javascript 中的 cookie [重复]

如何在不使项目变灰的情况下禁用 UITabBarItem