【发布时间】:2011-10-05 09:38:58
【问题描述】:
我有一个具有 log4j 日志记录的 java 项目。它使用滚动文件附加程序和多个记录器来记录到文件。 我想添加一个 DBappender 并有一个单独的记录器,它只写入这个附加器,没有其他记录器向它发送消息。我需要说一个类有两个记录器,一个写入 fileAppender,一个写入 dbAppender。这可能吗,如果可以,它的配置是什么?
谢谢
【问题讨论】:
我有一个具有 log4j 日志记录的 java 项目。它使用滚动文件附加程序和多个记录器来记录到文件。 我想添加一个 DBappender 并有一个单独的记录器,它只写入这个附加器,没有其他记录器向它发送消息。我需要说一个类有两个记录器,一个写入 fileAppender,一个写入 dbAppender。这可能吗,如果可以,它的配置是什么?
谢谢
【问题讨论】:
可以在一个类中使用两个Loggers。
第一个想法:获取两个不同名称的记录器:
package com.mycompany.apackage.MyClass;
public class MyClass {
private static final logger = Logger.getLogger(Myclass.class)
private static final dbLogger = Logger.
getLogger(Myclass.class.getName() + ".dblogger")
}
为dbLogger的包配置:
<root>
<appender-ref ref="mainlog" />
</root>
<logger name="com.mycompany.apackage.MyClass.dblogger">
<appender-ref ref="dbappender" />
</logger>
(未测试。)
在这种情况下,dbLogger 也会记录到mainlog 附加程序。如果不合适,您可以使用
mainlog(和其他)附加程序中的自定义过滤器,用于过滤掉 dbLogger 的消息。另一种解决方案是为dbLogger 使用完全不同的前缀:
private static final logger = Logger.getLogger(Myclass.class)
private static final dbLogger = Logger.
getLogger("dblogger." + Myclass.class.getName())
Log4j 配置:
<root>
</root>
<logger name="com.mycompany">
<appender-ref ref="mainlog" />
</logger>
<logger name="dblogger.com.mycompany">
<appender-ref ref="dbappender" />
</logger>
请注意,如果您将相同的参数传递给getLogger() 方法,您将获得相同的Logger 对象,因此您必须使用不同的名称。
【讨论】: