SpringBootLog⽇志使⽤教程
我们编写任何 Spring Boot 程序,可能绕不开的就是 log ⽇志框架(组件)。
在⼤多数程序员眼中⽇志是⽤来定位问题的。这很重要。
注意本项⽬提供的源码已在后期重新编写,有部分⽇期描述不⼀致。
如果你只是想知道 Spring boot log 如何使⽤,请直接观看 3.2 使⽤ Spring Boot Logback
1 Log ⽇志概述
1.1 Log ⽇志组件能⼲什么
⽇志能⼲的事情很多,对于学习程序,测试的⼯程师来说,⽇志能够定位问题,解决问题,是最⼤的功能点。
1. 记录⼀切⽇志帮助我们记录程序功能都⼲了什么,⽆论是正常的输⼊输出还是出现异常,都可以⽤⽇志记录
2. 定位问题⽇志可以帮助程序员调试问题,帮助测试⼈员定位问题
3. 记录分析⽤户⾏为统计分析师⽤来记录⽤户的⼀起⾏为,⽤于分析⽤户的习惯和商业价值
4. 备份和还原实时数据数据库⼯程师⽤来作为⼀种特殊的数据库
1.2 ⽇志的级别 Log Level
⽇志级别是对⽇志记录信息的轻重缓急的划分。通常从轻到重划分为:
1. TRACE
2. DEBUG
3. INFO
4. WARN
5. ERROR
通常当我们指定⽇志级别为INFO级别,那么TRACE DEBUG级别的⽇志就不会被输出打印,同理如果指定⽇志级别为ERROR,那么其他类型的⽇志将不会被打印。
1.3 ⽇志的输出 Log Import
通常⽇志以⽂本流的形式存储在磁盘,也可以把⽇志存储在关系型数据库中或 No Sql 中
1. ⽂本
2. 关系型数据库
3. No Sql
4. Console 控制台
⼀般⽇志组件都可以⾃定义输出格式。
1.4 Spring Boot ⽇志组件 Log Plugin
当然⾃⼰开发⽇志组件也是可以的,实际上也不是很难,在⼀些特殊场景,很多公司都是⽤⾃⼰开发的⽇志组件,但是对于⼤多数应⽤来说,我们使⽤标准的⽇志组件就可以解决我们的问题。
Spring Boot ⽇志组件最为常见的包括了
1. Logback Spring Boot 约定的默认配置
2. log4j
3. log4j2
4. slf4j
5. 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创建项⽬,其实也是从 ( ) 创建,只是更为⽅便,我们⼀般采⽤从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 =Logger(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");
<("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
log4j2不打印日志
2019-07-10 23:51:49.227 ERROR 3906 --- [ main] com.fishpro.log.LogApplication : This is an error message
3.3 依赖配置 l
看到⽹上不少⼈贴出了 logback 的依赖配置,实际上从依赖包中可以看出,默认是不需要单独配置 logback 依赖的。不需要单独配置、不需要单独配置、不需要单独配置。
3.4 使⽤ YML 配置 logback
3.4.1 编写⼀个 Controller 层类作为测试⽤ IndexController
@Controller
public class IndexController {
private final Logger logger = Class());
@RequestMapping("/")
String index(){
logger.debug("This is a debug message");
logger.info("This is an info message");
logger.warn("This is a warn message");
<("This is an error message");
return "index";
}
}
在浏览器中执⾏
如上图,我们没有DEBUG的⽇志,也就是说logger.debug("This is a debug message");没有被输出到控制台。
实际上,Spring Boot 是⼀种约定⼤于配置,也就是说,他本⾝有⼀个配置⽂件叫 l ,在这个配置⽂件⾥⾯,已经默认配置了输出的⽇志级别让我们来看看l,如下⾯的 xml 代码所⽰,root lev
el="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/l" />
<property name="LOG_FILE" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${pdir:-/tmp}}}/spring.log}"/>
<include resource="org/springframework/boot/logging/l" />
<include resource="org/springframework/boot/logging/l" />
<root level="INFO">
<appender-ref ref="CONSOLE" />
<appender-ref ref="FILE" />
</root>
</included>
3.4.2 在 l 中配置
如下配置,设置level的级别为DEBUG
logging:
level:
com.fishpro.log: debug
在浏览器中执⾏输出如下⽇志可以看出已经有了DEBUG⽇志
2019-07-08 12:51:30.423 INFO 36966 --- [nio-8081-exec-1] 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.ller.IndexController : This is a debug message
2019-07-08 12:51:30.447 INFO 36966 --- [nio-8081-exec-1] c.ller.IndexController : This is an info message
2019-07-08 12:51:30.448 WARN 36966 --- [nio-8081-exec-1] c.ller.IndexController : This is a warn message
2019-07-08 12:51:30.448 ERROR 36966 --- [nio-8081-exec-1] c.ller.IndexController : This is an error message
3.4.3 在 l 详细配置
如下配置代码,指定了⽇志的输出级别、⽇志存储路径和输出的格式。
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"
在浏览器中执⾏
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)分离,请参考
3.5 使⽤ l 来配置 logback ⽇志
如果需要更为详细的⾃定义 logback ⽇志,那么我们需要使⽤ xml 配置⽂件来配置。
使⽤ l 来⾃定义⽇志的配置,主要需要了解 l 详细功能点,能够配置哪些内容。
3.5.1 指定 l 路径
⾸先我们要知道 l ⽂件放在哪⾥。
默认l路径在 resource ⽂件夹下,即你只要在 resource ⽂件夹下新建⽂件l即可。
3.5.2 使⽤ l ⾃定义配置
这⾥我们使⽤⾃定义配置实现
1. 把⽇志输出到指定的⽬录,并按照⽇期 yyyy-MM-dd 的格式按天存储,注意如果没有特别指定,这⾥的⽬录 applog 就是指项⽬的根⽬录(如
果您的项⽬是多模块配置并不是指模块的⽬录)
2. 配置 xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<contextName>logback</contextName>
<!--输出到控制台-->
<appender name="console" class="ch.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.olling.RollingFileAppender">
<Prudent>true</Prudent>
<!-- 过滤器,只打印ERROR级别的⽇志 -->
<rollingPolicy class="ch.olling.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="batis" level="WARN"/>
<logger name="com.ibatis" level="DEBUG"/>
<logger name="com.ibatismon.jdbc.SimpleDataSource" level="DEBUG"/>
<logger name="com.ibatismon.jdbc.ScriptRunner" level="DEBUG"/>
<logger name="com.ine.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>
在浏览器中执⾏
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论