如何在logback

时间:2017-02-28 12:30:15

标签: spring logging spring-boot logback

在我的控制器中,我得到id作为请求参数。有没有办法使用此id来标识此特定请求的所有日志条目?

@ResponseBody
@RequestMapping(value="/anyRequest", method = RequestMethod.GET)
public String doAnything(@RequestParam(value="Id", required = true) long id) {
    logger.info(id);
    return "";
}

表示此条目的任何位置应为id值:

2017-02-28 08:30:41.035 INFO 23050 --- [http-bio-1084-exec-20] AnyServiceImpl ...

我正在使用logback并进行此配置:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <springProfile name="dev">
       <property name="FILE_PATH" value="C:\\DATA\\temp" />
    </springProfile>

    <appender name="FILE-AUDIT"
        class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${FILE_PATH}/service.log</file>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>
                %d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n
            </Pattern>
        </encoder>

        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily -->
            <fileNamePattern>service.%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>25MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <maxHistory>90</maxHistory>
        </rollingPolicy>
    </appender>

    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <charset>UTF-8</charset>
            <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n</Pattern>
        </encoder>
    </appender>

    <logger name="Service" level="info"
        additivity="false">
        <appender-ref ref="FILE-AUDIT" />
        <appender-ref ref="consoleAppender" />
    </logger>

    <root level="info">
        <appender-ref ref="FILE-AUDIT" />
        <appender-ref ref="consoleAppender" />
    </root>

</configuration>

我以这种方式使用记录器:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

private final Logger logger = LoggerFactory.getLogger(this.getClass());

是否有开箱即用的魔法?

1 个答案:

答案 0 :(得分:1)

使用MDC实现此目的。

控制器方法:

    @ResponseBody
    @RequestMapping(value="/anyRequest", method = RequestMethod.GET)
    public String doAnything(@RequestParam(value="Id", required = true) long id) {
        try {
            MDC.put("id", id);
            logger.info(id);
            return "";
        } finally {
            org.slf4j.MDC.clear();
        }
    }

<强> Logback.xml:

<Pattern>[%X{id}] %d{yyyy-MM-dd HH:mm:ss.SSS} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%t] %-40.40logger{39} : %m%n</Pattern>