目录
1.日志的作用
⽇志是程序的重要组成部分,想象⼀下,如果程序报错了,不让你打开控制台看⽇志,那么你能找到报错的原因吗?
答案是否定的,写程序不是买彩票,不能完全靠猜,因此⽇志对于我们来说,最主要的⽤途就是排除和定位问题。
除了发现和定位问题之外,我们还可以通过⽇志实现以下功能:
● 记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。
● 记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。
● 记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持。
以上这些都是⽇志提供的⾮常实⽤的功能。
2.日志怎么用
Spring Boot 项⽬在启动的时候默认就有⽇志输出,如下图所示:
以上内容就是 Spring Boot 输出的控制台⽇志信息。
通过上述⽇志信息我们能发现以下 3 个问题:
● Spring Boot 内置了⽇志框架(不然也输出不了⽇志)。
● 默认情况下,输出的⽇志并⾮是开发者定义和打印的,那开发者怎么在程序中⾃定义打印⽇志呢?
● ⽇志默认是打印在控制台上的,⽽控制台的⽇志是不能被保存的,那么怎么把⽇志永久的保存下来
呢?
下⾯我们⼀起来找寻这些问题的答案。
3.自定义打印日志
开发者⾃定义打印⽇志的实现步骤:
●在程序中得到⽇志对象。
●使⽤⽇志对象的相关语法输出要打印的内容。
接下来我们分别来看。
3.1在程序中得到日志对象
在程序中获取⽇志对象需要使⽤⽇志⼯⼚ LoggerFactory,如下代码所示:
private Logger logger= LoggerFactory.getLogger(LoginController.class);
⽇志⼯⼚需要将每个类的类型传递进去,这样我们才知道⽇志的归属类,才能更⽅便、更直观的定位到问题类。
注意:Logger 对象是属于 org.slf4j 包下的,不要导⼊错包。
因为 Spring Boot 中内置了⽇志框架 Slf4j,所以咱们可以直接在程序中调⽤ slf4j 来输出⽇志。
常见的日志框架:
常用的日志框架:SLF4J,log4j,logback
3.2使用日志对象打印日志
⽇志对象的打印⽅法有很多种,我们可以先使⽤ info() ⽅法来输出⽇志,如下代码所示:
logger.info("第一条日志信息");
3.3日志格式说明
4.日志级别
4.1日志级别有什么用
⽇志级别可以帮你筛选出重要的信息,⽐如设置⽇志级别为 error,那么就可以只看程序的报错日志了,对于普通的调试日志和业务日志就可以忽略了,从而节省开发者信息筛选的时间。
日志级别可以控制不同环境下,一个程序是否需要打印日志,
如开发环境我们需要很详细的信息, 而生产环境为了保证性能和安全性就会少输入日志,
⽽通过⽇志的级别就可以实现此需求。
4.2日志级别的分类及使用
日志的级别分类为:
●trace:微量,少许的意思,级别最低;
●debug:需要调试时候的关键信息打印;
●info:普通的打印信息(默认⽇志级别);
●warn:警告,不影响使⽤,但需要注意的问题;
●error:错误信息,级别较⾼的错误⽇志信息;
●fatal:致命的,因为代码异常导致程序退出执⾏的事件。
日志级别的顺序:
越往上接收到的消息就越少,如设置了 warn 就只能收到 warn、error、fatal 级别的⽇志了。
日志级别设置:
⽇志级别配置只需要在配置⽂件中设置“logging.level”配置项即可,如下所示:
logging:
level:
root: info
配置根路径的日志级别。
@Controller
public class LoginController {
private Logger logger= LoggerFactory.getLogger(LoginController.class);
@PostConstruct
private void postConstruct(){
logger.info("第一条日志信息");
logger.debug("debug");
logger.warn("warn");
logger.trace("日志信息");
logger.error("error");
}
@RequestMapping("/log")
public String loh(){
logger.info("第一条日志信息");
return "log……";
}
}
最后的结果发现,有两条日志没有打印出来,这是因为Spring Boot的默认日志级别是info,低于info级别的不会打印,高于info级别的才会打印。
4.2分目录打印日志
需求:系统日志打印warn日志,业务日志打印debug级别
logging:
level:
root: warn
com.example.springbootdemo1: debug
5.日志持久化
以上的⽇志都是输出在控制台上的,然⽽在⽣产环境上咱们需要将⽇志保存下来,以便出现问题之后追溯问题,把⽇志保存下来的过程就叫做持久化。
想要将⽇志进⾏持久化,只需要在配置⽂件中指定⽇志的存储⽬录或者是指定⽇志保存⽂件名之后,Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了。
配置⽇志⽂件的保存路径:
logging:
file:
path: D:\temp\
执行结果:
该文件路径下自动生成了一个日志文件。
当我们再执行一次程序,再打开这个日志文件:
通过结果可以发现:日志文件是追加的形式,如果每启动一次项目就要追加日志文件的话,这个文件会越来越大,最后会不可读。
可以通过设置文件的大小来解决:
logging:
logback:
rollingpolicy:
max-file-size: 2KB
文件大小超过2kb就会分割
设置日志名称:
logging:
file:
name: springboot.log
可以同时设置日志路径+名称
logging:
file:
name: D:\temp\springboot.log
6.更简单的日志输出---lombok
每次都使⽤ LoggerFactory.getLogger(xxx.class) 很繁琐,且每个类都添加⼀遍,也很麻烦,这⾥讲⼀种更好⽤的⽇志输出⽅式,使⽤ lombok 来更简单的输出。
1.添加lombok框架支持。
2.
使⽤ @slf4j 注解输出⽇志。
6.1添加lombok依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
6.2输出日志
@Slf4j
@Controller
public class LoginController2 {
@PostConstruct
private void postConstruct(){
log.info("第一条日志信息");
log.debug("debug");
log.warn("warn");
log.trace("日志信息");
log.error("error");
}
}
注意:使⽤ @Slf4j 注解,在程序中使⽤ log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出,这是 lombok 提供的对象名。
6.3lombok原理解释
lombok 能够打印⽇志的密码就在 target ⽬录⾥⾯,target 为项⽬最终执⾏的代码,查看 target ⽬录如下:
@Controller
public class LoginController2 {
private static final Logger log = LoggerFactory.getLogger(LoginController2.class);
public LoginController2() {
}
@PostConstruct
private void postConstruct() {
log.info("第一条日志信息");
log.debug("debug");
log.warn("warn");
log.trace("日志信息");
log.error("error");
}
public void lomokTest() {
User user = new User();
user.setName("zhangsan");
}
}
查看class文件可以看到,class文件中,没有@Slf4j注解,相对的,多出了一行log对象的定义。
Java程序的运行原理:
lombok的作用如下图所示:
6.4lombok更多注解说明
基本注解:
组合注解:
日志注解: