log4j2 xml配置-记录到文件和控制台(有不同级别)。[英] log4j2 xml configuration - Log to file and console (with different levels)

本文是小编为大家收集整理的关于log4j2 xml配置-记录到文件和控制台(有不同级别)。的处理/解决方法,可以参考本文帮助大家快速定位并解决问题,中文翻译不准确的可切换到English标签页查看源文。

问题描述

我想做两件事:

  1. 用特定日志级登机登录
  2. log用另一个日志级文件

控制台记录似乎可以正常工作,但是日志文件一直空白.

这是我的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>

可能是什么问题?

推荐答案

我弄清楚了!在这种情况下,不应使用<Logger>标签,请参见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放置了更正的配置文件,但他没有解释.我想在这里添加说明.如log4j2文档中的引用在这里,在这里,使用标签不需要标签给定的要求.此外,您何时应该使用标签?请阅读以下说明文件的说明,

也许希望从 除com.foo.bar以外的所有内容.简单更改日志级别不会 完成任务.相反,解决方案是添加一个新的记录器 配置的定义:

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

其他推荐答案

摘要其他(@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>

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

a:AS 零件:

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

可以实现:

基于:

  • 根级是DEBUG

set:

  • File级别DEBUG
  • Console级别INFO

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

A:原始主要问题是:

记录器名称语法是错误的

是name="filelogger" in:

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

通常,logger名称是您的班级名称,例如

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

另一个可能的小问题是:

日志内容级别在您的文件级别error下方

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

logger.debug("output something");

是:

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

所以调试内容将不是输出日志文件,日志文件保持空.

Q:@Bendemann如果我在Tomcat服务器上运行WAR文件,可以指定我要保存文件的路径?

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

就像:

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

还可以.

本文地址:https://www.itbaoku.cn/post/1574789.html

问题描述

I want to do two things:

  1. Log to console with a certain log-level
  2. Log to file with another log-level

Console logging seems to work just fine but the log file keeps beeing empty.

This is my 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>

What might be wrong?

推荐答案

I figured it out! The <Logger> tag shouldn't be used in this case, see Gaurang Patel's answer for details.

<?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>

其他推荐答案

Although Daker had put the corrected configuration file but he didn't explain it. I would like to add explanation here. As quoted in Log4j2 Documentation here, usage of <Logger> tag was not required for the given requirement. Further when you should use <Logger> tag? Read below explanation form the documentation,

Perhaps it is desired to eliminate all the TRACE output from everything except com.foo.Bar. Simply changing the log level would not accomplish the task. Instead, the solution is to add a new logger definition to the configuration:

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

其他推荐答案

Summary others (@basiljames, @daker, @Jay Taylor) answers here:

my log4j2.xml Configuration

my case:

  • log4j2 version: 2.13.0

  • log4j2.xml configuration:

<?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: how to implement File and Console with different level ?

A: as official doc also mentioned, the core part:

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

can achieve:

based on:

  • root level is DEBUG

set:

  • File level to DEBUG
  • Console level to INFO

Q: @Stealth Rabbi: so what was the problem?

A: original main problem is:

the logger name syntax is wrong

that is name="filelogger" in:

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

for normally the logger name is your class name, like

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

another possible minor problem is:

log content level is below your file level error, so file created but empty

when set file level to error, but your log code is low level, such as

logger.debug("output something");

that is:

logger lever in code(debug) < file level(error)

so debug content will NOT output to log file, log file keep empty.

Q: @Bendemann is it possible to specify a path where I want to save the file if I am running a war file on a tomcat server?

A: yes. Just set the relative or absolute log file path to File's fileName.

just like:

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

is ok.