我想关闭一个类方法的日志记录。 见下文:
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只是一个配置文件)
答案 0 :(得分: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");
然后在配置中为它们定义不同的日志级别。
答案 1 :(得分: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>
答案 2 :(得分:1)
我不知道有可能这样做。
尽管如此,您可以将日志记录配置为包含类和方法名称(请参阅PatternLayout),并使用其他工具(如“grep
”)对日志文件进行后处理,以包含/排除您要查看的内容。
由于性能问题,建议不要记录类和方法名称,但这可能与您无关。