【问题标题】:Log4j2 - log4j2.xml configurationLog4j2 - log4j2.xml 配置
【发布时间】:2015-01-26 13:52:38
【问题描述】:

我正在启动新的 log4j2。我有一个问题,

我有一个 log4j2 xml 文件,我想将日志保存在自己的级别。 例如信息级别的日志保存在 info.txt 文件中,错误级别的日志保存在 error.txt 文件中。 这是我的 log4j2.xml 代码;

<Properties>
    <Property name="log-path">logs</Property>
</Properties>

<Appenders>

    <Console name="console-log" target="SYSTEM_OUT">
        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
    </Console>


    <RollingFile name="trace-log"
        filePattern="${log-path}/trace-%d{yyyy-MM-dd}.log"
        fileName="${log-path}/trace.log" >
        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
        <Policies>
            <TimeBasedTriggeringPolicy modulate="true" interval="1" />
        </Policies>
    </RollingFile>

    <RollingFile name="info-log"
        filePattern="${log-path}/info-%d{yyyy-MM-dd}.log"
        fileName="${log-path}/info.log">
        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
        <Policies>
            <TimeBasedTriggeringPolicy modulate="true" interval="1" />
        </Policies>
    </RollingFile>

    <RollingFile name="error-log"
        filePattern="${log-path}/error-%d{yyyy-MM-dd}.log"
        fileName="${log-path}/error.log">
        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
        <Policies>
            <TimeBasedTriggeringPolicy modulate="true" interval="1" />
        </Policies>
    </RollingFile>

</Appenders>

<Loggers>
    <Logger name="com.test.log4j2" level="debug">
        <appender-ref level="debug" ref="trace-log" />
        <appender-ref level="error" ref="error-log" />
        <appender-ref level="debug" ref="console-log" />
        <appender-ref level="info" ref="info-log" />
    </Logger>
    <Root additivity="false" level="info">
        <AppenderRef ref="error-log" />
    </Root>
</Loggers>

感谢您的帮助。

【问题讨论】:

  • 它是否有效?如果不是,那是什么问题?
  • 只是保存error.log文件。信息日志未保存。
  • 那是因为你在根记录器中定义了它。
  • 所以?我该如何解决?

标签: java logging log4j log4j2


【解决方案1】:

您不需要为此定义单独的记录器。

尝试类似:

<Loggers>
   <Root level="trace">
      <AppenderRef level="DEBUG" ref="trace-log" />
      <AppenderRef level="ERROR" ref="error-log" />
      <AppenderRef level="DEBUG" ref="console-log" />
      <AppenderRef level="INFO" ref="info-log" />
   </Root>
</Loggers>

【讨论】:

  • 我累了,但所有关闭的日志文件都一样。我只想要error.log文件中的错误日志,info.log文件中的信息日志。但是在您的代码中,三个文件具有相同的日志值。
  • 当我写“logger.trace()”时,它应该保存在trace.log文件中。当我写“logger.info()”时,它应该保存在 info.log 文件中。当我写“logger.error()”时,它应该保存在 error.log 文件中。但是在这里trace.log 文件、info.log 文件和error.log 文件中都有错误级别的消息。所有文件的日志值都相同。
  • 我不确定你的配置是什么,但即使它说的一样here
  • 感谢您的关注。
【解决方案2】:

我使用过滤器解决了我的问题。

<Properties>
    <Property name="log-path">logs</Property>
</Properties>

<Appenders>

    <Console name="console-log" target="SYSTEM_OUT">
        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
    </Console>


    <RollingFile name="trace-log"
        filePattern="${log-path}/trace-%d{yyyy-MM-dd}.log"
        fileName="${log-path}/trace.log" >

        <Filters>
        <ThresholdFilter level="warn"  onMatch="DENY"   onMismatch="NEUTRAL"/>
        <ThresholdFilter level="error" onMatch="DENY"   onMismatch="NEUTRAL"/>
        <ThresholdFilter level="fatal" onMatch="DENY"   onMismatch="NEUTRAL"/>
        <ThresholdFilter level="info" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="debug" onMatch="DENY" onMismatch="NEUTRAL"/>
        <ThresholdFilter level="TRACE" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>

        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
        <Policies>
            <TimeBasedTriggeringPolicy modulate="true" interval="1" />
        </Policies>
    </RollingFile>

    <RollingFile name="info-log"
        filePattern="${log-path}/info-%d{yyyy-MM-dd}.log"
        fileName="${log-path}/info.log">

        <Filters>
        <ThresholdFilter level="warn"  onMatch="DENY"   onMismatch="NEUTRAL"/>
        <ThresholdFilter level="error" onMatch="DENY"   onMismatch="NEUTRAL"/>
        <ThresholdFilter level="fatal" onMatch="DENY"   onMismatch="NEUTRAL"/>
        <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/>
        </Filters>

        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
        <Policies>
            <TimeBasedTriggeringPolicy modulate="true" interval="1" />
        </Policies>
    </RollingFile>

    <RollingFile name="error-log"
        filePattern="${log-path}/error-%d{yyyy-MM-dd}.log"
        fileName="${log-path}/error.log">

        <PatternLayout pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"/>
        <Policies>
            <TimeBasedTriggeringPolicy modulate="true" interval="1" />
        </Policies>
    </RollingFile>

</Appenders>

<Loggers>
    <Root level="trace">
  <AppenderRef level="DEBUG" ref="trace-log" />
  <AppenderRef level="ERROR" ref="error-log" />
  <AppenderRef level="DEBUG" ref="console-log" />
  <AppenderRef level="INFO" ref="info-log" />

谢谢。

【讨论】:

  • 显然你不明白阈值过滤器的工作原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-27
  • 2015-11-30
  • 1970-01-01
  • 2012-11-06
  • 2013-04-09
  • 2014-10-18
  • 1970-01-01
相关资源
最近更新 更多