log4j2外部库日志记录到单独的文件

时间:2018-01-29 10:21:59

标签: java log4j log4j2

我使用 log4j2 xml配置与路由附加程序和包装器。我通过不同的appender来登录项目不同部分的不同文件。我的配置看起来像这样。

<Configuration status="WARN">
<Appenders>


    <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{10}.%method:%line-%msg%n"/>
                    <SizeBasedTriggeringPolicy  size="100 MB" />
                </RollingFile>
            </Route>

            <!-- This route is chosen if ThreadContext has no value for key logFileName} -->
            <Route key="$${ctx:logFileName}">
                <RollingFile name="Rolling-default" fileName="logs/WITHOOUT-THREAD-CONTEXT.log"
                             filePattern="./logs/${date:yyyy-MM}/default-%d{yyyy-MM-dd}-%i.log.gz">
                    <PatternLayout>
                        <pattern>%d{ABSOLUTE} %level{length=5} [%thread] %logger{10}.%method:%line-%msg%n</pattern>
                    </PatternLayout>
                    <Policies>
                        <TimeBasedTriggeringPolicy interval="6" modulate="true" />
                        <SizeBasedTriggeringPolicy size="100 MB" />
                    </Policies>
                </RollingFile>
            </Route>

        </Routes>
    </Routing>
</Appenders>

问题是,我在第二条路线中获取了外部库日志(没有appender的日志)和我的项目日志,尽管我只想要外部日志。

1 个答案:

答案 0 :(得分:1)

我建议使用类似下面的配置 -

<Configuration status="WARN">
    <Appenders>

        <RollingFile name="RollingFile"
                             fileName="logs/${ctx:logFileName}"
                             filePattern="logs/${ctx:logFileName}.%i.log.gz">
            <PatternLayout pattern="d{ABSOLUTE} %level{length=5} [%thread] %logger{10}.%method:%line-%msg%n"/>
            <SizeBasedTriggeringPolicy  size="100 MB" />
        </RollingFile>

        <RollingFile name="Rolling-default" fileName="logs/WITHOOUT-THREAD-CONTEXT.log"
                             filePattern="./logs/${date:yyyy-MM}/default-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout>
                <pattern>%d{ABSOLUTE} %level{length=5} [%thread] %logger{10}.%method:%line-%msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="6" modulate="true" />
                <SizeBasedTriggeringPolicy size="100 MB" />
            </Policies>
        </RollingFile>
    </Appenders>
    <Loggers>
        <Logger name="application.package" level="info" additivity="false">
            <appender-ref ref="RollingFile" />
        </Logger>
        <Root level="info" additivity="false">
            <appender-ref ref="Rolling-default" />
        </Root>
    </Loggers>
</Configuration>

在此配置中,有2个记录器。一个记录器适用于具有根包名称的应用程序 - application.package。此包应包含应用程序的所有子包和类。它将使用RollingFile Appender进行记录。

另一个是Root记录器,可用于记录外部库,即不在application.package中的类。它将使用Rolling-default Appender

在上面的配置中,您通过上下文查找设置fileName,因此您必须在开头设置上下文值,否则您将收到错误。