【问题标题】:Why would Tomcat STDOUT Always Point to /dev/null?为什么 Tomcat STDOUT 总是指向 /dev/null?
【发布时间】:2011-04-13 15:58:47
【问题描述】:

我们愉快地运行了三台 CentOS 服务器,每台服务器都在一个 Tomcat 实例(UAT、Demo 和 Production)上部署了相同的应用程序。我们在应用程序中使用 Log4j 输出到标准 CATALINA_HOME/logs/catalina.out 文件。这在 UAT 和 Demo 服务器上完美运行,但在生产服务器上,我们在此文件中获得输出,直到启动过程结束,但没有任何应用程序日志输出。

使用 LSOF 我可以看到 STDOUT 总是指向 /dev/null。即使显式启动 Tomcat 并附加了 >> $CATALINA_OUT 2>&1 & ,它最终也会指向 /dev/null。我可以在其他服务器上看到它指向正确的 catalina.out 文件。

我已经在服务器上重新部署了 tomcat,并直接从工作的 UAT 实例中复制了配置文件,现在我正在摸不着头脑。有什么想法吗?

【问题讨论】:

    标签: java tomcat log4j


    【解决方案1】:

    你是如何“启动 Tomcat 并附加 >> $CATALINA_OUT 2>&1 & 的”?

    您是否 100% 确定没有人修改 bin/startup.shbin/catalina.sh 以添加 /dev/null 行为?

    与您的核心问题无关,但我强烈建议使用 log4j 配置写入文件 (FileAppender) 而不是登录到标准输出 - 这为您提供了根据日期/大小滚动文件的选项/etc,更改位置等,非常容易。登录到标准输出不会给您这种灵活性。

    【讨论】:

    • 我从 ps 中获取了完整的进程名称,其中包括所有的开关和选项,然后明确地将 >> /opt/server/logs/catalina.out 2>&1 & 放在最后 - 基本上是模拟startup.sh 的作用。我确信启动和 catalina 脚本没有被编辑,因为我们在服务器上进行了全新的 Tomcat 安装,以防发生类似的事情。我同意你关于正确的日志配置的观点,但是我们仍然有一堆异常现在只是路由到 STDOUT,并且需要在我们重构应用程序中的日志时捕获这些异常。
    • 您是从某人构建的软件包中安装 Tomcat,还是从官方网站的发行版中安装 Tomcat?
    • 这是 Apache 的原版安装。
    【解决方案2】:

    您有一个可以正常工作的类似设置;要做的事情是找出没有的那个有什么不同。对以下文件进行比较:

    • conf/logging.properties
    • bin/startup.sh
    • bin/catalina.sh

    也比较一下:

    • 拥有 Tomcat 进程的用户,以及该用户所属的组。
    • 日志目录的文件所有权和权限。

    【讨论】:

    • 嗨,迈克,我已经检查了这些,实际上用来自已知良好服务器的脚本替换了 logging.properties 和启动/关闭/catalina shell 脚本。为了消除用户权限问题,所有三台服务器上的 Tomcat 都以 root 身份运行,整个 tomcat 目录由 root:root 拥有。我还检查了日志目录的权限,并且这些权限在服务器之间匹配。奇怪的是,STDERR 仍然指向 catalina.out。
    猜你喜欢
    • 2018-08-12
    • 1970-01-01
    • 2020-04-22
    • 2013-11-10
    • 2012-05-17
    • 1970-01-01
    • 2019-10-28
    • 1970-01-01
    相关资源
    最近更新 更多