开发者

Filtering a subclass in log4j

I have a message driven system with, say, com.example.BaseMessagingAgent class, which is a basic class for many message agents. This base class logs message events. There are many subclasses of this base class, implementing different specific agents of system. Let us com.example.MyAgent which extends com.example.BaseMessagingAgent is one of them.

I want to log messages only related to class MyAgent. But I cannot define logging as:

log4j.logger.com.example.MyAgent=DEBUG, APPENDE开发者_运维知识库R

because logging occurs in parent class com.example.BasicMessagingAgent - I will record nothing.

And I also do not want to set logging in base class:

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

because it will log events for all agents, and I will have a lot of unnecessary logging.

Does enyone know how to limit logging to only one subclass?


You should write a filter for Log4j since AFAIK there is no way to put such information on log4j.properties file. More details at http://books.google.it/books?id=vHvY008Zq-YC&lpg=PA95&ots=yi335bZU7z&dq=&pg=PA95#v=onepage&q&f=false


It's pretty simple, actually.

First, add the appender to the root logger. Really. It will make your life much more simple.

Now configure the whole thing:

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

The default for all classes below "com.*" will be to log only errors. The sole exception is com.example.MyAgent which will log at debug level.

You need to set the root logger to DEBUG as well or it will throw away all the DEBUG log messages.

The next step is to use one logger per instance. To get that, simply remove the static in the line which you create your logger and replace BaseMessagingAgent with getClass()

I know, it looks like overkill but that's how log4j works. Also creating a logger per instance isn't very expensive (unless you create millions of MyAgent per second).

If you really want to add an appender to a single class, then don't forget to turn off additivity (...Class.additivity=false) or you will get all log messages twice.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜