使用 logdam 在 Solaris 上轮换 Tomcat 日志会产生越来越多的空块

使用 logdam 在 Solaris 上轮换 Tomcat 日志会产生越来越多的空块

我需要在 Solaris 中轮换一些 Tomcat 日志。当我尝试使用带有 -c 选项的 logadm 时,轮换似乎正确进行,但 catalina.out 随后变为与轮换部分大小相同的空块,并且新数据写入这些空块之后。就好像文件位置指针从未移动过,Tomcat 的输出一直从同一位置前进。

因此,catalina.out 会继续增长。每次旋转事件都会使空值前导块增大。

当它工作时,这是我所知道的最方便的日志轮换解决方案,因为您不必修改 catalina.sh。但它不起作用,而替代方案——通过 Apache logrotate 传输输出——需要修改 catalina.sh,而我宁愿不这样做。这意味着每次我们更新 Tomcat 时都要跟踪另一个本地更改。

答案1

实际上,catalina.sh确实打算以此catalina.out开头O_APPEND>> "$CATALINA_OUT" 2>&1 &

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

在 Linux 上这不是问题。您可以使用符合标准的 shell 为 Solaris 解决这个问题:(/usr/xpg4/bin/sh请参阅man sh

修改catalina.sh替换#!/bin/sh#!/usr/xpg4/bin/sh。缺点是每次更新Tomcat时都需要重新进行。

使用该命令可以轻松验证是否catalina.out打开。O_APPENDpfiles

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开头。catalina.outO_APPEND

答案2

正是如此;Tomcat(具体来说是 catalina.sh)不会使用 O_APPEND 打开其日志文件,因此写入发生在前一个位置,从而创建一个到该点的洞(空值,不占用磁盘空间)。

一个选项是使用 post_command 在轮换之后重新启动 Tomcat。

另一种方法是将 catalina.out 设为命名管道,并让程序从中读取并执行“正确的操作”。 这样做的缺陷是,如果程序未运行,Tomcat 将填满管道缓冲区,然后阻塞,直到缓冲区被排空。

相关内容