重定向来自从父项继承 Logger 的抽象子项 class 的记录器消息
Redirect logger messages from abstract child class that inherits Logger from parent
我正在开发一个 Java 项目(不是我的),该项目使用 spring-beans 以及许多其他依赖项。
我的目标是将来自几个 spring-beans classes 的所有记录器消息重定向到一个文件,以便它们在控制台日志中不可见。我选择了编程方法,因为在这种情况下这更适合我,在谷歌搜索了一些 Log4j 解决方案后,找到了一个(几乎)适合我的方法:
public static void removeConsoleLogsByClassName(String fullClassName) {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config = ctx.getConfiguration();
PatternLayout layout = PatternLayout.newBuilder()
.withPattern("%d{yyyy-MM-dd HH:mm:ss} %c{2} | [%t] | %-5level: - %m%n")
.withConfiguration(config).build();
Appender appender = FileAppender.createAppender(
"some_location_goes_here/logfile.log",
"false",
"false", "fileAppender", "true", "false", "false", "8192", layout, null, "false", null, config);
appender.start();
config.addAppender(appender);
AppenderRef ref = AppenderRef.createAppenderRef("fileAppender", null, null);
AppenderRef[] refs = new AppenderRef[] { ref };
org.apache.logging.log4j.core.config.LoggerConfig loggerConfig = LoggerConfig.createLogger(false,
org.apache.logging.log4j.Level.TRACE,
fullClassName,
"true", refs, null, config, null);
loggerConfig.addAppender(appender, null, null);
if ("false".equals(TestInfo.getEnableLog())) {
loggerConfig.setLevel(org.apache.logging.log4j.Level.OFF);
}
config.addLogger(fullClassName, loggerConfig);
ctx.updateLoggers();
}
通过这种方法,我可以提供 Class 名称,并以编程方式将记录器消息重定向到一个文件,这正是我所需要的。
除了 spring-bean 中的(抽象)classes 之外,这有效,它们从某些父 class.
继承了 LOGGER 对象
在我的例子中,我试图将日志消息从 AbstractBeanFactory 重定向到一个文件,但它们仍然显示在控制台中。
我想这是因为这个 class 从 DefaultSingletonBeanRegistry 继承了 LOGGER 对象,但我不确定。
Classes hierarchy
如果有人对此有任何 advice/solution,我将不胜感激。提前致谢。
如果您查看层次结构中顶部 class 的源代码 (SimpleAliasRegistry),您将看到记录器的初始化:
/** Logger available to subclasses. */
protected final Log logger = LogFactory.getLog(getClass());
getClass()
returns 具体class 运行时的类型。所以当你在日志中看到摘要 class 时,这是日志写入的位置,但真正的 class 给记录器他的名字是一些 subclass.
我建议您尝试将模式更改为所有日志,然后它将打印真实记录器名称的名称(即 subclass)
我正在开发一个 Java 项目(不是我的),该项目使用 spring-beans 以及许多其他依赖项。 我的目标是将来自几个 spring-beans classes 的所有记录器消息重定向到一个文件,以便它们在控制台日志中不可见。我选择了编程方法,因为在这种情况下这更适合我,在谷歌搜索了一些 Log4j 解决方案后,找到了一个(几乎)适合我的方法:
public static void removeConsoleLogsByClassName(String fullClassName) {
LoggerContext ctx = (LoggerContext) LogManager.getContext(false);
Configuration config = ctx.getConfiguration();
PatternLayout layout = PatternLayout.newBuilder()
.withPattern("%d{yyyy-MM-dd HH:mm:ss} %c{2} | [%t] | %-5level: - %m%n")
.withConfiguration(config).build();
Appender appender = FileAppender.createAppender(
"some_location_goes_here/logfile.log",
"false",
"false", "fileAppender", "true", "false", "false", "8192", layout, null, "false", null, config);
appender.start();
config.addAppender(appender);
AppenderRef ref = AppenderRef.createAppenderRef("fileAppender", null, null);
AppenderRef[] refs = new AppenderRef[] { ref };
org.apache.logging.log4j.core.config.LoggerConfig loggerConfig = LoggerConfig.createLogger(false,
org.apache.logging.log4j.Level.TRACE,
fullClassName,
"true", refs, null, config, null);
loggerConfig.addAppender(appender, null, null);
if ("false".equals(TestInfo.getEnableLog())) {
loggerConfig.setLevel(org.apache.logging.log4j.Level.OFF);
}
config.addLogger(fullClassName, loggerConfig);
ctx.updateLoggers();
}
通过这种方法,我可以提供 Class 名称,并以编程方式将记录器消息重定向到一个文件,这正是我所需要的。 除了 spring-bean 中的(抽象)classes 之外,这有效,它们从某些父 class.
继承了 LOGGER 对象在我的例子中,我试图将日志消息从 AbstractBeanFactory 重定向到一个文件,但它们仍然显示在控制台中。 我想这是因为这个 class 从 DefaultSingletonBeanRegistry 继承了 LOGGER 对象,但我不确定。
Classes hierarchy
如果有人对此有任何 advice/solution,我将不胜感激。提前致谢。
如果您查看层次结构中顶部 class 的源代码 (SimpleAliasRegistry),您将看到记录器的初始化:
/** Logger available to subclasses. */
protected final Log logger = LogFactory.getLog(getClass());
getClass()
returns 具体class 运行时的类型。所以当你在日志中看到摘要 class 时,这是日志写入的位置,但真正的 class 给记录器他的名字是一些 subclass.
我建议您尝试将模式更改为所有日志,然后它将打印真实记录器名称的名称(即 subclass)