为了账号安全,请及时绑定邮箱和手机立即绑定

从从父类继承 Logger 的抽象子类重定向 logger 消息

从从父类继承 Logger 的抽象子类重定向 logger 消息

一只甜甜圈 2022-11-02 15:24:58
我正在开发一个在许多其他依赖项中使用 spring-beans 的 Java 项目(不是我的)。我的目标是将所有记录器消息从几个 spring-beans 类重定向到一个文件,以便它们在控制台日志中不可见。我采用了程序化方法,因为在这种情况下这更适合我,并且在谷歌搜索了一些 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();}使用这种方法,我可以提供类名,并以编程方式将记录器消息重定向到一个文件,这正是我所需要的。除了从某个父类继承 LOGGER 对象的 spring-beans 中的(抽象)类之外,这有效。就我而言,我正在尝试将日志消息从 AbstractBeanFactory 重定向到文件,但它们仍然显示在控制台中。我想这是因为这个类从 DefaultSingletonBeanRegistry 继承了 LOGGER 对象,但我不确定。类层次结构如果有人对此有任何建议/解决方案,我将不胜感激。提前致谢。
查看完整描述

1 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

如果您查看层次结构(SimpleAliasRegistry)中顶级类的源代码,您将看到记录器的初始化:

/** Logger available to subclasses. */
protected final Log logger = LogFactory.getLog(getClass());

getClass()返回运行时具体类的类型。因此,当您在日志中看到抽象类时,这是写入日志的位置,但真正为记录器命名的类是某个子类。
我建议您尝试将模式更改为所有日志,然后它将打印真实记录器名称的名称(这是子类)


查看完整回答
反对 回复 2022-11-02
  • 1 回答
  • 0 关注
  • 79 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信