log4j - how to programatically exclude some classes from logging

I am writing a custom socket appender for Log4J which attaches itself at runtime. The code i have so far is as below,

Logger rootLogger = Logger.getRootLogger();
SocketAppender socketAppender = new SocketAppender(server, port);
socketAppender.setReconnectionDelay(60000);
socketAppender.setThreshold(Level.DEBUG);
socketAppender.setName("server-socket");
rootLogger.addAppender(socketAppender);

where server & port is defined properly. I am using Struts2, so i get a log of useless logs (for me) from classes like freemarker.beans and freemarker.cache. How do I filter these classes from logging into Socket Appender above?

I tried using Filters, but it does not seem to work. If someone can point me in the right direction, it would be very helpful. Cheers!

Upvotes: 1

Views: 826

Answers (1)

Well.. I found the answer.. I was implementing the Filter classes wrongly. Instead of DENY, I was sending out NEUTRAL. The below code works fine for me now,

        SocketAppender socketAppender = new SocketAppender(server, port);
        socketAppender.setReconnectionDelay(60000);
        socketAppender.setThreshold(Level.DEBUG);
        socketAppender.setName("server-socket");
        socketAppender.addFilter(new Filter() {
            @Override
            public int decide(LoggingEvent loggingEvent)
            {
                if(ignoreLogsFromClasses.contains(loggingEvent.categoryName))
                {
                    return -1;
                }
                return 0;
            }
        });
        rootLogger.addAppender(socketAppender);

where ignoreLogsFromClasses is an Set which contains classes to be ignored.

Upvotes: 1

Related Questions