Different log files for multiple threads using log4j2

前端 未结 2 1493
梦谈多话
梦谈多话 2021-01-06 14:43

I am running a Java application in which I am invoking multiple threads, each with some unique names. Now I want to create multiple log files for each of them and the name o

相关标签:
2条回答
  • 2021-01-06 14:58

    This can be done with the RoutingAppender. The FAQ page has a good example config.

    0 讨论(0)
  • 2021-01-06 15:00

    I agree a RoutingAppender is the way to go. I initially used the routing appender in conjunction with the ${ctx:threadName} lookup where the 'ctx' uses the ThreadContext. I found that I would have to sprinkle in the code a line like this:

    ThreadContext.put("threadName", Thread.currentThread().getName());
    

    While that code works it's not extensible in the design of the code. If I were to add a new java.lang.Runnable to the code base, I would have to also include that line.

    Rather, the solution seems to be to implement the 'org.apache.logging.log4j.core.lookup.StrLookup' and register the @Plugin with the PluginManager Like this:

    Class: ThreadLookup

    package my.logging.package    
    import org.apache.logging.log4j.core.LogEvent;
    import org.apache.logging.log4j.core.config.plugins.Plugin;
    import org.apache.logging.log4j.core.lookup.StrLookup;
    
    @Plugin(name = "thread", category = StrLookup.CATEGORY)
    public class ThreadLookup implements StrLookup {
    
    @Override
    public String lookup(String key) {
        return Thread.currentThread().getName();
    }
    
    @Override
    public String lookup(LogEvent event, String key) {
        return event.getThreadName() == null ? Thread.currentThread().getName()
                : event.getThreadName();
    }
    
    }    
    

    Configuration: log4j2.xml (packages attribute of the Configuration registers the @Plugin with the PluginManager)

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="warn" packages="my.logging.package">
        <Appenders>
            <Routing name="Routing">
                <Routes pattern="$${thread:threadName}">
                    <Route>
                        <RollingFile name="logFile-${thread:threadName}"
                        fileName="logs/concurrent-${thread:threadName}.log" filePattern="logs/concurrent-${thread:threadName}-%d{MM-dd-yyyy}-%i.log">
                        <PatternLayout pattern="%d %-5p [%t] %C{2} - %m%n" />
                        <Policies>
                            <SizeBasedTriggeringPolicy size="50 MB" />
                        </Policies>
                        <DefaultRolloverStrategy max="100" />
                    </RollingFile>
                </Route>
            </Routes>
        </Routing>
        <Async name="async" bufferSize="1000" includeLocation="true">
            <AppenderRef ref="Routing" />
        </Async>
    </Appenders>
    <Loggers>
        <Root level="info">
            <AppenderRef ref="async" />
        </Root>
    </Loggers>
    

    0 讨论(0)
提交回复
热议问题