【问题标题】:log4j2 xml configuration - Log to file and console (with different levels)log4j2 xml 配置 - 记录到文件和控制台(不同级别)
【发布时间】:2013-06-29 09:38:47
【问题描述】:

我想做两件事:

  1. 使用特定日志级别登录到控制台
  2. 使用另一个日志级别记录到文件

控制台日志似乎工作得很好,但日志文件一直是空的。

这是我的 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
  <appenders>
    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </Console>

    <File name="MyFile" fileName="logs/app.log" immediateFlush="true">
        <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
    </File>  

  </appenders>
  <loggers>

    <logger name="filelogger" level="error">
        <appender-ref ref="MyFile"/>
    </logger>

    <root level="info">
      <appender-ref ref="Console"/>
    </root>
  </loggers>
</configuration>

可能出了什么问题?

【问题讨论】:

    标签: xml log4j log4j2


    【解决方案1】:

    我想通了!在这种情况下不应使用 &lt;Logger&gt; 标签,详情请参阅 Gaurang Patel 的回答。

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration status="WARN">
      <appenders>
        <Console name="Console" target="SYSTEM_OUT">
          <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </Console>
    
        <File name="MyFile" fileName="logs/app.log">
            <PatternLayout pattern="%d{yyyy-mm-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
        </File>             
      </appenders>
    
      <loggers>     
        <root level="debug">
          <appender-ref ref="Console" level="info"/>
          <appender-ref ref="MyFile" level="error"/>
        </root>    
      </loggers>
    </configuration>
    

    【讨论】:

    • 那么问题出在哪里?发布没有解释的解决方案无济于事
    • @daker 嗨,如果我在 tomcat 服务器上运行 war 文件,是否可以指定要保存文件的路径?
    • @Bendemann 我假设您只是更改了fileName 标签中的路径,但我不知道。
    【解决方案2】:

    虽然 Daker 已经放了更正的配置文件,但他没有解释。我想在这里添加解释。正如 Log4j2 文档here 中所引用的,对于给定的要求,不需要使用 标记。进一步什么时候应该使用 标签?从文档中阅读以下说明,

    也许希望消除所有 TRACE 输出 除了 com.foo.Bar 之外的所有内容。简单地改变日志级别不会 完成任务。相反,解决方案是添加一个新的记录器 配置定义:

    <Loggers>
      <Logger name="com.foo.Bar" level="TRACE"/> 
      <Root level="ERROR">  
        <AppenderRef ref="STDOUT"> 
      </Root>
      ...
    </Loggers>
    

    【讨论】:

      【解决方案3】:

      &lt;logger name="filelogger" level="error" &gt;
      应该是这个问题。记录器的名称通常是您的包名(除非您专门将其命名为filelogger)。
      试试&lt;logger name="com.yourpackage" level="error" additivity="true"&gt;

      参考Log4j2 Doc

      【讨论】:

      • 谢谢。它适用于文件日志记录,但现在控制台输出消失了。那里也有问题?
      • 编辑我的答案添加了'additivity="true"`
      • 在 log4j2 中可加性默认为真
      【解决方案4】:

      在这里总结其他人(@basiljames@daker@Jay Taylor)的答案:

      我的log4j2.xml 配置

      我的情况:

      • log4j2 版本:2.13.0

      • log4j2.xml配置:

      <?xml version="1.0" encoding="UTF-8"?>
      <Configuration>
        <Appenders>
          <File name="FILEOUT" fileName="your_log_filename.log" append="false">
            <PatternLayout>
              <Pattern>%d{yyyyMMdd HH:mm:ss} %-5p [%t] %C{2} %F%L - %m%n</Pattern>
            </PatternLayout>
          </File>
      
          <Console name="STDOUT" target="SYSTEM_OUT">
            <PatternLayout pattern="%d %-5p %F:%L - %m%n"/>
          </Console>
        </Appenders>
      
        <Loggers>
          <Root level="debug">
            <AppenderRef ref="FILEOUT" level="debug"/>
            <AppenderRef ref="STDOUT" level="info"/>
          </Root>
        </Loggers>
      </Configuration>
      

      Q:如何实现不同级别的File和Console?

      A:正如official doc 也提到的,核心部分:

          <Root level="debug">
            <AppenderRef ref="FILEOUT" level="debug"/>
            <AppenderRef ref="STDOUT" level="info"/>
          </Root>
      

      可以实现:

      基于:

      • 根级别是DEBUG

      设置:

      • File 级别为 DEBUG
      • Console 级别为 INFO

      问:@Stealth Rabbi:那是什么问题?

      A:原来的主要问题是:

      记录器名称语法错误

      那是name="filelogger"

          <logger name="filelogger" level="error">
              <appender-ref ref="MyFile"/>
          </logger>
      

      通常记录器名称是您的类名,例如

          <Logger name="com.foo.bar" level="error">
              <AppenderRef ref="MyFile"/>
          </Logger>
      

      另一个可能的小问题是:

      日志内容级别低于您的文件级别error,因此文件已创建但为空

      当设置文件级别为error,但是你的日志代码是低级别的,比如

      logger.debug("output something");
      

      即:

      代码中的记录器杠杆(debug) 文件级别(error)

      所以调试内容将输出到日志文件,日志文件保持为空。

      问:@Bendemann 如果我在 tomcat 服务器上运行 war 文件,是否可以指定要保存文件的路径?

      答:是的。只需将相对或绝对日志文件路径设置为FilefileName

      就像:

        <Appenders>
          <File name="FILEOUT" fileName="/your/path/your_log_filename.log" append="false">
      ...
      

      没问题。

      【讨论】:

        【解决方案5】:

        我使用&lt;ThresholdFilter /&gt;&lt;AppenderRef level=""&gt; 来做到这一点

        • 控制台:全部输出
        • app.log:>= 信息,错误除外
        • error.log:>= 错误

        查看

        <?xml version="1.0" encoding="UTF-8"?>      
        <Configuration status="error" monitorInterval="5"> <!-- status:error mean ONLY show log4j kernel's error log in console-->
            <Properties>
                <Property name="APP_LOG_ROOT">Your log's path</Property>
            </Properties>
            <Appenders>
                <Console name="Console" target="SYSTEM_OUT">
                    <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
                </Console>
                <RollingFile name="fileLogger" fileName="${APP_LOG_ROOT}/app.log" filePattern="${APP_LOG_ROOT}/app-%d{yyyy-MM-dd}.log">
                    <!-- Except Error -->
                    <ThresholdFilter level="error" onMatch="DENY" onMismatch="ACCEPT"/>
                    <PatternLayout>
                        <pattern>%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %level %logger{36} - %msg%n</pattern>
                    </PatternLayout>
                    <Policies>
                        <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                    </Policies>
                </RollingFile>
                <RollingFile name="errorLogger" fileName="${APP_LOG_ROOT}/error.log" filePattern="${APP_LOG_ROOT}/error-%d{yyyy-MM-dd}.log">
                    <PatternLayout>
                        <pattern>%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %level %logger{36} - %msg%n</pattern>
                    </PatternLayout>
                    <Policies>
                        <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                    </Policies>
                </RollingFile>
            </Appenders>
            <Loggers>
                <Root level="trace" >
                    <AppenderRef ref="Console" level="trace" />
                    <AppenderRef ref="fileLogger" level="info" />
                    <AppenderRef ref="errorLogger" level="error" />
                </Root>
            </Loggers>
        </Configuration>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-01-13
          相关资源
          最近更新 更多