【问题标题】:Can I set Spring Boot's log location programmatically?我可以以编程方式设置 Spring Boot 的日志位置吗?
【发布时间】:2016-05-23 16:55:37
【问题描述】:

可以使用application.properties 中的logging.file 属性设置Spring Boot 的日志记录位置。但是我想以编程方式设置位置。我的逻辑不是基于任何 Spring bean,而是基于反复试验,因为相同的代码必须在可能具有不同安全配置的不同环境中运行。

根据the documentation

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

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

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

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

【问题讨论】:

  • 我有同样的问题,同样的要求。你能以某种方式解决它吗?在对 SpringApplicationInitializer 答案的评论中,您说它不会像这样工作。您最后找到了哪些其他解决方案?

标签: java spring logging spring-boot logback


【解决方案1】:

还有一个答案:Spring Boot programmatic logging configuration

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

SpringApplication application = new SpringApplication(MySources.class);
application.addInitializers(new LoggingInitializer());
application.run(args);

【讨论】:

  • 你能告诉我更多关于如何做到这一点的细节吗?有几件事我不明白:(1)SpringApplicationInitializerApplicationContextInitializer 各有一个方法(这些方法有不同的签名)。我应该将代码放入哪种方法? (2) 我应该在初始化程序中调用什么方法?我是否应该做一些事情,比如包装环境并添加额外的“logging.file”属性,然后将其设置回应用程序上下文?还是有更直接的方法?
  • 经过进一步调查,我认为这对这个用例根本不起作用。日志文件位置在LogFile.get 中读取,它是从LoggingApplicationListener.initialize 调用的。但是这个监听器方法是在ApplicationEnvironmentPreparedEvent 事件上调用的,该事件在SpringApplication 的(当前)第310 行触发,而ApplicationContextInitializer 直到第327 行才被调用(都在doRun 方法内)。跨度>
猜你喜欢
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 2021-04-22
  • 2011-02-24
  • 2011-12-11
  • 1970-01-01
相关资源
最近更新 更多