相关文章推荐
健壮的烤地瓜  ·  Windows Server 2022 ...·  6 天前    · 
儒雅的保温杯  ·  终于有人把 Docker ...·  8 月前    · 
暴躁的奔马  ·  Setting up Conda and ...·  2 年前    · 

1. 问题描述

应用使用spring boot进行开发,日志系统使用backlog,系统配置文件backlog-config.xml,通过jar包部署时日志输出正常,通过war包部署应用到tomcat时,发现输出日志与期望不符。

配置文件application.yaml

# 更改配置文件名称
logging:
  config: classpath:logging-config.xml

2. 问题分析

Spring Boot初始化日志系统的逻辑是,从环境变量environment中获取logging.config属性值(即配置文件信息),然后根据配置文件更新LoggerContext。

org.springframework.boot.context.logging.LoggingApplicationListener#initializeSystem

private void initializeSystem(ConfigurableEnvironment environment,
		LoggingSystem system, LogFile logFile) {
	LoggingInitializationContext initializationContext = new LoggingInitializationContext(
			environment);
	String logConfig = environment.getProperty(CONFIG_PROPERTY);
	if (ignoreLogConfig(logConfig)) {
		system.initialize(initializationContext, null, logFile);
	else {
		try {
			ResourceUtils.getURL(logConfig).openStream().close();
			system.initialize(initializationContext, logConfig, logFile);
		catch (Exception ex) {
			// NOTE: We can't use the logger here to report the problem
			System.err.println("Logging system failed to initialize "
					+ "using configuration from '" + logConfig + "'");
			ex.printStackTrace(System.err);
			throw new IllegalStateException(ex);

此处的关键是logConfig的值,通过jar部署时,logConfig的值为classpath:logging-config.xml,所以日志输出正常;而通过war包方式部署时,logConfig的值为-Djava.util.logging.config.file=“C:\Users\me.IntelliJIdea2018.2\system\tomcat\Unnamed_Spring-Boot-In-Action\conf\logging.properties”,所以日志输出格式自然与预期不否咯!

那么问题来了,logging.config和java.util.logging.config.file这两个KEY差别可有点大,怎么会扯到一起了呢?原因是spring boot通过系统环境变量获取属性值时有个转换处理,经过处理后logging.config的actualName是LOGGING_CONFIG;而LOGGING_CONFIG对应的值正是-Djava.util.logging.config.file=“C:\Users\me.IntelliJIdea2018.2\system\tomcat\Unnamed_Spring-Boot-In-Action\conf\logging.properties”。

org.springframework.core.env.SystemEnvironmentPropertySource#getProperty
在这里插入图片描述
在这里插入图片描述

3. 解决方案

我们的配置logging.config就这么被中途截胡啦!我们可以通过两种方式解决该问题。

3.1 提升logging.config的优先级

之前java.util.logging.config.file之所以优先于logging.config被加载是因为其属于system environment,而logging.config属于application.yaml配置文件级别。
根据Spring boot加载配置的优先级顺序,将logging.config的配置提升到命令行参数systemProperties级别,配置可顺利加载。
关于配置加载的优先级可参考
2. 通过属性文件外置配置
在这里插入图片描述

-Dlogging.config=classpath:logging-config.xml

3.2 使用默认的配置文件名称

虽然logging.config的配置被截胡,但是如果属性值如果以-D开头则会被忽略掉,也就是说日志系统会查看是否存在默认名称的配置文件,如log4j2的log4j2.properties或log4j2.xml或backlog的logback.xml等。
所以只需要将配置文件的名字改成默认名称就可以啦!

org.springframework.boot.context.logging.LoggingApplicationListener#ignoreLogConfig

1. Overview of property sources

为什么通过Jar运行的时候日志可以正常输出,使用War包部署就不行了呢?配置文件为什么没有生效?属性配置是有优先级的,你了解属性的配置方式以及他们之间的优先顺序吗?怎么设置可以提升属性的优先级?如果我不想通过提升优先级改变属性加载顺序,有没有其他方式可以解决这个问题呢?想了解的请进来……
背景:在springboot项目下明明配置了自己需要的日志打印方式,但就是不生效。。。 原因很多。我这里是因为springboot自带logging导致的,在此情况下不会去读取自己在resources上配置log4j文件;加入如下依赖配置排除springboot自带依赖。问题解决。 <dependency> <groupId>org.spring...
解决问题的过程: 1.尝试网上的方法:在在项目配置文件application.properties中添加:logging.config=classpath:log/logback-spring.xml 结果不生效 下图是日志加载的源码文件 ...
设置jpa.hibernate.ddl-auto: update启动服务器自动建表报错 More than one table found in namespace (, ) - SchemaExtractionException 因为在同一个数据源下存在多个相同表结构的schema。 解决办法:指定schema properties: hibernate: default_schema.........
JUL(java.util.logging)是java自带的默认日志,很多项目在没有配置日志(slf4j或者log4j)时会默认使用jul作为最后的日志实现 Java Logging Technology–java日志简介 java默认log配置文件C:\Program Files\Java\jre1.8.0_221\lib\logging.properties 这样在maven项目中快速使用ju...
1、logging.config配置不起作用的原因 application.properties中有个一logging.config的配置,这个属性后面跟的日志配置文件必须是.xml结尾的。否则不起作用。 2、spring-boot 使用其他日志时,日志配置文件不起作用 创建Spring Boo
今天在将自己编写一个小功能的SpringBoot 项目部署至Tomcat 中,日志是采用logback。 项目在eclipse 中正常输出相关日志信息但是在Tomcat 中,日志没有正常输出,今天将遇到的情况总计,以备后续参考。 现将我解决的步骤逐一说明和讲解。 第一步:移除内嵌Tomcat和添加javax.servlet <dependency> <groupId>org.springframework.boot</groupId> 2. 然后,进入Tomcat的bin目录,执行startup.sh启动Tomcat。 3. 等待Tomcat启动完成后,可以通过浏览器访问Tomcat的管理页面,查看WAR是否已经成功部署。 4. 如果需要对WAR进行配置,可以编辑Tomcat的conf目录下的server.xml文件,添加相关配置信息。 5. 部署完成后,可以通过Tomcat的管理页面对WAR进行管理,括启动、停止、卸载等操作。 总之,部署Tomcat的WAR需要注意一些细节,如上传路径、启动命令、配置文件等,只有按照正确的步骤进行操作,才能确保WAR能够正常运行。