Spring Boot Log 日志使用教程
我们编写任何 Spring Boot 程序,可能绕不开的就是 log 日志框架(组件)。
在大多数程序员眼中日志是用来定位问题的。这很重要。
本项目源码下载 注意本项目提供的源码已在后期重新编写,有部分日期描述不一致。
如果你只是想知道 Spring boot log 如何使用,请直接观看 3.2 使用 Spring Boot Logback
1 Log 日志概述
1.1 Log 日志组件能干什么
日志能干的事情很多,对于学习程序,测试的工程师来说,日志能够定位问题,解决问题,是最大的功能点。
- 记录一切 日志帮助我们记录程序功能都干了什么,无论是正常的输入输出还是出现异常,都可以用日志记录
- 定位问题 日志可以帮助程序员调试问题,帮助测试人员定位问题
- 记录分析用户行为 统计分析师用来记录用户的一起行为,用于分析用户的习惯和商业价值
- 备份和还原实时数据 数据库工程师用来作为一种特殊的数据库
1.2 日志的级别 Log Level
日志级别是对日志记录信息的轻重缓急的划分。通常从轻到重划分为:
- TRACE
- DEBUG
- INFO
- WARN
- ERROR
通常当我们指定日志级别为 INFO
级别,那么 TRACE
DEBUG
级别的日志就不会被输出打印,同理如果指定日志级别为 ERROR
,那么其他类型的日志将不会被打印。
1.3 日志的输出 Log Import
通常日志以文本流的形式存储在磁盘,也可以把日志存储在关系型数据库中或 No Sql 中
- 文本
- 关系型数据库
- No Sql
- Console 控制台
一般日志组件都可以自定义输出格式。
1.4 Spring Boot 日志组件 Log Plugin
当然自己开发日志组件也是可以的,实际上也不是很难,在一些特殊场景,很多公司都是用自己开发的日志组件,但是对于大多数应用来说,我们使用标准的日志组件就可以解决我们的问题。
Spring Boot 日志组件最为常见的包括了
Logback
Spring Boot 约定的默认配置log4j
log4j2
slf4j
JUL
大部分场景我们都是推荐 Spring Boot 自带的日志 logback
。
很多无良媒体直接抓取文章又不写明来源,我是 fishpro程序鱼,本文作者。
2 Spring Boot Logback
3.1 关于 Logback
在 Spring Boot 中,logback 是基于 slf4j 实现的。
slf4j的全称是Simple Loging Facade For Java,即它仅仅是一个为Java程序提供日志输出的统一接口,并不是一个具体的日志实现方案,他能够实现大部分 日志组件。
如上图所示,logback
中使用了 slf4j
,logback-classic.jar
,logback-core.jar
实现了 logback 日志功能。
3.2 生成一个用于测试的 Spring Boot 项目
使用IDEA创建项目,其实也是从 (https://start.spring.io/ ) 创建,只是更为方便,我们一般采用从IDEA创建Spring Boot项目。
注意mac和windows的IDEA创建过程是一样的。
1)File>New>Project,如下图选择Spring Initializr 然后点击 【Next】下一步
2)填写GroupId(包名)、Artifact(项目名) 即可。点击 下一步
- groupId=com.fishpro
- artifactId=log
3)选择依赖 Spring Web Starter 前面打钩
4)项目名设置为 spring-boot-study-log
5)编写个简单的示例,可以看出使用日志组件非常的简单
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class LogApplication {
public static void main(String[] args) {
Logger logger =LoggerFactory.getLogger(LogApplication.class);
SpringApplication.run(LogApplication.class, args);
logger.debug("This is a debug message");//注意 spring 默认日志输出级别为 info 所以默认情况下 这句不会打印到控制台
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");
}
}
运行可以看到输出了 hello world
2019-07-10 23:51:49.225 INFO 3906 --- [ main] com.fishpro.log.LogApplication : Started LogApplication in 1.688 seconds (JVM running for 2.317)
2019-07-10 23:51:49.226 INFO 3906 --- [ main] com.fishpro.log.LogApplication : This is an info message
2019-07-10 23:51:49.227 WARN 3906 --- [ main] com.fishpro.log.LogApplication : This is a warn message
2019-07-10 23:51:49.227 ERROR 3906 --- [ main] com.fishpro.log.LogApplication : This is an error message
3.3 依赖配置 Pom.xml
看到网上不少人贴出了 logback 的依赖配置,实际上从依赖包中可以看出,默认是不需要单独配置 logback 依赖的。不需要单独配置、不需要单独配置、不需要单独配置。
3.4 使用 YML 配置 logback
3.4.1 编写一个 Controller 层类作为测试用 IndexController
@Controller
public class IndexController {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/")
String index(){
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warn message");
logger.error("This is an error message");
return "index";
}
}
在浏览器中执行 http://locahost:8081/
如上图,我们没有 DEBUG
的日志,也就是说 logger.debug("This is a debug message");
没有被输出到控制台。
实际上,Spring Boot 是一种约定大于配置,也就是说,他本身有一个配置文件叫 base.xml
,在这个配置文件里面,已经默认配置了输出的日志级别 让我们来看看 base.xml
,如下面的 xml 代码所示,root level="INFO"
已经定义了日志输出级别为 INFO
。这就是为什么,我看到控制台没有输出 DEBUG
那条日志。
<?xml version="1.0" encoding="UTF-8"?>
<!--
Base logback configuration provided for compatibility with Spring Boot 1.1
-->
<included>
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml" />
<include resource="org/springframework/boot/logging/logback/file-appender.xml" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</included>
3.4.2 在 application.yml 中配置
如下配置,设置level的级别为 DEBUG
logging:
level:
com.fishpro.log: debug
在浏览器中执行 http://locahost:8081/ 输出如下日志 可以看出已经有了 DEBUG
日志
2019-07-08 12:51:30.423 INFO 36966 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet'
2019-07-08 12:51:30.423 INFO 36966 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet'
2019-07-08 12:51:30.428 INFO 36966 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 5 ms
2019-07-08 12:51:30.447 DEBUG 36966 --- [nio-8081-exec-1] c.f.s.controller.IndexController : This is a debug message
2019-07-08 12:51:30.447 INFO 36966 --- [nio-8081-exec-1] c.f.s.controller.IndexController : This is an info message
2019-07-08 12:51:30.448 WARN 36966 --- [nio-8081-exec-1] c.f.s.controller.IndexController : This is a warn message
2019-07-08 12:51:30.448 ERROR 36966 --- [nio-8081-exec-1] c.f.s.controller.IndexController : This is an error message
3.4.3 在 application.yml 详细配置
如下配置代码,指定了日志的输出级别、日志存储路径和输出的格式。
logging:
#level 日志等级 指定命名空间的日志输出
level:
com.fishpro.log: debug
#file 指定输出文件的存储路径
file: logs/app.log
#pattern 指定输出场景的日志输出格式
pattern:
console: "%d %-5level %logger : %msg%n"
file: "%d %-5level [%thread] %logger : %msg%n"
在浏览器中执行 http://locahost:8081/
00:08:15 [reactor-http-nio-2] DEBUG com.fishpro.log.LogApplication - This is a debug message
00:08:15 [reactor-http-nio-2] INFO com.fishpro.log.LogApplication - This is an info message
00:08:15 [reactor-http-nio-2] WARN com.fishpro.log.LogApplication - This is a warn message
00:08:15 [reactor-http-nio-2] ERROR com.fishpro.log.LogApplication - This is an error message
同时我们可以看到在项目根路径下多处理 logs
文件夹,下面有 app.log
文件,app.log
文件同时记录了日志的输出。
3.4.4 不同环境中配置
我们可以在 dev
、prod
、test
等环境中配置不同的 log 配置项目,我们只需要根据我们的配置文件来设置即可。
关于如何在 Spring Boot 中配置不同的环境实现 开发环境(dev)、测试环境(test)、生成环境(prod)分离,请参考Spring Boot 中多环境配置
3.5 使用 logback-spring.xml 来配置 logback 日志
如果需要更为详细的自定义 logback 日志,那么我们需要使用 xml 配置文件来配置。
使用 logback-spring.xml 来自定义日志的配置,主要需要了解 logback-spring.xml 详细功能点,能够配置哪些内容。
3.5.1 指定 logback-spring.xml 路径
首先我们要知道 logback-spring.xml 文件放在哪里。
默认 logback-spring.xml
路径在 resource 文件夹下,即你只要在 resource 文件夹下新建文件 logback-spring.xml
即可。
3.5.2 使用 logback-spring.xml 自定义配置
这里我们使用自定义配置 实现
- 把日志输出到指定的目录,并按照日期 yyyy-MM-dd 的格式按天存储,注意如果没有特别指定,这里的目录 applog 就是指项目的根目录(如果您的项目是多模块配置并不是指模块的目录)
- 配置 xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--输出到控制台-->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!--按天生成日志-->
<appender name="logFile" class="ch.qos.logback.core.rolling.RollingFileAppender">
<Prudent>true</Prudent>
<!-- 过滤器,只打印ERROR级别的日志 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名-->
<FileNamePattern>
applog/%d{yyyy-MM-dd}/%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日志文件保留天数-->
<MaxHistory>15</MaxHistory>
</rollingPolicy>
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>
%d{yyyy-MM-dd HH:mm:ss} -%msg%n
</Pattern>
</layout>
</appender>
<logger name="com.fishpro.log" additivity="false">
<appender-ref ref="console"/>
<appender-ref ref="logFile"/>
</logger>
<!-- 设置Spring&Hibernate日志输出级别 -->
<logger name="org.springframework" level="WARN"/>
<logger name="org.mybatis" level="WARN"/>
<logger name="com.ibatis" level="DEBUG"/>
<logger name="com.ibatis.common.jdbc.SimpleDataSource" level="DEBUG"/>
<logger name="com.ibatis.common.jdbc.ScriptRunner" level="DEBUG"/>
<logger name="com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate" level="DEBUG"/>
<logger name="java.sql.Connection" level="DEBUG"/>
<logger name="java.sql.Statement" level="DEBUG"/>
<logger name="java.sql.PreparedStatement" level="DEBUG"/>
<logger name="com.ruidou.baoqian.mapper" level="DEBUG"/>
<!-- 开发环境下的日志配置 -->
<root level="error">
<appender-ref ref="console"/>
<appender-ref ref="logFile"/>
</root>
</configuration>
在浏览器中执行 http://locahost:8081/
此时,你会发现工程根目录多出来 applog 文件夹,applog/2019-07-08/2019-07-08.log
按照日期分类来记录文件,这很重要。
优先级
有趣的是,当我们把 xml 文件同 application.yml 都进行配置的时候,他执行了 logback-spring。xml 中的配置,所有 logback-spring.xml 配置是优先的
4 多日志组件如何统一框架
有的时候一个系统应用 Application 中使用了多个日志框架来处理,比如同时使用了 Logback、log4j如何统一呢?
总结:本章介绍了日志组件 Spring Boot Logback 的简单使用,下一个章节,我们将详细说明 logback-spring.xml 的标签含义及标签的属性含义。
Spring Boot Log 日志使用教程的更多相关文章
- Spring Boot 2.x基础教程:找回启动日志中的请求路径列表
如果您看过之前的Spring Boot 1.x教程,或者自己原本就对Spring Boot有一些经验,或者对Spring MVC很熟悉.那么对于Spring构建的Web应用在启动的时候,都会输出当前应 ...
- Spring Boot 之日志记录
Spring Boot 之日志记录 Spring Boot 支持集成 Java 世界主流的日志库. 如果对于 Java 日志库不熟悉,可以参考:细说 Java 主流日志工具库 关键词: log4j, ...
- Spring Boot 2.x基础教程:使用Elastic Job实现定时任务
上一篇,我们介绍了如何使用Spring Boot自带的@Scheduled注解实现定时任务.文末也提及了这种方式的局限性.当在集群环境下的时候,如果任务的执行或操作依赖一些共享资源的话,就会存在竞争关 ...
- Spring Boot 2.x基础教程:使用tinylog记录日志
tinylog简介 tinylog,与其他各种tiny开头的东西一样,是一个轻量级的开源日志解决方案.它本身只包含两个JAR文件(一个用于API,另一个用于实现),没有任何外部依赖关系.两个JAR文件 ...
- Spring Boot 自定义日志详解
本节内容基于 Spring Boot 2.0. 你所需具备的基础 什么是 Spring Boot? Spring Boot 核心配置文件详解 Spring Boot 开启的 2 种方式 Spring ...
- Spring Boot系列——日志配置
日志,通常不会在需求阶段作为一个功能单独提出来,也不会在产品方案中看到它的细节.但是,这丝毫不影响它在任何一个系统中的重要的地位. 为了保证服务的高可用,发现问题一定要即使,解决问题一定要迅速,所以生 ...
- 想要快速上手 Spring Boot?看这些教程就足够了!| 码云周刊第 81 期
原文:https://blog.gitee.com/2018/08/19/weekly-81/ 想要快速上手 Spring Boot?看这些教程就足够了!| 码云周刊第 81 期 码云周刊 | 201 ...
- 【spring boot】8.spring boot的日志框架logback使用
在继续上一篇的Debug调试之后,把spring boot的日志框架使用情况逐步蚕食. 参考:http://tengj.top/2017/04/05/springbo 开篇之前,贴上完整applica ...
- Spring Boot默认日志logback配置解析
前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日志输出格式以及输出方式如何配置? 代码中如何使用? 正文 Sp ...
随机推荐
- AcWing 830. 单调栈
https://www.acwing.com/problem/content/832/ #include <iostream> using namespace std; ; int stk ...
- 为什么html表单用post提交后,提交页面是空白
为什么html表单用post提交后,提交页面是空白? 因为post提交就应该用doPost()方法处理数据
- 等差数列Arithmetic Progressions题解(USACO1.4)
Arithmetic Progressions USACO1.4 An arithmetic progression is a sequence of the form a, a+b, a+2b, . ...
- MySQL学习(八)删除表数据
表空洞的产生 删除某个行数据 或删除某个页 如下图所示,这个删除过程只是标记了某行的位置为删除,假如此时在300与600之间插入了一行数据,那么 同理,当删除某个页时,该页就会被复用.所以当删 ...
- Atcoder Beginner Contest 155D(二分,尺取法,细节模拟)
二分,尺取法,细节模拟,尤其是要注意a[i]被计算到和a[i]成对的a[j]里时 #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> ...
- linux中systemctl详细理解及常用命令
linux中systemctl详细理解及常用命令 https://blog.csdn.net/skh2015java/article/details/94012643 一.systemctl理解 Li ...
- 解析python 生产/消费者模型实现过程
1.多线程实现 import threadingimport queueimport logginglogging.basicConfig(level = logging.INFO,format = ...
- HttpServer带阻塞性能比较
服务端在返回hello,world! 之前先阻塞一秒钟,模拟访问DB等耗时操作. Netty 我直接在 WorkerGroup 里头sleep,用同步阻塞线程模型的方式来编程,所以性能暴降. Joob ...
- Atcoder Beginner Contest151E(排列组合)
排列组合 #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h> using namespace std; ]; ; ]; long lo ...
- IDEA类和方法注释自动生成
一.生成类注释 1.打开Preferences-->Editor-->File and Code Templates,右侧选择Filestab页,找到Class.Interface,可以看 ...