Search code examples
spring-bootloggingmessage-queueaop

Springboot Event Logging


I have a scheduled task in a fixed rate, that reads a queue. Each message that comes from the queue has an ID.

I wanna know if it's possible split the log by ID, appending to a different file.

I was thinking about use aspects or a custom appender, one of these can do the job for me?

Thanks.


Solution

  • Well, after some search I've remembered of MDC (Mapped Diagnostic Context) wich can do what I want with almost no workarounds.

    I just need to add a SiftingAppender to the logback-spring.xml like this:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false">
        <include resource="org/springframework/boot/logging/logback/base.xml"/>
        <appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
            <discriminator>
                <key>checkoutId</key>
                <defaultValue>system</defaultValue>
            </discriminator>
            <sift>
                <appender name="${checkoutId}" class="ch.qos.logback.core.FileAppender">
                    <file>${checkoutId}.log</file>
                    <layout class="ch.qos.logback.classic.PatternLayout">
                        <pattern>%d{HH:mm:ss:SSS} | %-5level | %thread | %logger{20} | %msg%n%rEx</pattern>
                    </layout>
                </appender>
            </sift>
        </appender>
        <root level="INFO">
            <appender-ref ref="SIFT" />
        </root>
    </configuration>
    

    Than I call like that:

    @Scheduled(initialDelayString = "${consumeStart:10000}", fixedRateString = "${consumeRate:5000}")
    private void task() {
        try {
            val message = queue.get(timeout);
            if (message != null) {
                MDC.put("checkoutId", message.toString());
                . . .
            }
        } finally {
            MDC.remove("checkoutId");
        }
    }