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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/17418494/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 14:05:43  来源:igfitidea点击:

log4j2 xml configuration - Log to file and console (with different levels)

xmllog4jlog4j2

提问by daker

I want to do two things:

我想做两件事:

  1. Log to console with a certain log-level
  2. Log to file with another log-level
  1. 使用特定的日志级别登录到控制台
  2. 使用另一个日志级别记录到文件

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

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

This is my log4j2.xml

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

可能有什么问题?

回答by daker

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

我想到了!该<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>

回答by Gaurang Patel

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,

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

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:

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

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

回答by basiljames

<logger name="filelogger" level="error" >
This should be the problem. The name of the logger usually is your package name (unless you have specifically named it filelogger).
Try <logger name="com.yourpackage" level="error" additivity="true">

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

Refer Log4j2 Doc

参考Log4j2 文档

回答by crifan

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

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

my log4j2.xmlConfiguration

我的log4j2.xml配置

my case:

我的情况:

  • log4j2 version: 2.13.0

  • log4j2.xmlconfiguration:

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

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

A: as official docalso mentioned, the core part:

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

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

can achieve:

可以达到:

based on:

基于:

  • root level is DEBUG
  • 根级别是 DEBUG

set:

放:

  • Filelevel to DEBUG
  • Consolelevel to INFO
  • File水平到 DEBUG
  • Console水平到 INFO

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

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

A: original main problem is:

A:原来的主要问题是:

the logger name syntax is wrong

记录器名称语法错误

that is name="filelogger"in:

这是name="filelogger"在:

    <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

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

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

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

logger.debug("output something");

that is:

那是:

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

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

so debug content will NOToutput to log file, log file keep empty.

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

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

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

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

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

just like:

就像:

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

is ok.

没问题。

回答by u5289743

I use <ThresholdFilter />and <AppenderRef level="">to do this

我使用<ThresholdFilter /><AppenderRef level="">执行此操作

  • Console: output all
  • app.log: >= info, except error
  • error.log: >= error
  • 控制台:输出所有
  • app.log: >= info, 除了错误
  • 错误日志:>= 错误

SEE

  • <ThresholdFilter level="error" onMatch="DENY" onMismatch="ACCEPT"/>

  • <AppenderRef ref="fileLogger" level="info" />

  • <ThresholdFilter level="error" onMatch="DENY" onMismatch="ACCEPT"/>

  • <AppenderRef ref="fileLogger" level="信息" />

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