Log4j2: How to write logs to separate files for each user?

前端 未结 2 677
走了就别回头了
走了就别回头了 2020-12-08 12:02

Here is the challenge I\'m facing:

I have a servlet program. And I need to write logs for each user to the folder named after that user. Something like this:

相关标签:
2条回答
  • 2020-12-08 12:48

    The Log4j2 FAQ page has an example that uses the RoutingAppender to achieve this.

    0 讨论(0)
  • 2020-12-08 12:59

    Thanks to @Remko Popma answer I figure it out. Here is the solution example:

    package com.bondarenko.tmp;
    
    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;
    import org.apache.logging.log4j.ThreadContext;
    
    public class TestRouting {
    
    private final static Logger log = LogManager.getLogger(TestRouting.class);
    
    public static void main(String[] args) {
        ThreadContext.put("logFileName", "David");
        log.info("Error happened");
    
        ThreadContext.put("logFileName", "Mark");
        log.info("Something is broken");
    
        ThreadContext.remove("logFileName");
    }
    }
    

    And log4j.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration status="warn">
    
    <Appenders>
        <Console name="consoleAppender" target="SYSTEM_OUT">
            <!--SHORT PATTERN-->
            <PatternLayout pattern="%d{ABSOLUTE} %level{length=5} [%thread] %logger{1} - %msg%n"/>
            <!--ROBUST PATTERN
            <PatternLayout pattern="%d{ISO8601} %level{length=5} [%thread] %logger - %msg%n"/>-->
        </Console>
    
        <Routing name="RoutingAppender">
            <Routes pattern="${ctx:logFileName}">
                <Route>
                    <RollingFile name="Rolling-${ctx:logFileName}"
                                 fileName="logs/${ctx:logFileName}"
                                 filePattern="logs/${ctx:logFileName}.%i.log.gz">
                        <PatternLayout pattern="%d{ABSOLUTE} %level{length=5} [%thread] %logger{1} - %msg%n"/>
                        <SizeBasedTriggeringPolicy size="512" />
                    </RollingFile>
                </Route>
    
                <!-- By having this set to ${ctx:logFileName} it will match when filename
                     is not set in the context -->
                <Route ref="consoleAppender" key="${ctx:logFileName}"/>
            </Routes>
        </Routing>
    
    </Appenders>
    
    <Loggers>
        <Logger name="com.bondarenko.tmp" level="info" additivity="false">
            <AppenderRef ref="RoutingAppender"/>
        </Logger>
    </Loggers>
    

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