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

标签 java log4j log4j2

我使用带有路由附加器和包装器的log4j2 xml配置。我传递不同的附加程序来记录项目不同部分的不同文件。我的配置看起来像这样。

<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>

问题是,我在第二条 route 获取外部库日志(那些没有附加程序的日志)和我的项目日志,尽管我只想要外部日志。

最佳答案

我建议使用如下配置 -

<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,因此您必须在开始时设置上下文值,否则会出现错误。

关于java - log4j2 外部库日志记录到单独的文件中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48498963/

相关文章:

java - 抽象类和抽象方法

java - 为什么刷新对 System.err 不起作用?

java - 如何修复 GWT 中的 "Cookie set without httpOnly"安全问题

java - 使用 log4j-web.jar 在 Web 应用程序中配置 Log4j2

java - 使用 Liferay 上传大文件(GB 数据)

java - Log4j,Append = true/false 的含义

java - log4j 和夏令时

java - 为什么 Log4j 试图找到 log4j.dtd

java - 在 log4j2 中创建惰性消息

java - 仅通过代码配置 log4j2 - 以防缺少配置