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 为空。
我有一个应用程序和多个客户,我想通过 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 为空。