我有一个消息驱动系统,例如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是否知道如何将日志记录限制为只有一个子类?
答案 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
),否则你将获得两次所有日志消息。