3

我想关闭类方法的日志记录。见下文:

package com.mypackage;

public class A {
    public static void aaa() { 
        logger.info("hello"); 
    }

    public static void bbb() { 
        logger.info("hello"); 
    }
}

.

# This works and nothing gets logged by A
log4j.category.com.mypackage.A=off

.

#this does not work. (I am trying to switch off only the static method)
log4j.category.com.mypackage.A.aaa=off

有人知道我们是否可以根据方法关闭(更改日志级别)吗?

谢谢

注意:我不想更改代码(那是因为代码已经存在,我只想更改现有的 log4j,它只是一个配置文件)

4

3 回答 3

3

你可以做的是有两个不同的记录器,每个方法一个。

private static final Logger logAAA = Logger.getLogger("some.logger.name.for.AAA");
private static final Logger logBBB = Logger.getLogger("some.other.name.for.BBB");

然后在您的配置中为它们定义不同的日志级别。

于 2013-02-19T17:23:15.030 回答
3

这实际上可以通过实现一个特定Filter的来检查记录器名称然后调用方法。您的过滤器接收一个LoggingEvent允许LocationInfo使用类和方法名称检索的。

请注意,这将在堆栈跟踪上使用反射,这可能会非常低效,请谨慎行事。特别是,在检索 之前首先检查记录器名称LocationInfo,以便仅在必要时执行反射。

只能通过 XML Log4j 配置文件配置过滤器。

快速实施:

过滤器类:

public class MethodBasedFilter extends Filter {

    @Override
    public int decide(LoggingEvent event) {
        if (event.getLoggerName().equals(LoggingWithMethodFiltering.class.getCanonicalName())) {
            if (event.getLocationInformation().getMethodName().equals("filteredMethod")) {
                return Filter.DENY;
            }
        }
        return Filter.NEUTRAL;
    }
}

过滤后的类:

public class LoggingWithMethodFiltering {
    private static final Logger LOG = Logger.getLogger(LoggingWithMethodFiltering.class);

    public static void unfilteredMethod() {
        LOG.info("I am not filtered");
    }

    public static void filteredMethod() {
        LOG.info("I am filtered and will never appear");
    }

    public static void main(String[] args) {
        unfilteredMethod();
        filteredMethod();
    }
}

log4j.xml: _

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration>

    <appender name="Console" class="org.apache.log4j.ConsoleAppender">
        <param name="threshold" value="trace" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%-5p|%-20.20t|%d{HH:mm:ss,SSS}|%20.30c{1} %25.25F:%-4L - %20.20M - %m%n" />
        </layout>
        <filter class="MethodBasedFilter" />
    </appender>

    <root>
        <level value="trace" />
        <appender-ref ref="Console" />
    </root>

</log4j:configuration>
于 2013-02-20T10:35:37.730 回答
1

我不知道这样做的可能性。

不过,您可以将日志配置为包含类和方法名称(请参阅PatternLayout)并使用其他工具(如“ grep”)对日志文件进行后处理,以包含/排除您想要查看的内容。

由于性能问题,不建议记录类和方法名称,但这可能与您无关。

于 2013-02-20T10:13:52.803 回答