Java 停止tomcat对stdout和stderror的写入

Java 停止tomcat对stdout和stderror的写入,java,tomcat,logging,docker,fluentd,Java,Tomcat,Logging,Docker,Fluentd,我们使用docker。我们使用fluentd作为docker容器的日志驱动程序。我们使用tomcat为java应用程序提供服务。当java应用程序中抛出异常时,我们使用log4j来处理该异常。为了控制日志记录,我根据该页面上的说明在tomcat中安装了log4j。这是我正在使用的配置 log4j.rootLogger = INFO, CATALINA # Define all the appenders log4j.appender.CATALINA = org.apache.log4j.Da

我们使用docker。我们使用fluentd作为docker容器的日志驱动程序。我们使用tomcat为java应用程序提供服务。当java应用程序中抛出异常时,我们使用log4j来处理该异常。为了控制日志记录,我根据该页面上的说明在tomcat中安装了log4j。这是我正在使用的配置

log4j.rootLogger = INFO, CATALINA

# Define all the appenders
log4j.appender.CATALINA = org.apache.log4j.DailyRollingFileAppender
log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina
log4j.appender.CATALINA.Append = true
log4j.appender.CATALINA.Encoding = UTF-8
# Roll-over the log once per day
log4j.appender.CATALINA.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.CATALINA.layout = org.apache.log4j.PatternLayout
log4j.appender.CATALINA.layout.ConversionPattern = stewart %d [%t] %-5p %c- %m%n

log4j.appender.LOCALHOST = org.apache.log4j.DailyRollingFileAppender
log4j.appender.LOCALHOST.File = ${catalina.base}/logs/localhost
log4j.appender.LOCALHOST.Append = true
log4j.appender.LOCALHOST.Encoding = UTF-8
log4j.appender.LOCALHOST.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.LOCALHOST.layout = org.apache.log4j.PatternLayout
log4j.appender.LOCALHOST.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.MANAGER = org.apache.log4j.DailyRollingFileAppender
log4j.appender.MANAGER.File = ${catalina.base}/logs/manager
log4j.appender.MANAGER.Append = true
log4j.appender.MANAGER.Encoding = UTF-8
log4j.appender.MANAGER.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

log4j.appender.HOST-MANAGER = org.apache.log4j.DailyRollingFileAppender
log4j.appender.HOST-MANAGER.File = ${catalina.base}/logs/host-manager
log4j.appender.HOST-MANAGER.Append = true
log4j.appender.HOST-MANAGER.Encoding = UTF-8
log4j.appender.HOST-MANAGER.DatePattern = '.'yyyy-MM-dd'.log'
log4j.appender.HOST-MANAGER.layout = org.apache.log4j.PatternLayout
log4j.appender.HOST-MANAGER.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

# log4j.appender.CONSOLE = org.apache.log4j.ConsoleAppender
# log4j.appender.CONSOLE.Encoding = UTF-8
# log4j.appender.CONSOLE.layout = org.apache.log4j.PatternLayout
# log4j.appender.CONSOLE.layout.ConversionPattern = %d [%t] %-5p %c- %m%n

# Configure which loggers log to which appenders
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost] = INFO, LOCALHOST
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager] = INFO, MANAGER
log4j.logger.org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager] = INFO, HOST-MANAGER

问题是,对于记录的每个错误,堆栈跟踪仍然会写入stderr。这导致我们的日志平台将日志消息写入它两次。停止将所有堆栈跟踪写入stderr的最佳方法是什么?

一种方法是抑制错误输出

 System.setErr(null);
我使用的是spring,我使用PostConstruct注释在启动时运行了这段代码

import javax.annotation.PostConstruct;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SurpressLogging {

    @PostConstruct
    public void err() {
        System.setErr(null);
    }
}

你能给我们一些“许多错误”的例子吗?@Stewart,你的log4j配置中有没有stderr作为appender?我认为提供配置会很有用,至少它的基本部分是附加器和日志。@Stewart-:),因此我认为您的log4j配置不完整。你能把它也拿出来吗?