我正在参加「掘金·启航计划」
一、日志的作用
日志的主要作用就是排除和定位问题。
除了 发现和定位问题 之外,还可以通过日志实现以下功能:
- 记录用户登录日志,方便分析用户是正常登录还是恶意破解用户。
- 记录系统的操作日志,方便数据恢复和定位操作人。
- 记录程序的执行时间,方便为以后优化程序提供数据支持。
二、日志怎么用
Spring Boot 项目在启动的时候默认就有日志输出,如下图所示:
以上内容就是 Spring Boot 输出的控制台日志信息。
通过上述日志信息我们能发现以下 3 个问题:
- Spring Boot 内置了日志框架(不然也输出不了日志)。
- 默认情况下,输出的日志并非是开发者定义和打印的,那开发者怎么在程序中自定义打印日志呢?
- 日志默认是打印在控制台上的,而控制台的日志是不能被保存的,那么怎么把日志永久的保存下来 呢?
下面我们一起来找寻这些问题的答案。
三、自定义日志打印
开发者自定义打印日志的实现步骤:
- 在程序中得到日志对象。
- 使用日志对象的相关语法输出要打印的内容。
3.1 在程序中获取日志对象
在程序中获取日志对象需要使用日志工厂 LoggerFactory,如下代码所示:
public class UserController {
// 1. 得到日志对象
private static final Logger logger = LoggerFactory.getLogger(UserController.class); // 括号里面是类的类型
}
日志工厂需要将每个类的类型传递进去,这样我们才知道日志的归属类,才能更方便、更直观的定位 到问题类。
注意: Logger 对象 是属于 org.slf4j 包下的,不要导入错包。
因为 Spring Boot 中内置了日志框架 Slf4j,所以咱们可以直接在程序中调用 slf4j 来输出日志。
3.2 使用日志对象打印日志
日志对象的打印方法有很多种,我们可以先使用 info() 方法来输出日志,如下代码所示:
// 2.使用日志打印日志
logger.info("info 信息");
打印日志效果展示:
\
3.3 日志格式说明
\
四、日志级别
4.1 什么是日志级别
日志的级别就是为了筛选符合目标的日志信息的。
有了日志级别之后就可以过滤自己想看到的信息了,比如设置日志级别为 error,那么就可以只看程序的报错日志了,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者的信息筛选时间。
4.2 日志级别的分类与使用
分类
日志级别分为:
- trace:微量,少许的意思,级别最低;
- info:普通的打印信息;
- debug:需要调试时候的关键信息打印;
- warn:警告,不影响使用,但需要注意的问题;
- error:错误信息,级别较高的错误日志信息;
- fatal:致命的,因为代码异常导致程序退出执行的事件。(一般不会让开发者自定义的)
日志级别的顺序:
越往上接收到的消息就越少。
\
默认日志输出级别:默认是 info.
程序无法打印出比当前日志输出级别更低的日志,如果没有指定日志输出级别,则默认info
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.trace("trace 信息");
logger.debug("debug 信息");
只能打印出 info、warn 和 error 的日志信息:
使用
@Controller
@ResponseBody
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
@RequestMapping("/sayhi")
public void sayHi() {
logger.info("info 信息");
logger.warn("warn 信息");
logger.error("error 信息");
logger.trace("trace 信息");
logger.debug("debug 信息");
}
}
在配置文件里配置,此处使用 application.properties 文件配置
- 设置全局的日志级别
logging.level.root=trace
演示结果:可以看出 trace 以及trace以上级别的日志信息都被打印出来了
\
- 设置局部文件夹日志级别
// 此处设置全局日志级别为 info
logging.level.root=info
// 设置局部文件夹日志级别
logging.level.com.example.demo.controller=trace
此包低下的所有类的日志级别都会被设置为 trace:
演示结果:只有 UserController 类的日志级别被设置为了 trace,其他的类不影响
\
注意:
当存在局部日志级别和全局日志级别设置时,那么当访问局部日志时,使用的是局部日志级别。
即, 局部日志级别优先级 > 全局日志级别。
五、日志持久化
以上的日志都是输出在控制台上的,然而在生产环境上咱们需要将日志保存下来,以便出现问题之后追溯问题,把日志保存下来的过程就叫做持久化。
想要将日志进行持久化,只需要在配置文件中指定日志的存储目录或者是指定日志保存文件名之后, Spring Boot 就会将控制台的日志写到相应的目录或文件下了。
- 配置日志文件的保存路径(不指定文件名,springboot会默认将文件命名为
spring.log)
# 设置日志文件目录
logging.file.path=E:\ // 也可以使用 Linux 的目录符号:E:/
演示结果:
打开 log 文件可以看到:
\
- 配置日志文件的文件名(文件名以
.log为后缀)
# 设置日志文件的文件名
logging.file.name=E:/mylog.log
演示结果:
内容上跟上面的一样。
注意:日志的内容是可以追加的,即下次的日志内容会追加在上次日志内容的后面。
但是这会出现一个问题:当追加的日志文件太太,打开的速度和阅读的难读就会加大,该怎么办?
日志文件的默认的最大容量为:10MB,也可以通过配置文件进行设置:
如果一个文件大小超出了最大容量,则自动创建类似 ××1.log、 ××2.log的文件,对日志的内容作自动的分割。
如文件夹下可能出现下面的日志文件:mylog1.log、mylog2.log。
\
\
六、更简单的日志输出 -- lombok
每次都使用 LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加一遍,也很麻烦,这里讲一 种更好用的日志输出方式,使用 lombok 来更简单的输出。
- 添加 lombok 框架支持。
- 使用
@slf4j注解输出日志。
6.1 添加依赖
可以在 pom.xml文件中,右击选择generate
选择第一个(要安装插件 editstarts)
选择OK
选择 lombok(此处我已经安装过了,所以显示的是灰色的)
选择 OK即可。
此处为 lombok 的依赖:
\
6.2 输出日志
- 使用
@Slf4j注解,在程序中使用 log 对象即可输入日志,并且只能使用 log 对象才能输出,这 是 lombok 提供的对象名
@Controller
@Slf4j // 获取log对象
@ResponseBody
public class UserServer {
@RequestMapping("/sayhi2")
public void sayHi2() {
log.info("info 信息");
log.warn("warn 信息");
log.error("error 信息");
log.trace("trace 信息");
log.debug("debug 信息");
}
}
演示结果:
\
6.3 lombok 原理解释
ombok 能够打印日志的密码就在 target 目录里面,target 为项目最终执行的代码,查看 target 目录如下:
Java 程序的运行原理:
lombok 的作用如下图:
\
6.4 lombok 更多注解说明
基本注解
| 注解 | 作用 |
|---|---|
| @Getter | 自动添加 getter 方法 |
| @Setter | 自动添加 setter 方法 |
| @ToString | 自动添加 toString 方法 |
| @EqualsAndHashCode | 自动添加 equals 和 hashCode 方法 |
| @NoArgsConstructor | 自动添加无参构造方法 |
| @AllArgsConstructor | 自动添加全属性构造方法,顺序按照属性的定义顺序 |
| @NonNull | 属性不能为 null |
| @RequiredArgsConstructor | 自动添加必需属性的构造方法,final + @NonNull 的 属性为必需 |
组合注解
| 注解 | 作用 |
|---|---|
| @Data | @Getter + @Setter + @ToString + @EqualsAndHashCode + @RequiredArgsConstructor +@NoArgsConstructor |
日志注解
| 注解 | 作用 |
|---|---|
| @Slf4j | 添加一个名为 log 的日志,使用 slf4j |