Search code examples
javalogginglogback

Logback file per logger dynamicaly


I have "special" requirement on loggin - I need every logger in separate file.

Java

Logger log1 = LoggerFactory.getLogger("dynamic.log1");
Logger log2 = LoggerFactory.getLogger("dynamic.log2");
//...

Then I want logback any output from log1 to be written to file log1.log and so on. Is it possible to "dynamicaly" create new appender's like that with logback?

Can some other logging framework be used to solve this use-case?

I could configure appenders manualy but this is what I want to avoid. Like whenever I add dynamic logger, new appender/file is accordingly created.

EDIT:

I implemented custom discriminator:

public class LoggerBasedDiscriminator extends AbstractDiscriminator<ILoggingEvent> {
    private static final String LOGGER_NAME = "loggerName";
    @Override
    public String getDiscriminatingValue(ILoggingEvent e) {
        return e.getLoggerName();
    }
    @Override
    public String getKey() {
        return LOGGER_NAME;
    }
}

And then my appender config looks like this:

<appender name="SIFT" class="ch.qos.logback.classic.sift.SiftingAppender">
    <discriminator class="cz.svobol.logging.LoggerBasedDiscriminator">
        <key>loggerName</key>
        <defaultValue>root</defaultValue>
    </discriminator>
    <sift>
        <appender name="FILE-${loggerName}" class="ch.qos.logback.core.FileAppender">
            <file>${loggerName}.log</file>
            <encoder>
                <pattern>%msg%n</pattern>
            </encoder>
        </appender>
    </sift>
</appender>

Solution

  • You can use a SiftingAppender.

    This way you have one appender that can divide the log into different files dynamically.