如何为 slf4j 标记配置 logback.xml 文件

Gok*_*enG 5 logging logback slf4j

我想org.slf4j.Marker在我的应用程序中使用。我已经有一个 logback.xml 文件,无需标记即可正常工作。Java代码是这样的:

    public class SimpleActivitiIntegrationService implements ActivitiIntegrationService {
        private static final Marker PROCESS_INTEGRATION_MARKER = MarkerFactory.getMarker("PROCESS_INT");
        private static final Logger LOGGER = LoggerFactory.getLogger(SimpleActivitiIntegrationService.class);
        ...
        public void sendRequest(String s) throws RuntimeException {
            LOGGER.debug(PROCESS_INTEGRATION_MARKER, "Method started:%s", "sendRequest");
    }
}
Run Code Online (Sandbox Code Playgroud)

文件logback.xml是这样的:

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <file>${log.path}/${log.file.name}.${log.file.extension}</file>

    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
        <!-- daily rollover -->
        <fileNamePattern>
            ${log.path}/${archieve.dir.name}/${log.file.name}.%d{yyyy-MM-dd}.%i.${log.file.extension}
        </fileNamePattern>

        <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
            <!-- or whenever the file size reaches 10MB -->
            <maxFileSize>10MB</maxFileSize>
        </timeBasedFileNamingAndTriggeringPolicy>

        <!-- keep 30 days' worth of history -->
        <maxHistory>30</maxHistory>
    </rollingPolicy>

    <encoder>
        <pattern>
            %d [%X{contexPath}] [%thread] %-5level %logger{35} %method - %msg%n
        </pattern>
    </encoder>
    <turboFilter class="ch.qos.logback.classic.turbo.MarkerFilter">
        <Name>PROCESS_INT_FILTER</Name>
        <Marker>PROCESS_INT</Marker>
        <OnMatch>ACCEPT</OnMatch>
        <OnMismatch>NEUTRAL</OnMismatch>
    </turboFilter>
</appender>
Run Code Online (Sandbox Code Playgroud)

但我绝对不确定logback.xml文件中标记的用法。

此配置的输出是:

2014-03-21 17:25:17,041 [] [http-bio-8080-exec-1] DEBUG t.c.i.s.a.s.e.SimpleActivitiIntegrationService sendRequest - Method started:%s
Run Code Online (Sandbox Code Playgroud)

我的配置有什么问题?提前致谢。

编辑:将评估器添加到 Appender:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
        <marker>PROCESS_INT</marker>
    </evaluator>
    <!-- encoders are assigned the type ch.qos.logback.classic.encoder.PatternLayoutEncoder
        by default -->
    <encoder>
        <pattern>
            %d [%X{contextPath}] [%thread] %-5level %logger{35} %method - %msg%n
        </pattern>
    </encoder>
</appender>
Run Code Online (Sandbox Code Playgroud)

我懂了:

2014-03-25 02:06:58,892 [] [http-bio-8080-exec-1] DEBUG t.c.i.s.a.s.e.SimpleActivitiIntegrationService sendRequest - Response acquired payloadType:%s, respCode:%s
Run Code Online (Sandbox Code Playgroud)

编辑2:

我懂了

2014-03-25 02:06:58,892 [] [http-bio-8080-exec-1] DEBUG t.c.i.s.a.s.e.SimpleActivitiIntegrationService sendRequest - Method started:sendRequest
Run Code Online (Sandbox Code Playgroud)

但我认为我应该从 开始PROCESS_INT,我错了吗?

Dar*_* X. 6

由于您使用的是 Turbo Filter 而不是常规过滤器,因此它与整体上下文相关,而不是与特定的附加程序相关。因此,您需要在外部定义它:例如在标签之后。

如果您想在特定的附加程序上使用它,您可以使用常规过滤器。

<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
    <evaluator class="ch.qos.logback.classic.boolex.OnMarkerEvaluator">
      <marker>PROCESS_INT</marker>
    </evaluator>
... ... etc.    ...  ...
Run Code Online (Sandbox Code Playgroud)

检查该标记并允许或禁止该附加程序。

对于格式,当您在 Java 中记录消息时,您需要使用“{}”,而不是“%s”样式格式。

LOGGER.debug(PROCESS_INTEGRATION_MARKER, "Method started:{}", "sendRequest");
Run Code Online (Sandbox Code Playgroud)

本质上,这与您自己格式化消息非常相似,但在某些情况下它可能会带来性能优势。

  • 我不确定您想在日志上看到什么。您想查看标记的*名称*吗?如果是这样,您可以在模式中的某个位置(在 logback.xml 文件中)添加 %marker。 (2认同)
  • %marker 记录在手册中:http://logback.qos.ch/manual/layouts.html 如果您想设置一些随时间变化的其他变量,logback 记录器支持上下文。如果您在记录之前为上下文设置值,这些值将在日志中可用。请参阅 MDC:http://logback.qos.ch/manual/mdc.html (2认同)