使用logdam旋转TomcatloginSolaris会创build越来越多的空值

我需要在Solaris中旋转一些Tomcat日志。 当我尝试使用-c选项使用logadm时,旋转似乎正确地发生,但是然后catalina.out成为与旋转部分大小相同的空值块,并且在这些空值之后写入新数据。 就好像文件位置指针从不移动,Tomcat的输出从相同的位置继续前进。

结果,catalina.out继续增长。 每个旋转事件都会导致空值的增长。

当它工作时,这是我所知道的最方便的日志旋转解决scheme,因为您不必修改catalina.sh。 但是它不起作用,而替代方法 – 通过Apache logrotatepipe道输出 – 需要修改catalina.sh,我不想这样做。 这意味着我们每次更新Tomcat时都会跟踪另一个本地更改。

其实, catalina.sh确实打算用O_APPEND打开catalina.out>> "$CATALINA_OUT" 2>&1 &

根本原因是shell: #!/bin/sh 。 Solaris的默认shell( /bin/sh )不能正确解释>>以用O_APPEND打开输出文件。

这在Linux上不是问题。 你可以使用符合标准的shell来解决Solaris问题: /usr/xpg4/bin/sh (参见man sh

修改catalina.sh并用#!/usr/xpg4/bin/shreplace#!/bin/sh #!/usr/xpg4/bin/sh 。 缺点是每次更新Tomcat时,都需要重做。

使用O_APPEND或者不使用pfiles命令来validationcatalina.out是否被打开是容易的。

 1: S_IFREG mode:0644 dev:32,5 ino:13738 uid:0 gid:0 size:10170 O_WRONLY|O_APPEND|O_CREAT|O_LARGEFILE /opt/tomcat6/logs/catalina.out 

您可以看到/usr/xpg4/bin/sh使用O_APPEND打开catalina.out

正是这样; Tomcat(catalina.sh,具体而言)不会使用O_APPEND打开它的日志文件,因此写入发生在前一个位置,创build一个洞(空值,不占用磁盘空间)。

一个选项是在循环后有一个post_command来重启Tomcat。

另一个是使catalina.out命名pipe道,并从中读取一个程序,做“正确的事情”。 这个缺陷是,如果程序没有运行,Tomcat会填满pipe道缓冲区,然后阻塞,直到耗尽。