如何根据其名称登录到其他文件

时间:2013-08-18 00:00:19

标签: java log4j logback

我希望能够做到:

// A logger.
private static final Logger log = LoggerFactory.getLogger(Foo.class);
// Stats logger.
private static final Logger stats = LoggerFactory.getLogger("Stats");

每当我登录statsstats.info(...))时,我希望日志条目转到名为 Stats.log 的文件。记录到log应该正常。

我(可能错误地)在Logback.xml中得到了以下内容:

A failed config that adds nothing to the question now ... removed.

我似乎无法找到任何告诉我如何根据记录器名称选择appender的东西。根据日志级别有足够的选择。

这是我最终得到的配置:

<configuration>

  <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>Log.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>Log-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!-- or whenever the file size reaches 1MB -->
        <maxFileSize>1MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- Check on startup too. -->
      <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>

    <encoder>
      <pattern>%date %level [%thread] %logger{10} [%file:%line] %msg%n</pattern>
    </encoder>
  </appender> 

  <appender name="STATS" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>Stats.log</file>
    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
      <!-- rollover daily -->
      <fileNamePattern>Stats-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
      <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
        <!-- or whenever the file size reaches 1MB -->
        <maxFileSize>1MB</maxFileSize>
      </timeBasedFileNamingAndTriggeringPolicy>
      <!-- Check on startup too. -->
      <cleanHistoryOnStart>true</cleanHistoryOnStart>
    </rollingPolicy>

    <encoder>
      <pattern>%date %msg%n</pattern>
    </encoder>
  </appender>

  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%level %msg%n</pattern>
    </encoder>
  </appender>

  <root level="debug">
    <appender-ref ref="FILE" />
    <appender-ref ref="STDOUT" />
  </root>

  <logger name="Stats" level="info">
    <appender-ref ref="STATS" />
  </logger>
</configuration>

它工作正常 - 虽然统计信息也记录到普通日志文件中,我可能需要使用过滤器删除。

2 个答案:

答案 0 :(得分:3)

您需要将STATS Appender附加到Stats Logger并将其从根记录器中删除:

<root level="debug">
    <appender-ref ref="FILE" />
    <appender-ref ref="STDOUT" />
  </root>

<logger name="Stats">
    <appender-ref ref="STATS" />
</logger>

应该这样做。

另一种方法是在“STATS”Appender上使用Filter

过滤器实现了为每个LoggingEvent调用的一个方法,并返回“yes”,“no”或“undecided”(然后将执行链中的下一个过滤器)

基本上你必须在你的“STATS”追加器上附加一个过滤器,它对你的统计记录器中的所有LoggingEvents都说“是”,而对所有其他东西都说“不”。

答案 1 :(得分:0)

你应该首先检查一下是不是一个案例问题:STATS vs Stats ......?

相关问题