我正在開發一個在許多其他依賴項中使用 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()
返回運行時具體類的類型。因此,當您在日志中看到抽象類時,這是寫入日志的位置,但真正為記錄器命名的類是某個子類。
我建議您嘗試將模式更改為所有日志,然后它將打印真實記錄器名稱的名稱(這是子類)
添加回答
舉報
0/150
提交
取消