48

我想做两件事:

  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>

可能有什么问题?

4

5 回答 5

77

我想到了!<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>
于 2013-07-02T11:35:32.133 回答
18

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

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

<Loggers>
  <Logger name="com.foo.Bar" level="TRACE"/> 
  <Root level="ERROR">  
    <AppenderRef ref="STDOUT"> 
  </Root>
  ...
</Loggers>
于 2015-05-19T09:39:51.340 回答
8

总结其他人(@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:正如官方文档也提到的,核心部分:

    <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 文件,是否可以指定要保存文件的路径?

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

就像:

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

没关系。

于 2020-02-01T04:05:31.920 回答
7

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

参考Log4j2 文档

于 2013-07-02T06:41:04.660 回答
1

我使用<ThresholdFilter /><AppenderRef level="">做到这一点

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

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

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

<?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>
于 2018-07-27T11:23:51.843 回答