【问题标题】:Why my log will be redirected into catalina.out?为什么我的日志会被重定向到 catalina.out?
【发布时间】:2014-07-23 10:28:38
【问题描述】:

在我的应用程序中,我使用 log4j2 来输出日志。

<!-- log4j2 -->
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-api</artifactId>
    <version>2.0-beta9</version>
</dependency>
<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.0-beta9</version>
</dependency>

应用程序托管在 Tomcat7 中。

首先我使用默认方式输出Catalina.out,但我发现我的应用程序日志将被重定向到Catalina.out。所以我按照Tomcat的文档。 http://tomcat.apache.org/tomcat-7.0-doc/logging.html

然后用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 = %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

任何人遇到这种问题,可以告诉我避免这种情况的解决方案吗?

PS: logger模块设计为:

import java.io.BufferedWriter;
import java.util.Date;

public class Logger {

    private static org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(Logger.class
            .getName());

    public static void error(String proj, String opera, String param, String msg) {
        logger.error(log("Error", proj, opera, param, msg));
    }

    public static void debug(String proj, String opera, String param, String msg) {
        logger.debug(log("Debug", proj, opera, param, msg));
    }

    public static void warn(String proj, String opera, String param, String msg) {
        logger.warn(log("Warn", proj, opera, param, msg));
    }

    public static void info(String proj, String opera, String param, String msg) {
        logger.info(log("Info", proj, opera, param, msg));
    }

    private static String log(String type, String proj, String opera, String param, String msg) {
        // Build log content with JSON
        StringBuilder sb = new StringBuilder();
        sb.append("{\"time\": \"");
        sb.append(DateUtil.formatMilliSecond(new Date()));
        sb.append("\", \"level\": ");
        sb.append("\"" + type + "\", \"module\": ");
        sb.append("\"" + proj + "\", \"operation\": ");
        sb.append("\"" + opera + "\"");

        if (!StringUtil.isEmpty(param)) {
            sb.append(", \"parameter\": \"" + param + "\"");
        }

        if (!StringUtil.isEmpty(msg)) {
            sb.append(", \"message\": \"" + msg + "\"");
        }
        sb.append("}");
        writeLog(sb.toString());
        return sb.toString();
    }


    public static void setLog(String module) {
        logger = org.apache.logging.log4j.LogManager.getLogger(module);
    }

}

还有log4j2的配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="OFF">
    <appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%msg%n"/>
        </Console>
        <RollingFile name="MinerLog" fileName="/local/logs/miners.log"
                     filePattern="/local/logs/$${date:yyyy-MM}/miners-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="CaptainLog" fileName="/local/logs/captain.log"
                     filePattern="/local/logs/$${date:yyyy-MM}/captain-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>
        <RollingFile name="DataProviderLog" fileName="/local/logs/das_dataprovider.log"
                     filePattern="/local/logs/$${date:yyyy-MM}/dataprovider-%d{MM-dd-yyyy}-%i.log.gz">
            <PatternLayout pattern="%msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="20 MB"/>
            </Policies>
        </RollingFile>
    </appenders>
    <loggers>
        <root level="debug">
            <appender-ref ref="Console"/>
        </root>
        <logger name="miner" level="debug">
            <appender-ref ref="MinerLog" level="info"/>
            <appender-ref ref="Console"/>
        </logger>
        <logger name="captain" level="debug">
            <appender-ref ref="CaptainLog" level="info"/>
            <appender-ref ref="Console"/>
        </logger>
        <logger name="dataprovider" level="debug">
            <appender-ref ref="DataProviderLog" level="info"/>
            <appender-ref ref="Console"/>
        </logger>
    </loggers>
</configuration>

【问题讨论】:

  • 将此标签的值改为本地文件log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina
  • 我已经更新了用于记录器输出的代码。实际上,它在几个月前有效。但从我们不知道的某一天开始,它就变得奇怪了。
  • 登录到控制台/SYSTEM_OUT 被 Tomcat 重定向到 catalina.out 文件。从 log4j2 配置文件中删除所有 &lt;appeder=ref ref="Console"/&gt; 行。

标签: java tomcat7 log4j2 catalina.out


【解决方案1】:

它被重定向到 catalina.out,因为您将控制台日志定义为附加程序,并且这些日志被重定向到 catalina.out。

但是,我们确实需要控制台日志用于本地开发,但不希望它们显示在其他环境中。您可以将 ThresholdFilter 与配置属性一起使用,以仅在本地而非其他环境中使用以下示例代码进行控制台日志:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn" monitorInterval="300">
    <Properties>
        <Property name="consoleLogLevel">error</Property>
    </Properties>
    <Appenders>
        <RollingFile name="FileOut" fileName="/dev/pref-api.log"
                     filePattern="/dev/pref-api-%d{yyyy-MM-dd}.gz">
            <PatternLayout pattern="%date{yyyy/MM/dd HH:mm:ss.SSS} %-5level [%t] [%logger{36}] %msg%n"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>

        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%date{yyyy/MM/dd HH:mm:ss.SSS} %-5level [%t] [%logger{36}] %msg%n"/>
            <Filters>
                <ThresholdFilter level="${sys:consoleLogLevel}"  onMatch="ACCEPT" onMismatch="DENY"/>
            </Filters>
        </Console>
    </Appenders>
    <Loggers>
        <Root level="warn" additivity="false">
            <AppenderRef ref="FileOut"/>
            <AppenderRef ref="Console"/>
        </Root>

        <Logger name="com.github.api" level="debug" additivity="false">
            <AppenderRef ref="FileOut"/>
            <AppenderRef ref="Console"/>
        </Logger>
    </Loggers>
</Configuration>

如果您在本地传递 -DconsoleLogLevel=debug,您将看到来自 com.github.api 的所有日志都记录到控制台,但如果您不这样做,则在其他环境中t 传递任何默认错误的值,并且只在 catalina out 中显示错误堆栈。

【讨论】:

    【解决方案2】:

    以下将始终指向默认日志文件 Catalina.out。

    log4j.appender.CATALINA.File = ${catalina.base}/logs/catalina
    

    将此标签的值改为本地文件

    log4j.appender.CATALINA.File = C:\outputlog
    

    【讨论】:

    • 我的意思是我用我自己的 logger 模块在不同的地方定义了一个日志输出,但内容仍然被重定向到 Catalina.out
    【解决方案3】:

    如果您的应用程序的某些部分正在使用 log4j-1.2,您可以尝试将 log4j-1.2-api-2.0.jar 添加到类路径,以便对 1.2 api 的所有调用都重定向到 log4j2 实现。 (请参阅 log4j2 常见问题页面的“哪些 jars”部分。) 您将不再需要 log4j-1.2 样式的属性文件配置。 log4j2 只会使用 log4j2.xml 配置。

    【讨论】:

      【解决方案4】:

      最后,我更正了我的代码:

      import java.util.Date;
      
      import org.apache.logging.log4j.core.config.XMLConfigurationFactory;
      
      
      public class Logger {
      
          static {
              System.setProperty(XMLConfigurationFactory.CONFIGURATION_FILE_PROPERTY, "/local/logs/log4j2.xml");
          }
      
          private static org.apache.logging.log4j.Logger logger = org.apache.logging.log4j.LogManager.getLogger(Logger.class
                  .getName());
      
          ...
      

      然后它可以在我的日志文件中正确生成。 并且 Tomcat 也会在没有应用程序日志内容的情况下放置到正确的位置。 /local/logs/log4j2.xml 现在看起来像:

      <?xml version="1.0" encoding="UTF-8"?>
      <configuration status="OFF">
          <appenders>
              <Console name="Console" target="SYSTEM_OUT">
                  <PatternLayout pattern="%msg%n"/>
              </Console>
              <RollingFile name="AppLog" fileName="/local/das/logs/das_app.log"
                           filePattern="/local/das/logs/$${date:yyyy-MM}/das_app-%d{MM-dd-yyyy}-%i.log.gz">
                  <PatternLayout pattern="%msg%n"/>
                  <Policies>
                      <TimeBasedTriggeringPolicy/>
                      <SizeBasedTriggeringPolicy size="20 MB"/>
                  </Policies>
              </RollingFile>        
          </appenders>
          <loggers>
              <root level="debug">
                  <appender-ref ref="AppLog" level="info"/>
              </root>
          </loggers>
      </configuration>
      

      感谢范奥克尔

      【讨论】:

        猜你喜欢
        • 2021-07-13
        • 2018-01-04
        • 2019-09-11
        • 2014-09-19
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多