一、日志的作用
⽇志是程序的重要组成部分,通过查看日志,排除和定位程序出现的问题。
日志的实用功能,举个例子:
记录⽤户登录⽇志,⽅便分析⽤户是正常登录还是恶意破解⽤户。.
记录系统的操作⽇志,⽅便数据恢复和定位操作⼈。
记录程序的执⾏时间,⽅便为以后优化程序提供数据⽀持
二、了解日志
以上内容为Spring Boot 输出的控制台日志信息
通过上述信息可以发现:
1.Spring Boot内置日志框架。
2.默认情况,输出的日志并非开发者定义打印,需要掌握自定义日志打印。
3. 日志默认打印在控制台,不能被保存,我们需要永久保存。
2.1 自定义日志打印
⾃定义打印⽇志的实现步骤:
1.在程序中得到⽇志对象。
获取日志对象需要使用日志工厂 LoggerFactory,
//1.得到日志对象
private static Logger logger=
LoggerFactory.getLogger(TestController.class);
日志对象需要将每个类的类型传递进去,这样可以看到日志的归属类,才能更方便直观的定位到问题类。
注:Logger对象属于 org.slf4j包下,请勿导错
常见日志框架说明:
2.使⽤⽇志对象的相关语法输出要打印的内容。
如下代码:
//2.使用日志打印日志
@RequestMapping("/HI")
public String Hi(){
//打印日志的方法
log.trace("我是trace");
log.debug("我是debug");
log.info("我是info");
log.warn("我是warn");
log.error("我是error");
return "Hello World";
}
当我们运行的时候,却发现 日志并没有打印我们自定义的东西,如何让这些日志出现呢?
我们要进浏览器访问:
成功进入页面的时候这时候,我们的自定义日志开始打印了:
所谓自定义日志就是当我们访问到请求调用日志这个方法后日志才会出现。当浏览器访问调用方法的时候,该方法相关设定的日志也会出来打印。
2.2 日志的格式说明
三、日志级别
3.1 日志级别的作用
1.节省Debug时间,日志级别可以筛选出有用信息比如设置日志级别为error,就可以只看程序的报错日志,普通的调试日志可以忽略。
2.日志级别可以控制不同环境下,管理程序是否打印日志,保证开发者对不同场景下日志数量的控制,比如:开发环境需要详细日志,生产环境为了保证性能与安全性就输入少量日志。
3.2 日志级别的分类与使用
日志的级别分为:
trace:微量,少许的意思,级别最低
debug:需要调试时候的关键信息打印;
info:普通的打印信息(默认⽇志级别);
warn:警告,不影响使⽤,但需要注意的问题;
error:错误信息,级别较⾼的错误⽇志信息;
fatal:致命的,因为代码异常导致程序退出执⾏的事件。
日志顺序级别:
越往上接受到的消息就越少,例如设置了 warn就只能收到 warn,error,fatal级别的日志。
日志级别设置:
日志的输出级别,默认是info
日志级别配置只需要在配置文件application.properties中设置“logging.level”配置项即可
配置路径跟日志级别:
#自定义日志级别
logging.level.root=error
#指定路径root表示根路径,error表示日志等级
# 对controller 目录设置一个级别
longing.level.com.example.demo.controller=trace
# 它们不会冲突,除了 com.example.demo.controller 下为 trace,其它地方都为error。
@RestController
@RequestMapping("/user")
public class UserController {
//1.得到日志对象
private static Logger logger=
LoggerFactory.getLogger(UserController.class);
@Value("${server.port}")
private String port;
@Value("${spring.datasource.url}")
private String url;
@RequestMapping("/sayhi")
public String sayHi(){
// 2.使⽤⽇志打印⽇志
logger.trace("---trace----");
logger.debug("--debug--");
logger.info("--info--");
logger.warn("--warn--");
logger.error("--error--");
return "HI," +url;
}
}
四、日志持久化
在⽣产环境上需要将⽇志保存下来,以便出现问题之后追溯问题,把⽇志保存下来的过程就叫做持久化。
想要日志持久化:需要在配置文件中指定日志的存储目录或指定日志保存文件名之后,Spring Boot 就会将控制台的日志写到相应的目录或文件下。
配置日志文件的保存路径:
#设置日志文件的目录
logging:file:path:D:\\home
当我多次访问接口方法,日志的内容不会被覆盖,他会在后面追加。
配置日志文件的文件名:
#设置日志文件的文件名,注意这里是 name 属性
logging:file:name:D:\\home\\myspring.log
现在还有一个问题,如果程序运行时间周期很长(比如生产环境),那么日志一定是非常多的,用一个文件来存储显然不现实,那么如何让它自动地分成多个文件呢?
可以设置日志文件存储大小的最大容量
# 假如我设置日志大小的最大容量为 1KB(一般不会这么小,这里用于演示)
logging.logback.rollingpolicy.max-file-size=1KB
复制代码
这个配置项用于指定一个日志文件的最大大小,支持的单位包括 KB、MB、GB 等。,当日志文件达到指定大小后,将自动创建一个新的日志文件来继续记录日志信息,我以上面的代码为例,我经过多次请求后:
五、更简单的日志输出-lombok
每次都用LoggerFactory.getLogger(xxx.class) 很繁琐,Lombok更我们简化了日志输出方式
1.添加 lombok框架支持
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>
2.输出日志
@RestController
@RequestMapping("/p")
@Slf4j
public class PersonController {
@RequestMapping("/log")
public void loggerTest() {
log.error("------------------- error -----------------");
}
}
注意:使⽤ @Slf4j 注解,在程序中使⽤ log 对象即可输⼊⽇志,并且只能使⽤ log 对象才能输出,这是 lombok 提供的对象名.
3. lombok 原理解释
JAVA程序的运行原理如下图:
Lombok 的作⽤如下图:
target为项目最终执行的代码,通过查看target目录,可知lombok会在项目编译前生成最终我们类似于LoggerFactory.getLogger(xxx.class) 的 源码,就是他自动的帮我们填写好了源码,方便我们书写。并不会对性能造成影响。
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 |
六、总结
⽇志是程序中的重要组成部分,使⽤⽇志可以快速的发现和定位问题,
Spring Boot 内容了⽇志框架,默认情况下使⽤的是 info ⽇志级别将⽇志输出到控制台的,
我们可以通过 lombok 提供的 @Slf4j 注解和 log 对象快速的打印⾃定义⽇志,
⽇志包含 6 个级别:
trace:微量,少许的意思,级别最低;
debug:需要调试时候的关键信息打印;
info:普通的打印信息;
warn:警告,不影响使⽤,但需要注意的问题;
error:错误信息,级别较⾼的错误⽇志信息;
fatal:致命的;
因为代码异常导致程序退出执⾏的事件。⽇志级别依次提升,⽽⽇志界别越⾼,收到的⽇志信息也就越少,我们可以通过配置⽇志的保存名称或保存⽬录来将⽇志永久地保存下来