日志最主要的作用就是排除和定位问题。
除了发现和定位问题之外,日志还具有如下功能:
Spring Boot 项目在启动时默认就有日志输出,如下图:
以上内容就是 Spring Boot 输出的控制台日志信息。springboot默认能在控制台输入日志信息说明:
自定义打印日志实现步骤:
在程序中获取⽇志对象需要使⽤日志工厂 LoggerFactory
,如下代码所示:
// 1.得到日志对象
private static final Logger log= LoggerFactory.getLogger(UserController.class);
(日志工厂需要将每个类的类型传递进去,这样我们才知道⽇志的归属类,才能更⽅便、更直观的定位到问题类)
注意:Logger 对象是属于 org.slf4j 包下的
Slf4j是 springboot 中内置的日志框架,可以直接在程序中调用slf4j来输出日志
slf4j属于日志门面(相当于代理),日志实现其实是logback。(门面模式)
门面模式的优点:可以保证日志实现框架变化的情况下(比如从logback->log4j 1/2)时,开发者不必关注变化的细节,还是依旧使用slf4j这个代理来实现日志的打印,代码不必做出调整或调整很少,大大降低了开发的难度/复杂度。
@Controller
@ResponseBody
public class UserController {
// 1.得到日志对象
private static final Logger log= LoggerFactory.getLogger(UserController.class);
// 2.使用日志对象log打印日志
@RequestMapping("/sayhi")
public void sayHi(){
log.trace("我是trace");
log.debug("我是debug");
log.info("我是info");
log.warn("我是warn");
log.error("我是error");
}
}
在浏览器中访问了相应的路由地址后发现日志成功打印~ (springboot默认日志级别是info ,大于等于info级别的日志能成功打印,次日志级别可以手动更改)
⽇志的级别就是为了筛选符合⽬标的⽇志信息的。
有了⽇志级别之后就可以过滤⾃⼰想看到的信息了,⽐如设置⽇志级别为 error,那么就可以只看程序的报错⽇志了,对于普通的调试⽇志和业务⽇志就可以忽略了,从⽽节省开发者的信息筛选时间。
日志级别分为:
⽇志级别配置只需要在配置⽂件中设置“logging.level”配置项即可,如下所示:
(在application.yml 配置文件中进行配置,配置根路径的日志级别,设置了当前全局日志级别为error)
配置 controller 文件夹下的日志级别为 error :
此时访问相应路由只在控制台上输出级别为error的日志信息:
以上的⽇志都是输出在控制台上的,然⽽在⽣产环境上咱们需要将⽇志保存下来,以便出现问题之后追溯问题,把⽇志保存下来的过程就叫做持久化。
想要将⽇志进⾏持久化,只需要在配置⽂件中指定日志的存储⽬录或者是指定日志保存文件名之后,Spring Boot 就会将控制台的⽇志写到相应的⽬录或⽂件下了。
配置日志⽂件的保存路径:
此时去相应路径下查看:
日志持久化(保存到硬盘)成功;并且每次重启springboot项目日志信息是进行追加的,而不是重写的 ~
配置日志文件的⽂件名(一般实现是通过绝对路径(路径+文件名)的形式实现的):
因为每次都使用 LoggerFactory.getLogger(xxx.class)
很繁琐,且每个类都添加⼀遍,也很麻烦;我们还可以使用 lombok 来更简单的输出,解决上述的繁琐问题
基本步骤:
代码如下:
@Controller
@Slf4j
@ResponseBody
public class LombokController {
@RequestMapping("/log")
public void loggerTest(){
log.error("我是用lombok输出的error日志");
}
}
(注意:使用 @Slf4j 注解,在程序中使⽤ log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出,这是 lombok 提供的对象名)
基本注解:
注解 | 作用 |
---|---|
@Getter | 自动添加getter方法 |
@Setter | 自动添加setter方法 |
@ToString | 自动添加ToString方法 |
@EqualsAndHashCode | 自动添加equals和hashcode方法 |
@NoArgsConstructor | 自动添加无参构造方法 |
@AllArgsConstructor | 自动添加全属性构造方法,顺序按照属性的定义顺序 |
@NonNull | 属性不能为null |
@RequiredArgsConstructor | ⾃动添加必需属性的构造⽅法,final + @NonNull 的属性为必需 |
target 为项目最终执⾏的代码,查看 target ⽬录如下:
target目录下的为Java目录下的源代码经过编译后形成的能被jvm识别使用的 .class文件(字节码文件)
打开 刚刚使用过 @Slf4j 注解的LombokController 类的字节码文件如下:
(因为idea打开,所以字节码文件能够显示,其他软件打开就不一定能显示为Java代码了~)
Java 程序的运⾏原理:
Lombok作用的结果如下图 :
也就是说lombok在程序编译阶段就把相应注解变成了相应的对象,来执行相应的功能(比如这里的日志输出),然后把编译完成的class文件给jvm来进行加载运行 ~
lombok起作用的阶段就是程序的编译阶段(.java -> .class)