配置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 ...
随机推荐
- 字符串经过base64编码后的长度与原字符串的长度是什么关系呀?
beforeEncode为Encode之前的字符串 那么Encode后的字符串长度为: 1.如果beforeEncode.length()是3的整数倍,那么长度为 (beforeEncode.len ...
- Spyder & Python
Spyder & Python https://pypi.org/project/spyder/ Spyder is a powerful scientific environment wri ...
- Java多线程(六) —— 线程并发库之并发容器
参考文献: http://www.blogjava.net/xylz/archive/2010/07/19/326527.html 一.ConcurrentMap API 从这一节开始正式进入并发容器 ...
- rabbitmq .erlang.cookie文件疑惑
1.安装方式常见的rabbitmq安装方式有两种:rpm安装和二进制安装(编译安装). 2..erlang.cookie是什么.erlang.cookie是erlang实现分布式的必要文件,erlan ...
- [洛谷P4723]【模板】线性递推
题目大意:求一个满足$k$阶齐次线性递推数列$a_i$的第$n$项. 即:$a_n=\sum\limits_{i=1}^{k}f_i \times a_{n-i}$ 题解:线性齐次递推,先见洛谷题解, ...
- bzoj2961&&bzoj4140 共点圆
题目描述 在平面直角坐标系中,Wayne需要你完成n次操作,操作只有两种: 1.0 x y.表示在坐标系中加入一个以(x, y)为圆心且过原点的圆. 2.1 x y.表示询问点(x, y)是否在所有已 ...
- RabbitMQ 运转流程
生产者发送消息 1.生产者连接到 RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel) 2.生产者声明一个交换器,并设置相关属性,比如交换机类型.是否持 ...
- Writing Genres 英文文章文体
Description 描述文 It is painting a picture in words of a person, place, object, or scene. narration 记 ...
- 设置CMD默认路径
用CMD每一次都得切换路径,很麻烦. 所以,需要设置一下CMD默认路径: 1.打开注册表编辑器(WIN+R打开运行.输入regedit) 2.定位到: “HKEY_CURRENT_USER\Softw ...
- python模块module package
python模块module package module package 常用模块 模块与包的区别 模块分为内置模块.第三方模块,自定义模块 程序会先从内置到第三方再到当前工作目录下去找你导入的 ...