如何每天在路由appender中滚动一个新的日志文件

时间:2015-11-25 18:46:20

标签: java log4j log4j2

我的路由log4j2.xml应该是基于用户登录的角色日志文件。

假设用户连续3天登录应用程序,并在半小时内完成他的工作,然后注销。因此,根据要求,应为已记录的用户创建3个日志文件(每天一个文件在单独的文件中) 像例如

john-20-11-2015.log, 
john-21-11-2015.log, 
john-22-11-2015.log

下面是Log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE xml>
<Configuration status="WARN" name="MySite" monitorInterval="30">
    <Appenders>

        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout>
                <pattern>[%-5level] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%c{1}] - %msg%n</pattern>
            </PatternLayout>
        </Console>

        <RollingFile name="error-log" 
            fileName="D:/myLogs/error [${date:yyyy-MM-dd}].log" filePattern="D:/myLogs/error-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%c{1}] - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>

        <RollingFile name="trace-log" 
            fileName="D:/myLogs/trace [${date:yyyy-MM-dd}].log" filePattern="D:/myLogs/trace-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%c{1}] - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true"/>
            </Policies>
        </RollingFile>

        <Routing name="RoutingAppender">
            <Routes pattern="$${ctx:logFileName}">
                <Route>
                    <RollingFile name="Rolling-${ctx:logFileName}" append="true"
                        fileName="D:/myLogs/${ctx:logFileName}~${date:yyyy-MM-dd}.log"
                        filePattern="D:/myLogs/%d{yyyy-MM-dd}-%i.log">
                        <PatternLayout
                            pattern="SERVER-LOG: [%-5level] [%d{yyyy-MM-dd HH:mm:ss.SSS}] [%logger{1}] - %msg%n" />
                        <Policies>
                            <TimeBasedTriggeringPolicy interval="1" modulate="true" />
                        </Policies>
                    </RollingFile>
                </Route>
                <Route ref="Console" key="$${ctx:logFileName}" />
            </Routes>
        </Routing>

    </Appenders>

    <Loggers>
        <Root level="trace" additivity="false">
            <Appender-Ref ref="Console"/>
            <appender-ref ref="error-log" level="error"/>
            <appender-ref ref="trace-log" level="trace"/>
            <Appender-Ref ref="RoutingAppender" />
        </Root>
    </Loggers>
</Configuration>

我正在打电话

ThreadContext.put("logFileName", userName);

将日志附加到路由追加器中,日志正确地附加在相应的日志中 我在注销方法

期间清除threadcontext
ThreadContext.remove("logFileName");
ThreadContext.clearAll();

我在tomcat中托管了我的应用程序。日志文件是根据记录的用户为每个用户根据文件名模式生成的,但日志不是每天生成的,而是在前一天日志中附加当前用户日志

例如:john-20-11-2015.log包含21日和22日的日志

仅在tomcat停止启动时才将其作为新日志文件。

伙计们帮帮我..有什么不对吗

2 个答案:

答案 0 :(得分:1)

我想你想要DailyRollingFileAppender here is an example

另请查看similar question

示例:

<appender name="FILE" class="org.apache.log4j.DailyRollingFileAppender">
    ...
    <param name="DatePattern" value="'.'yyyy-MM-dd" />
    ...
</appender>

答案 1 :(得分:0)

仅在创建appender时评估filename属性。它在每次翻转时都不会改变。您应该在每个翻转中获得一个新文件,其中包含正确的日期。

这不是你所看到的吗?