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

Log4j2 - One app, multiples logs and levels

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

例如:

/logs/customer1/admin.txt

/logs/customer1/support.txt

/logs/customer2/admin.txt

/logs/customer2/support.txt

我可以这样用 "levels" 分开: 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 变量)分开?

谢谢。

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

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

我替换的每个 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

的新附加程序
            <Route ref="sadm_commom" key="${ctx:customerId}" />

如果 customerID 为空。