应用能够死, 日志必须活.html
大小系统都须要打日志.java
系统在不一样环境下对日志的配置要求是不同的spring
好比bash
开发本地: 直接输出到控制台app
生产环境: 输出到文件或者额外的日志收集系统, 好比 graylog.ide
(本文不探讨具体日志系统的配置)spring-boot
放弃.spa
须要在配置文件中指定 logging.config命令行
须要提供多个 日志配置文件日志
e.g
logging.config=classpath:logback-console.xml
logging.config=classpath:logback-file.xml
logging.config=classpath:logback-graylog.xml
复制代码
可行.
采用 配置 logging.config 方案
背景: 公司配置文件采用基于文件的配置中心, 经过发布系统发布到应用机器指定目录, 应用始终读取指定目录下配置文件.
从文档能够看出, 默认的 Spring Boot 应用的配置文件 classpath:application.propreties 是在第 15 顺位上加载的.
Application properties packaged inside your jar (application.properties and YAML variants).
即第 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 这种配置方式是没法影响到日志系统初始化的(毕竟事儿都干完了)
此路不通
顺着配置顺序往上找, 相对来说 命令行参数 能够成本极低的应用上去.
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 命令行参数, 而且存在必定的局限性. 此处暂且搁置.
待后续拆而析之.