配置SpringBoot-从日志系统配置说起
大小系统都需要打日志. 系统在不同环境下对日志的配置要求是不一样的 比如 开发本地: 直接输出到控制台 生产环境: 输出到文件或者额外的日志收集系统, 比如 graylog. (本文不探讨具体日志系统的配置)
Spring Boot 官方方案
Profile-specific Configuration
Logback 专属, 各环境配置归于同一文件, 通过 Spring Profile 启用.
- 优点: 几乎无改动, 只需系统配置文件制定 spring.profiles.action=
- 缺点: 多环境配置混合在一起, 应用运行时应该对运行配置无感知.
放弃.
配置 logging.config
需要在配置文件中指定 logging.config 需要提供多个 日志配置文件 e.g logging.config=classpath:logback-console.xml logging.config=classpath:logback-file.xml logging.config=classpath:logback-graylog.xml 可行.
落地
采用 配置 logging.config 方案
背景: 公司配置文件采用基于文件的配置中心, 通过发布系统发布到应用机器指定目录, 应用始终读取指定目录下配置文件.
几个问题
- 如何读取指定目录应用配置?
- 如何保证日志初始化时能读取到指定的 config ?
官方的外置配置文件加载顺序
从文档可以看出, 默认的 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 等配置中心的配置支持日志系统配置文件位置的配置吗?
...
待后续拆而析之.
配置SpringBoot-从日志系统配置说起的更多相关文章
- springboot核心技术(二)-----自动配置原理、日志
自动配置原理 配置文件能配置的属性参照 1.自动配置原理: 1).SpringBoot启动的时候加载主配置类,开启了自动配置功能 @EnableAutoConfiguration 2).@Enable ...
- SpringBoot Logback 日志配置
目录 前言 日志格式 日志输出 日志轮替 日志级别 日志分组 小结 前言 之前使用 SpringBoot 的时候,总是习惯于将日志框架切换为 Log4j2,可能是觉得比较靠谱,也可能年龄大了比较排斥新 ...
- 清晰梳理最全日志框架关系与日志配置-SpringBoot 2.7.2 实战基础
优雅哥 SpringBoot 2.7.2 实战基础 - 07 - 日志配置 Java 中日志相关的 jar 包非常多,log4j.log4j2.commons-logging.logback.slf4 ...
- springboot+mybatis 配置sql打印日志
第一种: 配置类型 # 配置slq打印日志 logging.level.com.lawt.repository.mapper=debug重点: #其中 com.lawt.repository.ma ...
- 配置Tomcat的日志系统
成功配置tomcat的log4j日志系统,格式:HTML+每天以yyyy-mm-dd.log命名的日志文件 一.引言: 实习单位让用log4j配置webapp的日志系统,要求产生的日志文件是html格 ...
- Eclipse配置SpringBoot
从这一博客开始学习SpringBoot,今天学习Eclipse配置SpringBoot.Eclipse导入SpringBoot有两种方式,一种是在线一个是离线方式. 一.在线安装 点击Eclipse中 ...
- SpringBoot与日志框架1(基本使用)
一.日志框架 1.无论在什么系统,日志框架都是一个重要角色,所以理解和用好日志框架是相当重要的:像JDBC一样,日志框架分为接口层的门面和具体的实现组成. 2.市面上的产品: 2.1门面:SLF4J( ...
- Springboot的日志管理&Springboot整合Junit测试&Springboot中AOP的使用
==============Springboot的日志管理============= springboot无需引入日志的包,springboot默认已经依赖了slf4j.logback.log4j等日 ...
- tomcat和springboot访问日志及分析
1.Tomcat设置访问日志 <Host name="localhost" appBase="webapps" unpackWARs="true ...
随机推荐
- HDU 1231 最大子序列
http://acm.hdu.edu.cn/showproblem.php?pid=1231 Problem Description 给定K个整数的序列{ N1, N2, ..., NK },其任意连 ...
- Error: Unable to access jarfile D:\Apache\apache-jmeter-3.0\bin\ApacheJMete.jar
双击jmeter.bat后,在cmd窗口显示Error: Unable to access jarfile D:\Apache\apache-jmeter-3.0\bin\ApacheJMete.ja ...
- 微信小程序 功能函数 替换字符串内的指定字符
var str = 'abcadeacf'; var str1 = str.replace('a', 'o'); alert(str1); // 打印结果: obcadeacf var st ...
- 微信小程序组件 模块化错和叹号
wxml 页面 <import src="/pages/lianxi/lianxi.wxml" /> //引入文件 <view style='position: ...
- Java面试题大汇总
前言 关于赢在面试的Java题系列基本收集整理完成了,所有题目都是经过精心挑选的,很基础又考验求职者的基本功,应该说被面试到的几率很大.这里整理挑选出来供大家面试前拿来看一看,所有题目整理自网络,有一 ...
- AND Graph CodeForces - 987F(思维二进制dfs)
题意:给出n(0≤n≤22)和m,和m个数ai,1 ≤ m ≤ 2n ,0≤ai<2n ,把ai & aj == 0 的连边,求最后有几个连通块 解析:一个一个去找肯定爆,那么就要转换一 ...
- 如何将SLIC集成到ESXi中
如何将SLIC集成到ESXi中 参考 http://forums.mydigitallife.info/threads/12982-ESX-ESXi-Bios-Tools/page34?p=72183 ...
- BZOJ5058 期望逆序对 【矩乘 + 组合数学 + 树状数组】
题目链接 BZOJ5058 题解 可以发现任意两个位置\(A,B\)最终位置关系的概率是相等的 如果数列是这样: CCCCACCCCBCCCC 那么最终有\(7\)种位置关系 \((A,B)\) \( ...
- SrervletContext和文件下载
ServletContext对象 生命周期(从生命周期可以看出这个是个全局对象) 项目启动的时候创建 项目关闭的时候销毁 概念:代表整个web应用,可以和程序的容器(服务器)来通信. 获取 通过req ...
- Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法(转)
Android中全屏 取消标题栏,TabHost中设置NoTitleBar的三种方法http://www.cnblogs.com/zdz8207/archive/2013/02/27/android- ...