log4j2 xml配置 - 登录到文件和控制台(具有不同级别)

dak*_*ker 38 xml log4j log4j2

我想做两件事:

  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>
Run Code Online (Sandbox Code Playgroud)

可能有什么问题?

dak*_*ker 61

我想到了!该<Logger>标签不应该在这种情况下使用,请参阅GAURANG帕特尔对细节的答案.

<?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>
Run Code Online (Sandbox Code Playgroud)

  • 那问题是什么?发布没有解释的解决方案没有帮助 (5认同)

Gau*_*tel 17

虽然Daker已经提供了更正的配置文件,但他没有解释.我想在这里补充说明.作为Log4j2文档引述这里,<记录仪>的使用并不需要对给定需求的标签.你应该使用<Logger>标签吗?从文档中阅读以下说明,

也许希望从com.foo.Bar之外的所有内容中删除所有TRACE输出.简单地更改日志级别将无法完成任务.相反,解决方案是在配置中添加新的记录器定义:

<Loggers>
  <Logger name="com.foo.Bar" level="TRACE"/> 
  <Root level="ERROR">  
    <AppenderRef ref="STDOUT"> 
  </Root>
  ...
</Loggers>
Run Code Online (Sandbox Code Playgroud)


cri*_*fan 6

总结其他人 ( @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>
Run Code Online (Sandbox Code Playgroud)

Q:如何实现不同级别的文件和控制台?

A:正如官方文档也提到的,核心部分:

    <Root level="debug">
      <AppenderRef ref="FILEOUT" level="debug"/>
      <AppenderRef ref="STDOUT" level="info"/>
    </Root>
Run Code Online (Sandbox Code Playgroud)

可以达到:

基于:

  • 根级别是 DEBUG

放:

  • File 水平到 DEBUG
  • Console 水平到 INFO

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

A:原来的主要问题是:

记录器名称语法错误

这是name="filelogger"在:

    <logger name="filelogger" level="error">
        <appender-ref ref="MyFile"/>
    </logger>
Run Code Online (Sandbox Code Playgroud)

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

    <Logger name="com.foo.bar" level="error">
        <AppenderRef ref="MyFile"/>
    </Logger>
Run Code Online (Sandbox Code Playgroud)

另一个可能的小问题是:

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

当将文件级别设置为error,但您的日志代码级别较低时,例如

logger.debug("output something");
Run Code Online (Sandbox Code Playgroud)

那是:

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

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

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

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

就像:

  <Appenders>
    <File name="FILEOUT" fileName="/your/path/your_log_filename.log" append="false">
...
Run Code Online (Sandbox Code Playgroud)

没问题。


bas*_*mes 5

<logger name="filelogger" level="error" >
这应该是问题所在.记录器的名称通常是您的包名(除非您专门命名filelogger).
尝试<logger name="com.yourpackage" level="error" additivity="true">

参考Log4j2 Doc