今天我们来学习springboot中的日志
记录应用系统曰志主要有三个方面: 记录操作轨迹、监控系统运行状况、回溯系统故障。当系统发生线上问题时,完整的现场日志有助于工程师快速定位问题。
生产环境禁止输出 DEBUG 曰志且有选择地输出 INFO日志。使用 INFO、WARN 级别来记录业务行为信息时,一定要控制日志输出量,以免磁盘空间不足。同时要为曰志文件设置合理的生命周期及时清理过期的日志。避免重复打印,务必在日志配置文件中设置 additivity=false
一:日志框架分类与选择
| 日志门面(日志的抽象层) | 日志实现 |
|---|---|
| JCL(Jakarta Commons Logging)(2014年后不再维护) jboss-logging (不适合企业项目开发使用) SLF4J(Simple Logging Facade for java) | Log4j JUL(java.util.logging)(java.util.logging)(担心被抢市场,推出的) Log4j2( apache开发的很强大,借了log4j的名,但很多框架未适配上) Logback(Log4j同一个人开发的新框架,做了重大升级) |
二:日志门面
门面设计模式是面向对象设计模式中的一种,日志框架采用的就是这种模式,类似JDBC 的设计理念。它只提供一套接口规范,自身不负责日志功能的实现。目的是让使用者不需要关注底层具体是哪个日志库来负责日志打印及具体的使用细节等。目前用得最为广泛的曰志门面有两种 slf4j和commons -logging
三:日志库
负责实现日志相关功能,主流日志库有三个,分别为:log4j、log-jdk(java.util.logging.Logger)、logback。logback是最晚出现的,与log4j同一个作者,是log4j的升级版且本身实现了slf4j的接口。
四:SpringBoot默认日志配置
这里我们使用代码来演示一下:
UserController.java
package com.example.demo.demos.web.controller;
import com.example.demo.demos.web.dao.User;
import com.example.demo.demos.web.dao.UserDao;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.List;
@Controller
public class UserController
{
/**
* 定义一个静态常量日志对象
*/
private static final Logger logger =LoggerFactory.getLogger(UserController.class);
@Autowired
private UserDao userDao;
@RequestMapping("selectByExample")
@ResponseBody
public List<User> selectByExample()
{
List<User> list = userDao.selectByExample(null);
// 输出日志信息
logger.info("selectByExample,info:");
logger.trace("selectByExample,trace:");
logger.debug("selectByExample,debug:");
logger.warn("selectByExample,warn:");
logger.error("selectByExample,error:");
return list;
}
}
application.yml
logging:
# 配置日志等级
level:
com.example.demo: info
# 配置日志输出文件(也可以存放指定目录,默认是当前项目根目录)
file:
name: logs/springboot.log
# 定义日志输出格式
pattern:
# 这里是控制台的格式
# console: '%clr(%d{yyyy-MM-dd} [%thread] %-5level %logger{50} - %msg%n)'
# 这里是文件的格式
# file: '%d{yyyy-MM-dd HH:mm:ss.SSS} >>> [%thread] >>> %-5level >>> %logger{50} >>> %msg%n'
# 指定配置文件(classpath = \src\main\resources目录 )
config:
classpath: logconfig.xml
# 避免重复打印
additivity: false
这里需要注意一下SpringBoot中的 classpath 就是 ( \src\main\resources 目录 )
\src\main\resources\logconfig.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--======================================= 本地变量 ======================================== -->
<!--在没有定义${LOG_HOME}系统变量的时候,可以设置此本地变量。提交测试、上线时,要将其注释掉,使用系统变量。 -->
<!-- <property name="LOG_HOME" value="D:/data/logs" /> -->
<!-- 应用名称:和统一配置中的项目代码保持一致(小写) -->
<property name="APP_NAME" value="base" />
<!--日志文件保留天数 -->
<property name="LOG_MAX_HISTORY" value="180" />
<!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径 -->
<!--应用日志文件保存路径 -->
<property name="LOG_APP_HOME" value="${catalina.home}/${APP_NAME}/app" />
<!--=========================== 按照每天生成日志文件:默认配置=================================== -->
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
</encoder>
</appender>
<!-- 按照每天生成日志文件:主项目日志 -->
<appender name="APP"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_APP_HOME}/base.%d{yyyy-MM-dd}.log
</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>${LOG_MAX_HISTORY}</MaxHistory>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{500} - %msg%n</pattern>
</encoder>
</appender>
<!--=============================== 定义各个框架的输出级别 ====================================== -->
<logger name="org.springframework">
<level value="WARN" />
</logger>
<logger name="org.apache.shiro">
<level value="WARN" />
</logger>
<logger name="freemarker">
<level value="WARN" />
</logger>
<logger name="org.hibernate">
<level value="WARN" />
</logger>
<logger name="org.hibernate.SQL">
<level value="DEBUG" />
</logger>
<root level="DEBUG">
<appender-ref ref="APP" />
<appender-ref ref="STDOUT" />
</root>
</configuration>
以上大概就是springboot日志的基本使用。
有好的建议,请在下方输入你的评论。