基于Springboot使用logback的注意事项

Springboot logback的注意事项

项目使用SpringBoot搭建的,开发环境没有发现问题,日志输出位置也正常。

项目的日志没有使用默认配置文件名方式,而是一个环境一套配置文件,所以日志也是通过application.properties配置中间接指定的;

比如开发环境:

application.properties文件配置为:spring.profiles.active=dev

application-dev.properties文件的日志配置:logging.config=classpath:logback-dev.xml

但是在生产环境的时候发现启动项目会输出多个日志文件???

通过查看SpringBoot源码org.springframework.boot.context.logging.LoggingApplicationListener日志处理模块,在org.springframework.boot.logging.logback.LogbackLoggingSystem对象中找到加载默认配置文件的代码:

@Override
protected String[] getStandardConfigLocations() {
 return new String[] { "logback-test.groovy", "logback-test.xml", "logback.groovy", "logback.xml" };
}

生产配置为:

application.properties文件配置为:spring.profiles.active=prod

application-prod.properties文件的日志配置:logging.config=classpath:logback-prod.xml

看似没有问题,其实我的配置文件中还包含一套测试环境的配置文件,刚好其中的日志配置文件名是logback-test.xml与默认加载的配置文件名正好相同。

找到原因后将生产环境中的logback-test.xml删除掉日志输出就正常了。

结论:

如果项目中有多套环境是日志文件的名千万不要和默认配置文件名相同。

最后看了一下log4j的加载的源码,贴出来看看,多套环境时避免使用:

private String[] getCurrentlySupportedConfigLocations() {
 List<String> supportedConfigLocations = new ArrayList<>();
 supportedConfigLocations.add("log4j2.properties");
 if (isClassAvailable("com.fasterxml.jackson.dataformat.yaml.YAMLParser")) {
  Collections.addAll(supportedConfigLocations, "log4j2.yaml", "log4j2.yml");
 }
 if (isClassAvailable("com.fasterxml.jackson.databind.ObjectMapper")) {
  Collections.addAll(supportedConfigLocations, "log4j2.json", "log4j2.jsn");
 }
 supportedConfigLocations.add("log4j2.xml");
 return StringUtils.toStringArray(supportedConfigLocations);
}

springboot使用logback会遇到的坑

Caused by: java.lang.IllegalArgumentException: LoggerFactory is not a Logback LoggerContext but Logback is on the classpath. Either remove Logback or the competing implementation (class org.apache.logging.slf4j.Log4jLoggerFactory loaded from file:/C:/Users/fyk/.m2/repository/org/apache/logging/log4j/log4j-slf4j-impl/2.7/log4j-slf4j-impl-2.7.jar). If you are using WebLogic you will need to add 'org.slf4j' to prefer-application-packages in WEB-INF/weblogic.xml: org.apache.logging.slf4j.Log4jLoggerFactory
 at org.springframework.util.Assert.instanceCheckFailed(Assert.java:389)
 at org.springframework.util.Assert.isInstanceOf(Assert.java:327)
 at org.springframework.boot.logging.logback.LogbackLoggingSystem.getLoggerContext(LogbackLoggingSystem.java:274)
 at org.springframework.boot.logging.logback.LogbackLoggingSystem.beforeInitialize(LogbackLoggingSystem.java:98)
 at org.springframework.boot.logging.LoggingApplicationListener.onApplicationStartingEvent(LoggingApplicationListener.java:230)
 at org.springframework.boot.logging.LoggingApplicationListener.onApplicationEvent(LoggingApplicationListener.java:209)
 at org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:172)
 at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:165)
 at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:139)
 at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:122)
 at org.springframework.boot.context.event.EventPublishingRunListener.starting(EventPublishingRunListener.java:69)
 at org.springframework.boot.SpringApplicationRunListeners.starting(SpringApplicationRunListeners.java:48)
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:292)
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
 at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
 at com.light.SpringbootApplication.main(SpringbootApplication.java:32)
 ... 5 more

在spring boot中导入logback jar包会与spring-boot-starter-web冲突,应该是springboot中已经包含了这个包,

   <dependency>
   <groupId>ch.qos.logback</groupId>
   <artifactId>logback-classic</artifactId>
   <version>1.2.3</version>
  </dependency>

去掉这个导入就好了。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 详解Springboot之Logback的使用学习

    一.导入依赖 普通项目 <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.1.11</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <a

  • 解决springboot使用logback日志出现LOG_PATH_IS_UNDEFINED文件夹的问题

    application.properties 加入以下配置 #logback home logging.path=D:/logs/esb-producer logback.xml <property name="LOG_PATH" value="${LOG_PATH:- }" /> <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.Rolling

  • Springboot如何使用logback实现多环境配置?

    前言 Logback是由log4j创始人设计的又一个开源日记组件,Logback 当前分成三个模块:logback-core,logback- classic和logback-access.logback-core是其它两个模块的基础模块,logback-classic是log4j的一个改良版本.此外logback-classic完整实现SLF4J API使你可以很方便地更换成其它日记系统如log4j或JDK14 Logging.logback-access访问模块与Servlet容器集成提供通

  • springboot项目配置logback日志系统的实现

    记录springboot项目配置logback日志文件管理: logback依赖jar包 SpringBoot项目配置logback理论上需要添加logback-classic依赖jar包: <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> <

  • springboot 使用logback启动报警报错的解决

    springboot logback启动报警报错 报错信息如下: 16:06:07,484 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml] 16:06:07,484 |-INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback

  • SpringBoot配置logback.xml 多环境的操作步骤

    前提 logback日志文件要实现springboot多环境配置,不然每次都需要修改logback.xml里面的配置文件,所以很麻烦. 操作步骤 1.resource文件的内容结构如下: 2.配置application.yml spring: profiles: active: dev logging: config: classpath:logback-${spring.profiles.active}.xml 3.配置lockback-dev.xml 这个地方就可以实现自己的多环境日志配置了

  • springboot如何使用logback-spring配置日志格式,并分环境配置

    配置不生效的解决办法 注意:如果配置不生效,则说明spring优先加载了其他配置: 解决办法: 添加启动参数 -Dlogging.config=classpath:logback-spring.xml 修改名字为 logback.xml, SpringBoot首先去查找标准的日志配置文件,如果找不到在去找拼接Spring的配置的文件, 标准文件名: "logback-test.groovy", "logback-test.xml", "logback.gr

  • 基于Springboot使用logback的注意事项

    Springboot logback的注意事项 项目使用SpringBoot搭建的,开发环境没有发现问题,日志输出位置也正常. 项目的日志没有使用默认配置文件名方式,而是一个环境一套配置文件,所以日志也是通过application.properties配置中间接指定的: 比如开发环境: application.properties文件配置为:spring.profiles.active=dev application-dev.properties文件的日志配置:logging.config=cl

  • springboot使用Logback把日志输出到控制台或输出到文件

    一:日志: 1.配置日志级别 日志记录器(Logger)的行为是分等级的.如下表所示: 分为:OFF.FATAL.ERROR.WARN.INFO.DEBUG.ALL 默认情况下,spring boot从控制台打印出来的日志级别只有INFO及以上级别,可以配置日志级别 设置日志级别 logging.level.root=WARN 这种方式只能将日志打印在控制台上 二.Logback日志 spring boot内部使用Logback作为日志实现的框架. Logback和log4j非常相似,如果你对l

  • 基于Springboot实现JWT认证的示例代码

    目录 一.了解JWT 概念 作用 1.1 为什么授权要使用jwt 二.JWT结构 2.1 header 2.2 payload 2.3 signature 三.使用JWT 3.1 上手 3.2 封装工具类 3.3 整合springboot 最近一直想写一个类似于待办的东西,由于不想用传统的session,就卡住了,后来在各种群里扯皮,发现除了用缓存之外,还可以通过 JWT 来实现. 一.了解JWT 概念 json web token 用于在各方之间以 json 对象安全地传输信息,比如在前端和后

  • Springboot内外部logback多环境配置详解

    目录 一.概述 二.项目内外配置 三.使用自定义appender 四.logback查找配置源码 五.案例源码 一.概述 SpringBoot官方文档Springboot 默认读取的是项目内的 resources 中 logback 配置文件.如果 classpath(resources) 下有logback-test.xml会优先生效,并且会和其他logback文件同时生效.Springboot 默认日志级别是DEBUG,所以在logback初始化之前,会有DEBUG日志输出. 二.项目内外配

  • SpringBoot整合logback的示例代码

    Logback简介 1.logback和log4j是同一个作者,logback可以看作是log4j的升级版 2.logback分为三个模块, logback-core, logback-classic 和logback-access,其中 logback-core是核心,其他两个模块依赖core,这个logback-classic是log4j的改善版本,并且原生实现了SLF4J门面(具体参考前文:Java中SLF4J日志框架的实现原理).模块logback-access可以集成于Servlet容

  • 基于SpringBoot上传任意文件功能的实现

    一.pom文件依赖的添加 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</gr

  • 基于SpringBoot与Mybatis实现SpringMVC Web项目

    一.热身 一个现实的场景是:当我们开发一个Web工程时,架构师和开发工程师可能更关心项目技术结构上的设计.而几乎所有结构良好的软件(项目)都使用了分层设计.分层设计是将项目按技术职能分为几个内聚的部分,从而将技术或接口的实现细节隐藏起来. 从另一个角度上来看,结构上的分层往往也能促进了技术人员的分工,可以使开发人员更专注于某一层业务与功能的实现,比如前端工程师只关心页面的展示与交互效果(例如专注于HTML,JS等),而后端工程师只关心数据和业务逻辑的处理(专注于Java,Mysql等).两者之间

  • 基于spring-boot和docker-java实现对docker容器的动态管理和监控功能[附完整源码下载]

    docker简介 Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者喜爱.随着基于docker的开发者越来越多,docker的镜像也原来越丰富,未来各种企业级的完整解决方案都可以直接通过下载镜像拿来即用.因此docker变得越来越重要. 本文目的 本文通过一个项目实例来介绍如果通过docker对外接口来实现对docker容器的管理和监控. 应用场景: 对服务器资源池通过docker进行统一管理,按需分配资源和创建容器,达到资源最大化利

随机推荐