0

我正在使用一个非常详细地使用 log4j 的外部包。我查看了代码并找到了预期的log4j行:

private Logger log = Logger.getLogger("SomeLoggerName");
...
log.info("Trivial message");
log.info("More trivial data");

由于我无法更改代码,因此我尝试更改log4j.xml

<category name="SomeLoggerName">
  <level value="${log4j_level:-WARN}"/>
  <appender-ref ref="FileLogger"/>
</category>

我猜想该category name属性等同于记录器名称。这是真的吗?如果没有,如何按记录器名称过滤?

4

3 回答 3

3

实际上,您可以<logger>用作元素名称,例如

<logger name="SomeLoggerName">
  <level value="${log4j_level:-WARN}"/>
  <appender-ref ref="FileLogger"/>
</logger>

我认为这category是为了向后兼容,它的使用已被弃用。

于 2012-07-30T13:28:38.660 回答
3

如果您只是想减少冗长,我会调高优先级:

<category name="SomeLoggerName">
  <level value="WARN"/>
</category>

否则,您可能希望将过滤器添加到现有的 appender。首先,实现一个 log4j 过滤器。在您的情况下,这将是一个简单的比较来确定日志事件是否来自不需要的类。像这样的东西会起作用:

public class MyAuditFilter extends Filter{

    @Override
    public int decide(LoggingEvent event) {
        if(event.getClass.getCanonicalName().equalsIgnoreCase("class.you.don't.want"))
            return Filter.DENY;
        else
            return Filter.ACCPET;
    }
}

实现过滤器后,只需将其添加到 log4j appender 中,如下所示:

<appender name="myAppender" class="my.appender.class">
  .
  .
  <filter class="my.namespace.MyAuditFilter">
    <param name="AcceptOnMatch" value="True"/>
  </filter>
  .
  .
</appender>

如果您需要更多控制,过滤器将能够为您提供对日志记录的极其精细的控制。

于 2012-07-30T13:43:26.140 回答
1

你是对的,记录器 == 类别。你的配置有问题吗?一般来说,它看起来不错,应该可以工作。

于 2012-07-30T13:24:03.900 回答