我们能否创建两个log4j实例?

3

我们能否在一个类中创建两个log4j实例,一个用于写入文件,另一个用于jdbc适配器?

// one to write log in console
Logger log = Logger.getLogger(this.getClass()); 

// write in database within one class 
Logger log1 = Logger.getLogger(this.getClass()); 

我使用的JDBC适配器是:

我的文件适配器是:
我想要Logger实例log用于文件,Logger实例log1用于JDBC。


1
在您的示例中,两个实例是相同的。 - Sam
3个回答

2
log4j中有各种可用的Appenders,它们具有描述性名称,例如FileAppender、ConsoleAppender、SocketAppender、SyslogAppender、NTEventLogAppender甚至SMTPAppender。多个Appenders可以附加到任何记录器上,因此可以将相同的信息记录到多个输出;例如本地文件和另一台计算机上的套接字侦听器。

此外,如果想根据级别将日志写入不同的输出,则可以尝试按级别记录到appender


我的问题是我想在文件系统中编写一些内部逻辑处理,并将我的请求和响应保存在数据库中。我知道有像上面给出的适配器。在一个单独的类中,我想写一个在文件中的逻辑和另一个在数据库中的逻辑。 - Mallika

1

只有在给第二个记录器命名不同的情况下才能起作用。否则,两个变量将包含相同的实例。例如:

Logger log = Logger.getLogger(this.getClass());
Logger log1 = Logger.getLogger(this.getClass().getName() + ".db");

那么你就有了两个独立的日志记录器。


好的,@Nitram,你会如何编写适配器来处理这个问题? - Mallika

1

我不确定是否创建了实例(或返回了相同的缓存实例),但即使如此,它也将具有相同的追加器配置(因为使用相同的类名用于分类)。

您可以通过不同的类别名称获得两个不同的记录器:

Logger log = Logger.getLogger(this.getClass()); 

Logger log1 = Logger.getLogger(this.getClass().getName()+".extra");

它们记录到哪里是在log4j.properties中配置的。

此外,您可以让同一个记录器记录到多个附加器,具体取决于优先级等过滤器。因此,除非您的代码中有复杂的逻辑来确定何时记录到何处,否则您只需使用一个记录器,它仍然可以同时记录到文件和数据库。


如何编写适配器以单独为log1实例编写日志,而不会为名称为“log”的日志编写任何日志。 - Mallika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接