log4cxx 以编程方式将过滤器添加到特定记录器

log4cxx add filter to specific logger programmatically

提问人:Aviel Fedida 提问时间:3/20/2023 更新时间:4/17/2023 访问量:78

问:

在 Log4cxx 中,我知道可以向 appender 添加过滤器。 但是,如果我只想向特定记录器添加过滤器怎么办?

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

通过查看文档,我找不到向特定记录器添加过滤器的方法,我能想到的唯一方法是,对于我希望应用过滤器的每个特定记录器,我将创建一个特定的附加器,并为该附加器应用过滤器。还有其他方法吗?

如果可能的话,我正在寻找一种以编程方式做到这一点的方法。

C++ 4j日志 4cxx

评论

0赞 Charles Savoie 3/20/2023
我还没有尝试过这个,但似乎您可以使用 .获得 appender 列表后,可以循环每个列表,并使用与 Logger 匹配的 LoggerMatchFilter 进行调用。logger->getAllAppenders()appender->addFilter()

答:

2赞 Stephen Webb 4/17/2023 #1

如果要排除/包含特定的记录器名称,可以使用包含 log4cxx 的 LoggerMatchFilter。

或者,通过提供您自己的自定义过滤器(实现您可以从 LoggingEvent 访问记录器名称)。例如:decide(const LoggingEventPtr &event)

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;
}