spring boot配置logback日志

spring boot配置logback日志


在上一篇spring boot入门里提过,Spring Boot默认的日志打印是logback,所以配置logback日志会很简单,但是也有注意的地方。

本次配置日志的需求

  1. 日志需要控制台打印和文件打印两种。
  2. 其中文件打印按照日志级别分别保存到各自的文件里。
  3. 文件日志每天一个日志,并且保存30天。
  4. 文件日志可以自由指定保存路径、打印格式等。
  5. 控制台打印可指定打印格式,并且自由增加删除某些日志。

通过上一篇的介绍,知道,Spring boot默认日志为logback,所以只要引入如下依赖,就会自动引入logback日志的jar包。

<!-- Spring Boot Web 依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>

单独spring 项目使用 logback日志需要的jar包如下:

<dependency><groupId>ch.qos.logback</groupId><artifactId>logback-classic</artifactId><version>1.1.9</version>
</dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId><version>1.1.9</version>
</dependency>
<!--因logback日志需要与slf4j配合使用,如下的jar包需要引入-->
<dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.22</version>
</dependency>1234567891011121314151617

再说一遍,spring boot项目不需要引入上边的三个jar包,已经自动引入了。

以下是配置步骤:

  • logback日志的在spring boot里的配置需要在src/main/resources下,application.properties同级,放一个logback的xml文件,一般起名字为logback-spring.xml,网上很多人建议起名字为这个,我没看出有什么区别,所以我就按照他们讲的配置了,以免出现不必要的错误。
  • logback-spring.xml按照我的需求配置成控制台打印和文件打印,直接将以下内容复制,并命名成该名字,放到上边说的位置中,具体的内容如下:
<?xml version="1.0" encoding="UTF-8"?>  
<configuration scan="true" scanPeriod="60 seconds">  <!-- 都说spring boot使用日志需要引入这个,但是我引入了之后总是打印两份日志,所以我去除了,并不影响使用 --><!-- <include resource="org/springframework/boot/logging/logback/base.xml"/> --><!-- 控制台设置 -->  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">  <encoder>  <pattern>${CONSOLE_LOG_PATTERN}</pattern>  </encoder>  </appender>  <!-- INFO -->  <appender name="infoAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  <!-- 文件路径 ,注意LOG_PATH是默认值,它的配置对应application.properties里的logging.path值-->  <file>${LOG_PATH}/info/info.log</file>  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  <!-- 文件名称 -->  <fileNamePattern>info/info-%d{yyyy-MM-dd}.log  </fileNamePattern>  <!-- 文件最大保存历史数量 -->  <MaxHistory>30</MaxHistory>  </rollingPolicy>  <encoder>  <pattern>${FILE_LOG_PATTERN}</pattern>  </encoder>  <filter class="ch.qos.logback.classic.filter.LevelFilter">  <level>INFO</level>  <onMatch>ACCEPT</onMatch>    <onMismatch>DENY</onMismatch>    </filter>  </appender><!-- DEBUG -->  <appender name="debugAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  <!-- 文件路径 ,注意LOG_PATH是默认值,它的配置对应application.properties里的logging.path值-->  <file>${LOG_PATH}/debug/debug.log</file>  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  <!-- 文件名称 -->  <fileNamePattern>debug/debug-%d{yyyy-MM-dd}.log</fileNamePattern>  <!-- 文件最大保存历史数量 -->  <MaxHistory>30</MaxHistory>  </rollingPolicy>  <encoder>  <pattern>${FILE_LOG_PATTERN}</pattern>  </encoder>  <filter class="ch.qos.logback.classic.filter.LevelFilter">  <level>DEBUG</level>  <onMatch>ACCEPT</onMatch>    <onMismatch>DENY</onMismatch>    </filter>  </appender> <!-- WARN -->  <appender name="warnAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  <!-- 文件路径 ,注意LOG_PATH是默认值,它的配置对应application.properties里的logging.path值-->   <file>${LOG_PATH}/warn/warn.log</file>  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  <!-- 文件名称 -->  <fileNamePattern>warn/warn-%d{yyyy-MM-dd}.log  </fileNamePattern>  <!-- 文件最大保存历史数量 -->  <MaxHistory>30</MaxHistory>  </rollingPolicy>  <encoder>  <pattern>${FILE_LOG_PATTERN}</pattern>  </encoder>  <filter class="ch.qos.logback.classic.filter.LevelFilter">  <level>WARN</level>  <onMatch>ACCEPT</onMatch>    <onMismatch>DENY</onMismatch>    </filter>  </appender> <!-- ERROR -->  <appender name="errorAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">  <!-- 文件路径 ,注意LOG_PATH是默认值,它的配置对应application.properties里的logging.path值-->  <file>${LOG_PATH}/error/error.log</file>  <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">  <!-- 文件名称 -->  <fileNamePattern>error/error-%d{yyyy-MM-dd}.log  </fileNamePattern>  <!-- 文件最大保存历史数量 -->  <MaxHistory>30</MaxHistory>  </rollingPolicy>  <encoder>  <pattern>${FILE_LOG_PATTERN}</pattern>  </encoder>  <filter class="ch.qos.logback.classic.filter.LevelFilter">  <level>ERROR</level>  <onMatch>ACCEPT</onMatch>    <onMismatch>DENY</onMismatch>    </filter>  </appender><logger name="org.springframework" additivity="false"><level value="ERROR" /><appender-ref ref="STDOUT" /><appender-ref ref="errorAppender" /></logger><!-- 由于启动的时候,以下两个包下打印debug级别日志很多 ,所以调到ERROR--><logger name="org.apache.tomcat.util" additivity="false"><level value="ERROR"/><appender-ref ref="STDOUT"/><appender-ref ref="errorAppender"/></logger><!-- 默认spring boot导入hibernate很多的依赖包,启动的时候,会有hibernate相关的内容,直接去除 --><logger name="org.hibernate.validator" additivity="false"><level value="ERROR"/><appender-ref ref="STDOUT"/><appender-ref ref="errorAppender"/></logger><root level="DEBUG"><appender-ref ref="STDOUT"/>  <appender-ref ref="infoAppender"/><appender-ref ref="debugAppender"/><appender-ref ref="warnAppender"/><appender-ref ref="errorAppender"/></root> 
</configuration>

其中,你们应该注意到里边有很多的“${}”形式的变量这其实是logback日志的默认名称,比如${LOG_PATH},${CONSOLE_LOG_PATTERN},${FILE_LOG_PATTERN} 等,这些变量只需要在spring boot的默认配置文件,application.properties里添加如下配置即可:

1)以下是日志输出的位置,注意在logback-spring.xml里用LOG_PATH才能获取到值

logging.path=d:/logs/springBoot

2)以下是指向日志配置文件的位置

logging.config=classpath:logback-spring.xml

3)以下是控制台打印日志格式设置,注意在logback-spring.xml里用CONSOLE_LOG_PATTERN才能获取

logging.pattern.console=[%d{yyyy-MM-dd HH:mm:ss}] -- [%-5p]: [%c] -- %m%n

4)以下是文件打印日志格式设置,注意在logback-spring.xml里用FILE_LOG_PATTERN才能获取到

logging.pattern.file=[%d{yyyy-MM-dd HH:mm:ss}] -- [%-5p]: [%c] -- %m%n

添加上边四个配置就对日志配置完了。多说一句,为什么在application.properties文件里的日志配置名字和${} 里不同呢,这就需要看logback-spring.xml里最上边的base.xml引入,找到这个文件就明白了。它的位置在以下jar包里:

spring-boot-1.5.1.RELEASE.jar

找到如下位置:

org.springframework.boot.logging.logback

就会看到里边有base.xml、console-appender.xml等等四个xml文件,打开file.appender.xml如下:

注意图中红色标注

也就是说spring boot里的日志配置文件已经将其写死,但是在application.properties里又要按照其要求写,所以我感觉这也是spring boot的缺点,太多隐藏的配置了,如果知道,那很简单了,但是不知道,就会浪费很多的时间,多配置很多的无用东西。

通过这四个spring boot的日志xml文件,也应该知道为什么在上一篇入门spring boot里没有配置日志,却打印日志的原因,其内在自己的日志应该就是这个。

另外说一下日志的打印控制,比如有一些打印日志我不想要,就可以通过配置logback-spring.xml文件,添加一个logger标签即可。比如如下:

[2021-06-05 19:14:23] -- [INFO ]: [org.I0Itec.zkclient.ZkClient] -- zookeeper state changed (SyncConnected)
[2021-06-05 19:14:23] -- [DEBUG]: [org.I0Itec.zkclient.ZkClient] -- Leaving process event
[2021-06-05 19:14:23] -- [DEBUG]: [org.I0Itec.zkclient.ZkClient] -- State is SyncConnected123

以上三条日志我现在不需要让它打印了,那就需要额外配置了,因为它们来自于org.I0Itec.zkclient.ZkClient 类,并且打印的内容分别是DEBUG和INFO级别,日志打印只要将该类的日志打印级别调高(日志从低到高为 TRACE、DEBUG、INFO、WARN、ERROR),因此只要将该类的日志级别配置为WARN以上,就不会打印上边的内容了。配置方法如下:

 <logger name="org.I0Itec.zkclient.ZkClient" additivity="false"><level value="ERROR" /><appender-ref ref="STDOUT" /><appender-ref ref="errorAppender" />
</logger>

其中:

name表示日志的打印位置,从上边可以看出是来自该类
additivity设置为false表示该日志打印设置(控制台打印还是文件打印等具体设置)不会向根root标签传递,也就是说该logger里怎么设置的那就会怎么打印,跟root无关
level value=’error’表示将该类日志级别设置为error级才会打印。
最后两行表示error级时会打印控制台和error文件同时打印日志。

配置logback日志的注意点:

  1. logback和log4j最好不要放在一起,会冲突,最主要的jar包是slf4j-log4j12.jarlogback-classic.jar 这两个jar包的设计简直是反人类,有一个类,这两个都会有,只要这两个jar包同时引入,就会看到启动spring boot会有一串冲突的红字,因此,只要用logback日志,就需要特别注意除了排除log4j主要jar包,别忘了排除slf4j-log4j12.jar ,具体的排除方法,可以选择maven项目的pom.xml,在右边找到Dependency Hierarchy,然后找到要排除的jar包,右击选择Exclude Maven Artifact,然后保存即可。

  2. logback的logback-spring.xml文件如果你没有按照我这么写,在application.properties文件里就不需要配置全部的4行内容,如果直接复制的我的,那就需要配置上了。

  3. logback貌似没有log4j常用,很多的第三方jar包都使用的log4j,比如aliba的dubbo和zookeeper都是默认的log4j,所以你在引入第三方的jar时,又使用的是logback,就特别注意是不是它们默认使用的log4j,如果是的话,有slf4j-log4j12.jar 就排除即可。后边说spring boot+dubbo时会再说。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556723.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springboot-项目获取resources下文件的方法

spring项目获取resources下文件的方法 最近写读取模板文件做一些后续的处理&#xff0c;将文件放在了项目的resources 下&#xff0c;发现了一个好用的读取方法&#xff1a; 比如上边是你需要读取的文件&#xff1a; 读取的方法如下&#xff1a; //File file ResourceUtils…

几款经典好用的Android,经典实用 Android十款生活必备软件推荐

【IT168 应用】在众多Android应用中有许多优秀的生活方式软件&#xff0c;它们为我们的生活提供了各方面的服务&#xff0c;例如像查看天气预报、搜索周边美食、提醒重要事件等等。大家已经慢慢的熟悉了移动互联生活&#xff0c;尤其是工作中的白领&#xff0c;手机更成为了他们…

springboot配置单独的参数文件

一、介绍 是不是经常用Value注解&#xff1f;用过springboot的都知道它是从application.properties文件中引入某个变量的值&#xff0c;是不是已经灰常熟悉了&#xff1f; 默认在springboot启动后&#xff0c;加载application.properties文件&#xff0c;通过Value("${}&…

nacos初探--作为配置中心

什么是nacos Nacos 支持基于 DNS 和基于 RPC 的服务发现&#xff08;可以作为springcloud的注册中心&#xff09;、动态配置服务&#xff08;可以做配置中心&#xff09;、动态 DNS 服务。 官方介绍是这样的&#xff1a; Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提…

Module build failed: Error: Cannot find module ‘node-sass‘ Require stack报错解决

Module build failed: Error: Cannot find module ‘node-sass’ Require stack报错解决 异常信息 解决方法 设置用淘宝镜像下载 npm install --save-dev node-sass --registryhttps://registry.npm.taobao.org --disturlhttps://npm.taobao.org/dist --sass-binary-sitehtt…

xp系统怎样添加桌面计算机名,教你win10系统电脑桌面怎么添加日历

很多用户都会选择在电脑的桌面上建立一个日历小挂件来提醒自己&#xff0c;其实在电脑桌面添加日历&#xff0c;可防止用户耽误工作进程的安排&#xff0c;不知win10系统电脑桌面怎么添加日历的用户&#xff0c;请来看看下面的介绍吧。日历对很多用户来说是非常重要的&#xff…

什么是Nacos?Nacos注册配置中心介绍

一、什么是Nacos 英文全称Dynamic Naming and Configuration Service&#xff0c;Na为naming/nameServer即注册中心,co为configuration即注册中心&#xff0c;service是指该注册/配置中心都是以服务为核心。服务在nacos是一等公民 二、Nacos原理 nacos简单介绍 Nacos注册中心…

矩阵 计算机应用,《计算机视觉算法:基于OpenCV的计算机应用开发》 —3.3 元素级矩阵操作...

3.3 元素级矩阵操作基于元素的(元素级)矩阵操作是计算机视觉中的一类数学函数和算法&#xff0c;它处理矩阵的各个元素&#xff0c;或者说&#xff0c;图像中的每个像素。注意基于元素的操作可以并行化&#xff0c;因此矩阵元素的处理顺序不重要。这个特点是本节函数和算法与本…

微服务系列之ZooKeeper注册中心和Nacos注册中心Nacos和Zookeeper对比

一、ZooKeeper注册中心 Zookeeper 是 Apache Hadoop 的子项目&#xff0c;是一个树型的目录服务&#xff0c;支持变更推送&#xff0c;适合作为 Dubbo 服务的注册中心&#xff0c;工业强度较高&#xff0c;可用于生产环境&#xff0c;推荐使用。 流程说明&#xff1a; 服务提…

springboot配置跨mapper.xml的全局变量

springboot配置跨mapper.xml的全局变量 有这样的需求&#xff0c;mybatis框架的mapper.xml&#xff0c;即映射文件里&#xff0c;如果需要配置一个全局变量&#xff0c;然后&#xff0c;在所有的mapper.xml里都能拿到使用。 这需求也不苛刻吧~ 后来查了下&#xff0c;发现对…

SpringBoot升级到2.0后默认时间格式变化_springboot接收date类型参数

springboot1.x时&#xff0c;请求返回默认将Date类型转换成时间戳&#xff1a; createTime: 1544693261000然而在升级到springboot2.0后&#xff0c;默认返回的时间格式变成了UTC字符串&#xff1a; createTime: "2021-12-13T09:27:41.0000000"对于网页端或安卓端&…

org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved

场景&#xff1a; spring项目中无法访问到对应controller&#xff0c;查看日志&#xff0c;没有报错&#xff0c;只有warnring&#xff1a; org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException Resolved [org.springframework.web.meth…

带桭字的名字_男孩带官运大气的名字有气魄有能力-可爱点

一个好的名字传承了祖辈的血脉烙印&#xff0c;寄托了父母的满心希望和浓重的情意&#xff0c;取一个官运财运旺的名字&#xff0c;相信能让男孩更加充满自信和动力&#xff0c;这里整理了男孩带官运大气的名字的内容&#xff0c;来看看有没有给你们带来灵感呢。1、景辉“景”字…

springboot基于mybatis扫描jar包中的controller、service、dao、xml

springboot基于mybatis扫描jar包中的controller、service、dao、xml 最近有这样的需求&#xff0c;是将某个业务模块接口&#xff0c;比如新闻的接口模块 作为一个公共固定的模块&#xff0c;整个包括controller 、model 、mapper 、mapper .xml &#xff0c;都通过jar 包的形…

java 后台和前端的消息提醒_滴滴Java后台3面题目:网络+内存溢出+各种锁+高性能+消息队列...

一面自我介绍项目介绍JVM类加载机制java的垃圾回收器都有哪些&#xff0c;说下g1的应用场景&#xff0c;平时你是如何搭配使用垃圾回收器的。红黑树的设计经常使用的设计模式&#xff1f;以及UML设计&#xff1f;hashmap实现的的数据结构是什么样的&#xff1f;当hash冲突过多时…

springboot 配置多个请求服务代理

springboot 配置服务代理 有时候&#xff0c;我们可能有下边这样的需求&#xff1a; 即&#xff0c;针对于分布式服务&#xff0c;我们会有多种业务接口服务&#xff0c;但是服务器上可能只要求开放一个服务的端口&#xff0c;比如上图的restA项目端口是对外开放的&#xff0…

主板上的jrgb接口干什么用_用思维导图,解读选配主板的过程,重点解读兼容与接口的搭配技术...

本文用思维导图&#xff0c;解读选配主板的过程&#xff0c;重点解读兼容与接口的搭配技术&#xff0c;选择了5块不同主板&#xff0c;说明主板内容。重点提示&#xff0c;主板决定一台计算机能否稳定运行。任务描述&#xff1a;重点解读兼容与接口的搭配技术,解读选配主板的过…

Linux启动Mysql

关于Linux上安装Mysql可以查看之前的博客&#xff1a;https://blog.csdn.net/qq_43842093/article/details/120401076 Linux启动Mysql 下查看mysql服务的两种方式&#xff1a; 方式一&#xff1a; [rootlocalhost bin]ps -ef|grep mysql方式二&#xff1a; [rootlocalhost…

springboot配置shiro多项目实现session共享的详细步骤

springboot配置shiro多项目实现session共享的详细步骤 公司需要这样的需求&#xff1a; 有两个项目master 主项目、suiteone 项目&#xff0c;两个项目各自由shiro 安全框架管理&#xff0c;当不能登录时&#xff0c;都无法访问&#xff0c;但当登录了其中一个&#xff0c;再…

shiro框架---关于多项目之间验证为什么需要共享session

关于多项目之间登录验证为什么需要共享session 服务器上部署了两个项目&#xff0c;登录之后才可以访问其中的接口。现在想要实现&#xff0c;当登录项目1成功后&#xff0c;可以不需要再登录项目2&#xff0c;直接可以访问项目2中的接口。 大部分人都会想到&#xff0c;共享s…