Log4j2 - 一个应用程序,倍数日志和级别

时间:2016-05-24 10:57:10

标签: java logging configuration log4j2

我有一个应用程序和多个客户,我想通过customerId(java变量)分隔日志,还可以创建不同类型的级别层次结构。

例如:

/logs/customer1/admin.txt

/logs/customer1/support.txt

/logs/customer2/admin.txt

/logs/customer2/support.txt

我可以通过这种方式将“级别”分开: log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration status="WARN">
    <properties>
    <property name="appName">App</property>
    <property name="pattern">%d{HH:mm:ss.SSS} ${appName} %-5level %logger{36} - %msg%n</property>

    </properties>

    <appenders>
     <File name="adm" fileName="c:\logs\adm.txt" append="true">
            <PatternLayout pattern="${pattern}" />
    </File>
    <File name="support" fileName="c:\logs\support.txt" append="true">
            <PatternLayout pattern="${pattern}" />
    </File>
    </appenders>
    <loggers>
        <Logger name="adm" additivity="false">
            <AppenderRef ref="adm" />
        </Logger>
        <Logger name="support" additivity="false">
            <AppenderRef ref="adm" />
            <AppenderRef ref="support" />
        </Logger>
        <root level="ERROR">
            <appender-ref ref="support" />
            <appender-ref ref="adm" />
        </root>
    </loggers>
</configuration>

并在java中:

static final Logger adm = LogManager.getLogger("adm");
static final Logger support= LogManager.getLogger("support");
当我使用“support.info”时,使用此配置

...日志将转到这两个文件。它很完美。但是我无法通过customerID分开

我做得对吗? 如何通过customerId(java变量)分隔?

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用RoutingAppender分隔日志。基本上,您将客户ID放在ThreadContext中,然后让RoutingAppender创建一个FileAppender,它根据模式写入文件位置。这也有一个优点,即客户ID可以包含在每个日志记录中,您的应用程序也可以从那里检索它,而不是要求它作为参数在任何地方传递。

有关如何执行此操作的示例,请参阅http://logging.apache.org/log4j/2.x/manual/appenders.html#RoutingAppender

答案 1 :(得分:0)

我替换的每个appender:

    <Routing name="sadm">
        <Routes pattern="${ctx:customerId}">
            <Route>
                <File name="sadm" fileName="${path}\${ctx:customerId}\sadm.txt"
                    append="true">
                    <PatternLayout pattern="${pattern}" />
                </File>
            </Route>
            <Route ref="sadm_commom" key="${ctx:customerId}" />
        </Routes>
    </Routing>

并创建了一个名为:sadm_commom

的新appender
            <Route ref="sadm_commom" key="${ctx:customerId}" />

如果customerID为null。