我有一个应用程序和多个客户,我想通过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变量)分隔?
谢谢。
答案 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。