Java Spring引导忽略logback-Spring.xml
我有两个使用Logback的Spring Boot(1.4.1版本)控制台应用程序。这两个配置文件大致相同,位于我的/src/main/resources文件夹中,名为logback spring.xml 这两个项目都在pom.xml中包含maven依赖项spring boot starter日志,并获取logback版本1.1.7 两个POM中定义的Spring引导配置:Java Spring引导忽略logback-Spring.xml,java,maven,spring-boot,logback,Java,Maven,Spring Boot,Logback,我有两个使用Logback的Spring Boot(1.4.1版本)控制台应用程序。这两个配置文件大致相同,位于我的/src/main/resources文件夹中,名为logback spring.xml 这两个项目都在pom.xml中包含maven依赖项spring boot starter日志,并获取logback版本1.1.7 两个POM中定义的Spring引导配置: <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.1.RELEASE</version>
<relativePath />
</parent>
<groupId>d.m.v.app-a</groupId>
<artifactId>my-app-a</artifactId>
<version>1.0.16-SNAPSHOT</version>
<packaging>jar</packaging>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</dependency>
</dependencies>
4.0.0
org.springframework.boot
spring启动程序父级
1.4.1.1发布
d、 m.v.app-a
my-app-a
1.0.16-快照
罐子
org.springframework.boot
SpringBootStarterWeb
org.springframework.boot
弹簧靴起动器执行器
org.springframework.boot
弹簧启动安全
org.springframework.boot
spring启动程序日志记录
然而,当运行应用程序时,其中一个似乎完全忽略了logback配置,而另一个则像预期的那样选择它
如果我将无法正常工作的应用程序的文件名更改为logback.xml,它会突然正常工作(即使使用我在其中使用的spring配置文件)
所涉及的任何配置(即pom.xml、application.properties等)都没有明显差异
有人知道为什么会这样吗?我发现这种行为相当令人困惑。我会在application.properties中指定这样的配置文件位置
logging.config=path
Spring可能没有查找此文件名
他们建议使用这个名称logback-spring.xml,而不仅仅是logback.xml
如果可能的话,我会将配置放在application.properties中。我知道它有点旧,但我也遇到了同样的问题并解决了它。。。所以原因很简单,就是在类路径上有一个logback.xml(在某个地方,不一定在您启动的项目中,在我的例子中,它是一个依赖项) 看看这里:
org.springframework.boot.logging.AbstractLoggingSystem.initializeWithConventions(LoggingInitializationContext,LogFile)
设置一个断点,然后您将看到
如果spring boot在类路径上没有找到任何logback配置(“logback test.groovy”、“logback test.xml”、“logback.groovy”、“logback.xml”),则会选择logback-spring.xml。要使用logback,需要在类路径上包含它和spring jcl。实现这一点的最简单方法是通过启动器,它们都依赖于SpringBootStarter日志记录对于web应用程序,您只需要spring boot starter web,因为它依赖于日志启动器。如果使用Maven,以下依赖项会为您添加日志记录:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
org.springframework.boot
SpringBootStarterWeb
因此,删除日志依赖项它是多余的。我通过在application.yml中添加logging.config解决了这个问题
logging:
config: classpath:logback-spring.xml
嗯
我知道这是一个专业的问题。但你可以把格雷德的谈话“翻译”成玛文
这个想法的要点是:
在我的root build.gradle文件中
我不得不排除这些项目。gradle这样做的方式是,这是一种“此项目的全局”类型的排除,所以它将它们全部放在一个地方。但是你可以在maven中做同样的“排除”/“擦洗”,它只是看起来不同而已。groupid/artifactid是最重要的
allprojects {
configurations {
all {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging'
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-log4j2'
}
}
}
然后在我的(顶层)build.gradle中(我没有一块巨石,我有一个包含多个模块的项目)。我添加了以下依赖项:
implementation group: 'ch.qos.logback', name: 'logback-classic', version: logbackClassicVersion
implementation group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion
我的两个版本的变量值恰好是(在写这篇文章的时候)
你觉得这两个版本配合得如何
例如,如果您查看:
找到“编译依赖项”,您将看到
logback经典/1.2.3
有
org.slf4j»slf4j api 1.7.25 1.7.30
因此,在1.7.25和1.7.30之间的某个地方,使用logback classic/1.2.3会很好
也许有更好的方法,但这就是我在依赖游戏中“接近”的方式
slf4jVersion = "1.7.30"
logbackClassicVersion = '1.2.3'
但是你最好去maven Repository或jcenter,找到这两个东西的最新版本,但也找到彼此都很好的版本。我遇到了同样的问题,并试图找到
logback.xml
或logback grrovy.xml
等是否已经在CLAPATH
中,但没能找到
然后我尝试了一些改变:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.13</version>
</dependency>
org.springframework.boot
弹簧靴起动器
org.springframework.boot
spring启动程序日志记录
org.slf4j
slf4j api
1.7.13
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>
org.springframework.boot
弹簧靴起动器
org.slf4j
jcl-over-slf4j
两个Spring启动应用程序之间可能存在差异。您应该至少显示他们的pom.xml。这些可能会有帮助。你有没有把版本号弄错了?Logback 1.7.1没有exist@AndyWilkinson:对-这是一个打字错误。我在街上换的post@davidxxx:我已经彻底检查了两个pom文件的差异。当然,考虑到这是两个不同的项目,也存在一些问题。更新的(从我的观点来看)上面更新了配置转换spring引导的相关部分-这并没有显示两种配置之间的任何差异。当然,我可以这样做,但它不会回答为什么应用程序选择忽略另一个应用程序不忽略的相同配置的问题。这实际上很有意义,而且正是这个问题造成了这个问题-非常感谢谢谢!这个答案只是省钱
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>jcl-over-slf4j</artifactId>
</dependency>