Search code examples
c++log4jlog4cxx

log4cxx add filter to specific logger programmatically


In Log4cxx I know that its possible to add filter to appender. But what if I want to add filter only to specific logger?

LoggerPtr logger = Logger::getLogger("loggerName");
AppenderPtr appender = logger->getAppender("appenderName");
appender->addFilter(...);

From looking at the documentation I can't find a way to add a filter to specific logger, the only way I can think of is that for every specific logger I wish to apply a filter I will create a specific appender and for this appender apply the filter. Are there any other ways?

I'm looking for a way to do it programmatically, if possible.


Solution

  • You can use the log4cxx included LoggerMatchFilter if you want ot exclude/include a particular logger name.

    Alternatively, by providing your own custom filter (which implements decide(const LoggingEventPtr &event) you can access to logger name from the LoggingEvent. For example:

    auto MyCustomFilter::decide(const log4cxx::spi::LoggingEventPtr& event) const
    {
        auto result = log4cxx::spi::Filter::NEUTRAL;
        if (m_loggerToMatch == event->getLoggerName()) {
           if (.....)
            result = log4cxx::spi::Filter::ACCEPT;
           else
            result = log4cxx::spi::Filter::DENY;
        }
        return result;
    }