配置 SpringBoot, 从日志配置提及

应用能够死, 日志必须活.html


大小系统都须要打日志.java

系统在不一样环境下对日志的配置要求是不同的spring

好比bash

开发本地: 直接输出到控制台app

生产环境: 输出到文件或者额外的日志收集系统, 好比 graylog.ide

(本文不探讨具体日志系统的配置)spring-boot

Spring Boot 官方方案

Profile-specific Configuration

1545102456.png
Logback 专属, 各环境配置归于同一文件, 经过 Spring Profile 启用.

  • 优势: 几乎无改动, 只需系统配置文件制定 spring.profiles.action=
  • 缺点: 多环境配置混合在一块儿, 应用运行时应该对运行配置无感知.

放弃.spa

配置 logging.config

1545102771.png

须要在配置文件中指定 logging.config命令行

须要提供多个 日志配置文件日志

e.g

logging.config=classpath:logback-console.xml
logging.config=classpath:logback-file.xml
logging.config=classpath:logback-graylog.xml
复制代码

可行.

落地

采用 配置 logging.config 方案

背景: 公司配置文件采用基于文件的配置中心, 经过发布系统发布到应用机器指定目录, 应用始终读取指定目录下配置文件.

几个问题

  1. 如何读取指定目录应用配置?
  2. 如何保证日志初始化时能读取到指定的 config ?

官方的外置配置文件加载顺序

1545103791.png

从文档能够看出, 默认的 Spring Boot 应用的配置文件 classpath:application.propreties 是在第 15 顺位上加载的.

Application properties packaged inside your jar (application.properties and YAML variants).

@PropertySource ?

即第 16 顺位的选择.

然而, 事情没有这么简单.

日志系统因为其特殊性, 须要尽量早的初始化.

Since logging is initialized before the ApplicationContext is created, it is not possible to control logging from @PropertySources in Spring @Configuration files. The only way to change the logging system or disable it entirely is via System properties. 大意就是 logging system 初始化在 ApplicationContext 建立以前, 因此 @PropertySource 这种配置方式是没法影响到日志系统初始化的(毕竟事儿都干完了)

此路不通

Command line arguments ?

顺着配置顺序往上找, 相对来说 命令行参数 能够成本极低的应用上去.

e.g

public static void main(String[] args) throws UnknownHostException {
    System.out.println(new Date() + " loaded...");
    args = new String[1];
    args[0] =
      "--spring.config.location=/etc/conf/app/xxx/application.properties";

    ConfigurableApplicationContext context = SpringApplication.run(Application.class, args);
    ConfigurableEnvironment env = context.getEnvironment();

    log.info("\n----------------------------------------------------------\n\t" +
        "Application '{}' is running! Access URLs:\n\t" +
        "Local: \t\thttp://localhost:{}\n\t" +
        "External: \thttp://{}:{}\n\t" +
        "Profile(s): \t{}\n----------------------------------------------------------",
      env.getProperty("spring.application.name"),
      env.getProperty("server.port"),
      InetAddress.getLocalHost().getHostAddress(),
      env.getProperty("server.port"),
      env.getActiveProfiles());

    System.out.println(new Date() + " started...");
  }
复制代码

如预期, 日志系统使用了正确的指定配置.

告一段落

问题基本解决, 但并不优雅, hack 命令行参数, 而且存在必定的局限性. 此处暂且搁置.

后记

  • 有没有更优雅的解决此问题的方法?
  • 为什么 Spring Boot 的配置文件加载顺序是这般定义?
  • Spring Boot 加载配置是如何实现的?
  • Spring Cloud Config 等配置中心的配置是如何结合到具体应用中的?
  • Spring Cloud Config 等配置中心的配置支持日志系统配置文件位置的配置吗? ...

待后续拆而析之.

REF

相关文章
相关标签/搜索