【问题标题】:log4j2 external library logs to separate fileslog4j2 外部库日志到单独的文件
【发布时间】:2018-01-29 10:21:59
【问题描述】:

我正在使用带有 Routing Appender 和包装器的 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>

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

【问题讨论】:

  • 您应该尝试使用RollingFile Appender 配置Logger。这应该很容易做到。
  • @VikasSachdeva 你能解释一下吗?
  • 如果您的应用程序日志和外部库日志都在第二条路线上,这意味着您没有清除设置上下文查找变量logFileName 值。
  • @VikasSachdeva 你的回答实际上解决了我的问题,我只是想赞成它。所以你可以转发它。附言是的,我正在清除 ThreadContext
  • 好的。我已经转发了

标签: java log4j log4j2


【解决方案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-defaultAppender

在上述配置中,您通过上下文查找设置fileName,因此您必须在开始时设置上下文值,否则会出错。

【讨论】:

    猜你喜欢
    • 2017-11-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多