过滤log4j中的子类

时间:2011-07-06 14:32:42

标签: java log4j

我有一个消息驱动系统,例如com.example.BaseMessagingAgent类,它是许多消息代理的基本类。此基类记录消息事件。该基类有许多子类,实现了系统的不同特定代理。让我们com.example.MyAgent扩展com.example.BaseMessagingAgent就是其中之一。

我想记录仅与MyAgent类相关的消息。但我不能将日志定义为:

log4j.logger.com.example.MyAgent=DEBUG, APPENDER

因为日志发生在父类com.example.BasicMessagingAgent中 - 我什么都不记录。

而且我也不想在基类中设置日志记录:

log4j.logger.com.example.BaseMessagingAgent=DEBUG, APPENDER

因为它会记录所有代理的事件,我会有很多不必要的日志记录。

enyone是否知道如何将日志记录限制为只有一个子类?

2 个答案:

答案 0 :(得分:1)

你应该为Log4j编写一个过滤器,因为AFAIK无法将这些信息放在log4j.properties文件中。更多详情请见http://books.google.it/books?id=vHvY008Zq-YC&lpg=PA95&ots=yi335bZU7z&dq=&pg=PA95#v=onepage&q&f=false

答案 1 :(得分:0)

实际上很简单。

首先,将appender添加到根记录器。真。它会让你的生活更加简单。

现在配置整个事情:

log4j.rootLogger=DEBUG, APPENDER
log4j.logger.com=ERROR
log4j.logger.com.example.MyAgent=DEBUG

“com。*”下面的所有类的默认值是仅记录错误。唯一的例外是com.example.MyAgent,它将在调试级别登录。

您还需要将根记录器设置为DEBUG,否则它将丢弃所有DEBUG日志消息。

下一步是每个实例使用一个记录器。为此,只需删除您创建记录器的行中的static,然后将BaseMessagingAgent替换为getClass()

我知道,看起来有点矫枉过正,但这就是log4j的工作方式。另外,为每个实例创建一个记录器并不是非常昂贵(除非你每秒创建数百万MyAgent)。

如果你真的想要将一个appender添加到一个类中,那么不要忘记关闭可加性(...Class.additivity=false),否则你将获得两次所有日志消息。