springboot中使用logback
原文地址:https://blog.csdn.net/tianyaleixiaowu/article/details/73321610
Springboot默认集成的就是logback,logback相对来说是优秀于log4j的,log4j2也是参考了logback的设计。本篇就是来看看如何使用logback。
新建一个Springboot项目,勾选web就OK了,项目会自动集成logback。
控制台日志
写一个controller测试一下:
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RestController;
- /**
- * Created by admin on 17/6/16.
- */
- @RestController
- public class IndexController {
- private final Logger logger = LoggerFactory.getLogger(getClass());
- @GetMapping("/index")
- public Object index() {
- logger.debug("debug");
- logger.info("info");
- logger.warn("warn");
- logger.error("error");
- return "success";
- }
- }
需要注意:Logger是slf4j包中的logger,别引用错了。slf4j是一个工厂,可以和log4j、logback结合使用,熟悉工厂模式的自然理解。引用了logback那么Logger就会使用logback相关的方法来处理日志,引用了log4j也同理,这样能便于我们切换日志的实际处理类,这是工厂模式的优点。不要同时引用两个日志处理框架,这样工厂会懵逼的。
访问上面的controller,查看控制台打印:
2017-06-16 09:54:13.966 INFO 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController : info
2017-06-16 09:54:13.967 WARN 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController : warn
2017-06-16 09:54:13.967 ERROR 60356 --- [nio-8080-exec-1] c.e.demo.controller.IndexController : error
我们发现除了debug没出来,其他的都出来了。
这是因为Springboot的日志level来控制的,根据不同的level来显示。在哪里控制呢?正常来说,应该是由我们在resources下配置的spring-logback.xml来控制,但是我们什么都没写,那么他就走了Springboot默认的配置。
这里就是Springboot对logback配置的地方,base.xml里,可以看到root level=INFO,这个代表该项目默认是输出最低为info级别的日志。然后看到有两个append-ref,分别为console何file,这两个分别对应上面引用的两个include resource里的xml,每个名字对应一个处理类。
ConsoleAppender和FixedWindowRollingPolicy都是logback提供的两个Appender处理类,Appender类代表了对日志的处理方法,这个可以自定义。系统提供了很多个Appender,基本满足了大部分场景的需求,像Console就是输出到控制台的,System.out.print之类的,而File的就是输出到日志文件的。
刚才可以看到在控制台已经打印出了info及以上级别的日志了,那日志文件在哪里呢?
日志文件
file: ./logback.log
修改其他配置
file: ./logback.log
level:
com.example.demo: debug
使用自定义配置
修改日志级别
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <include resource="org/springframework/boot/logging/logback/base.xml" />
- <root level="WARN">
- <appender-ref ref="CONSOLE" />
- <appender-ref ref="FILE" />
- </root>
- </configuration>
这里引用了base.xml并覆盖了root level为WARN,重启项目,并访问index
按包名区分日志级别
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <include resource="org/springframework/boot/logging/logback/base.xml" />
- <root level="INFO">
- <appender-ref ref="CONSOLE" />
- <appender-ref ref="FILE" />
- </root>
- <logger name="org.springframework.web" level="INFO"/>
- <logger name="com.example.demo" level="WARN"/>
- </configuration>
在xml里配置不同的包的日志level。结果自行测试。
按部署环境区分日志级别
- <?xml version="1.0" encoding="UTF-8"?>
- <configuration>
- <include resource="org/springframework/boot/logging/logback/base.xml" />
- <root level="INFO">
- <appender-ref ref="CONSOLE" />
- <appender-ref ref="FILE" />
- </root>
- <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
- <springProfile name="test,dev">
- <logger name="org.springframework.web" level="INFO">
- <appender-ref ref="FILE"/>
- </logger>
- <logger name="com.example" level="INFO" />
- </springProfile>
- <!-- 生产环境. -->
- <springProfile name="prod">
- <logger name="org.springframework.web" level="ERROR">
- <appender-ref ref="FILE"/>
- </logger>
- <logger name="com.example" level="ERROR" />
- </springProfile>
- </configuration>
写法如上,然后在yml里配置spring.profiles.active = dev结果自行测试。
按时间自动滚动的日志文件
- <appender name="MY_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
- <Prudent>true</Prudent>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <fileNamePattern>logFile.%d{yyyy-MM-dd}.log</fileNamePattern>
- <maxHistory>30</maxHistory>
- <totalSizeCap>3GB</totalSizeCap>
- </rollingPolicy>
- <layout class="ch.qos.logback.classic.PatternLayout">
- <Pattern> %d{yyyy-MM-dd HH:mm:ss} -%msg%n</Pattern>
- </layout>
- <encoder>
- <pattern>%-4relative [%thread] %-5level %logger{35} - %msg%n</pattern>
- </encoder>
- </appender>
我们定义一个name为MY_FILE的appender,配置fileName策略为按年月日.log的文件名,然后就可以使用这个Appender了。
- <!-- 测试环境+开发环境. 多个使用逗号隔开. -->
- <springProfile name="test,dev">
- <logger name="org.springframework.web" level="INFO">
- <appender-ref ref="MY_FILE"/>
- </logger>
- </springProfile>
需要注意,Appender的定义要在上面,使用它的地方要在下面,不然会报错找不到Appender。
自定义Appender
如果以上都不能满足要求,需要自定义Appender,譬如我们希望把日志除了往文件、控制台外,再往mongoDB输出一份,那么就需要自定义一个mongoAppender。回头等我实验好了,就弄一个mongoAppender。
springboot中使用logback的更多相关文章
- 在SpringBoot中使用logback优化异常堆栈的输出
一.背景 在我们在编写程序的过程中,无法保证自己的代码不抛出异常.当我们抛出异常的时候,通常会将整个异常堆栈的信息使用日志记录下来.通常一整个异常堆栈的信息是比较多的,而且存在一些没用的信息.那么我们 ...
- 在SpringBoot中添加Logback日志处理
前言 SpringBoot项目中在官方文档中说明,默认已经依赖了一些日志框架.而其中推荐使用的就是Logback,所以这一次我将在我的模版中加入Logback日志的配置,说明一下,SpringBoot ...
- SpringBoot(三) - Slf4j+logback 日志,异步请求,定时任务
1.Slf4j+logback 日志 SpringBoot框架的默认日志实现:slf4j + logback: 默认日志级别:info,对应了实际生产环境日志级别: 1.1 日志级别 # 常见的日志框 ...
- 在SpringBoot项目中添加logback的MDC
在SpringBoot项目中添加logback的MDC 先看下MDC是什么 Mapped Diagnostic Context,用于打LOG时跟踪一个“会话“.一个”事务“.举例,有一个web ...
- springboot中动态修改logback日志级别
springboot中动态修改logback日志级别 在spring boot中使用logback日志时,项目运行中,想要修改日志级别. 代码如下: import org.slf4j.Logger; ...
- SpringBoot中Logback日志的配置
说明 在SpringBoot中自带的日志工具是Logback,我们可以在Springboot的配置文件中直接对Logback进行一些简单的配置,如: logging.level.com.nowcode ...
- Springboot的日志管理&Springboot整合Junit测试&Springboot中AOP的使用
==============Springboot的日志管理============= springboot无需引入日志的包,springboot默认已经依赖了slf4j.logback.log4j等日 ...
- SpringBoot整合Slf4j+logback日志框架
一.Slf4j简单介绍与优势 1.介绍 Slf4j的全称是Simple Loging Facade For Java(Java简单日志门面),它仅仅是一个为Java程序提供日志输出的统一接口,并不是一 ...
- SpringBoot 异步输出 Logback 日志
一.介绍 1.1 Logback Logback是由log4j创始人设计的另一个开源日志组件,它分为下面下个模块: logback-core:其它两个模块的基础模块 logback-classic:它 ...
随机推荐
- C# 获取控制台程序路径
- HDU4528 小明捉迷藏 [搜索-BFS]
一.题意 小明S在迷宫n*m中找大明D和二明E,障碍物X不能走,问你计算是否能在时间t内找到大明和二明 二.分析 2.1与普通的BFS不同,这里可以走回头路,这里应该建立四维的标记数组标记数组,例如v ...
- 运行APP脚本的步骤
1.打开ride(可运行命令:ride.py) 2.启动Appium 3.启动android-sdk\tools\uiantomatorviewer.bat(目的是为了抓取设备元素ID)
- 第二阶段:4.商业需求文档MRD:1.PRD-产品功能列表
这就是对功能清单的梳理已经优先级筛选
- Spring Boot 整合 slf4j+log4j2 实现日志管理
背景 Java 中比较常用的日志框架: log4j(Log for Java):Apache 的一个开源项目,七种日志级别:OFF.FATAL.ERROR.WARN.INFO.DEBUG.TRACE ...
- C# async await 死锁问题总结
可能发生死锁的程序类型 1.WPF/WinForm程序 2.asp.net (不包括asp.net mvc)程序 死锁的产生原理 对异步方法返回的Task调用Wait()或访问Result属性时,可能 ...
- 高阶函数HOF和高阶组件HOC(Higher Order Func/Comp)
一.什么是高阶函数(组件),作用是什么? 子类使用父类的方法可以通过继承的方式实现,那无关联组件通信(redux).父类使用子类方法(反向继承)呢 为了解决类(函数)功能交叉/功能复用等问题,通过传入 ...
- InnoDB与MyISAM的区别(高性能MySQL笔记)
1.InnoDB支持事务,MyISAM不支持,也就是说MyISAM不支持事务回滚操作,这个功能可能是致命的 2.InnoDB支持行锁,MyISAM只支持表锁,不过InnoDB的行锁是建立在索引之上的, ...
- 2019牛客暑期多校第六场题解ABDJ
A.Garbage Classification 传送门 题意:给你两个串,第一个串s由小写字母组成,第二个串t由dwh组成,长度为26,分别表示字母a到z代表的字符.现在要你判断: 如果字符串中‘h ...
- P2871 [USACO07DEC]手链Charm Bracelet(01背包模板)
题目传送门:P2871 [USACO07DEC]手链Charm Bracelet 题目描述 Bessie has gone to the mall's jewelry store and spies ...