有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java重定向来自从父类继承记录器的抽象子类的记录器消息

我正在做一个Java项目(不是我的),它使用Springbean和许多其他依赖项。 我的目标是将来自多个SpringBean类的所有记录器消息重定向到一个文件,以便它们在控制台日志中不可见。我选择了编程方法,因为在这种情况下,这更适合我,在谷歌搜索了一些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();
}

使用这个方法,我可以提供类名,并通过编程将记录器消息重定向到一个文件,这正是我所需要的。 除了Springbean中从某个父类继承LOGGER对象的(抽象)类之外,这是有效的

在我的例子中,我试图将日志消息从AbstractBeanFactory重定向到一个文件,但它们仍然显示在控制台中。 我猜想这是因为这个类从DefaultSingletonBeanRegistry继承了LOGGER对象,但我不确定

Classes hierarchy

如果有人对此有任何建议/解决方案,我将不胜感激。提前谢谢


共 (1) 个答案

  1. # 1 楼答案

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

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

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