我可以以编程方式设置 Spring Boot 的日志位置吗?

Kid*_*rla 5 java logging spring logback spring-boot

春天启动的日志位置可以通过设定logging.file财产application.properties。但是我想以编程方式设置位置。我的逻辑不基于任何 Spring bean,仅基于反复试验,因为相同的代码必须在可能具有不同安全配置的不同环境中运行。

根据文档:

由于日志记录是在ApplicationContext创建之前初始化的,因此无法从@PropertySourcesSpring@Configuration文件中控制日志记录。系统属性和传统的 Spring Boot 外部配置文件工作得很好。)[原文如此]

所以我知道我不能使用@Configuration文件,但是我可以使用其他方式(例如静态初始化程序)并且仍然设法以编程方式设置日志记录位置?

(注意:我个人将 SLF4J 与 Logback 一起使用,但 Spring Boot 的日志框架旨在处理不同的日志外观/实现,实际上在内部使用 Commons Logging。)

(注 2:有些人已经注意到这是另一个问题的重复……但那个问题似乎更多地是在谈论配置实际的日志记录实现,而这个问题是关于 Spring Boot 自己的配置。实际上,我无法立即确定从这些答案中如何解决我的具体问题,如相关答案下方的评论中所述。另一个问题的答案主要集中在如何在上下文初始化的正确点加载代码,而我的问题是关于如何以设置日志记录位置。)

edu*_*nti 1

还有另一个答案:Spring Boot 编程日志配置

基本上,可以通过SpringApplicationInitializer(实现 ApplicationContextInitializer)来做到这一点

SpringApplication application = new SpringApplication(MySources.class);
application.addInitializers(new LoggingInitializer());
application.run(args);
Run Code Online (Sandbox Code Playgroud)

  • 经过进一步调查后,我认为这对于这个用例根本不起作用。日志文件位置在“LogFile.get”中读取,该“LogFile.get”是从“LoggingApplicationListener.initialize”调用的。但是这个监听器方法是在“ApplicationEnvironmentPreparedEvent”事件上调用的,该事件是在“SpringApplication”的(当前)第310行触发的,而“ApplicationContextInitializer”直到第327行才被调用(两者都在“doRun”方法内)。 (3认同)