JavaEE进阶:SpringBoot日志
1.日志概述
对于日志,相信我们大家都不陌生了,从学习Java到现在,我们都在用System.out.print来打印日志,通过打印日志来定位和发现问题.
随着项目的复杂度的不断提升,我们对打印日志也有了更高的需求,这时候就需要去用一些专门的日志框架.
日志的用途:
1.系统监控
监控现在几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,每一个方法的响应时间,响应状态等,对数据进行分析,设置不同的规则,超过阈值时进行报警。
比如统计日志中关键字的数量,并在关键字数量达到一定条件时报警,这也是日志的常见需求之一
2.数据采集
数据采集是一个比较大的范围,采集的数据可以作用在很多方面,比如数据统计,推荐排序等..
数据统计:统计页面的浏览量 (PV), 访客量 (UV), 点击量等,根据这些数据进行数据分析,优化公司运营策略
推荐排序:目前推荐排序应用在各个领域,我们经常接触的各行各业很多也都涉及推荐排序,比如购物,广告,新闻等领域。
数据采集是推荐排序工作中必须做的一环,系统通过日志记录用户的浏览历史,停留时长等,算法人员通过分析这些数据,训练模型,给用户做推荐.
3. 日志审计
随着互联网的发展,众多企业的关键业务越来越多的运行于网络之上.
网络安全越来越受到大家的关注, 系统安全也成为了项目中的一个重要环节, 安全审计也是系统中非常重要的部分.
国家的政策法规、行业标准等都明确对日志审计提出了要求. 通过系统日志分析,可以判断一些非法攻击, 非法调用,以及系统处理过程中的安全隐患.
2.日志使用
SpringBoot项目在启动的时候,就默认有日志输出.
我们通过System.out.print打印的日志比SpringBoot打印的日志少了很多信息.
SpringBoot内置了日志框架slf4j,我们可以直接在程序中调用slf4j来输出日志.
2.1 打印日志
在程序中获取日志对象,需要使用日志工厂LoggerFactory.
private static Logger logger = LoggerFactory.getLogger(LogController.class);日志对象的打印方法有很多,我们可以先试用info()方法来打印.
@RestController public class LogController { private static Logger logger = LoggerFactory.getLogger(LogController.class); @RequestMapping("/printLog") public String logger(){ logger.info("----------打印日志-----------"); return "日志打印成功"; } }3.日志格式
1.时间日期:精确到毫秒
2.日志级别:ERROR,WARN,INFO,DEBUG,TRACE
3.进程ID
4.线程名称
5.Logger名(通常使用源代码类名)
6.日志内容
4.日志级别
日志级别从高到低依次为:FATAL,ERROR,WARN,INFO,DEBUG,TRACE
FATAL: 致命信息,表示需要立即被处理的系统级错误。
ERROR: 错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行。
WARN: 警告信息,不影响使用,但需要注意的问题
INFO: 普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等。
DEBUG: 调试信息,需要调试时候的关键信息打印。
TRACE: 追踪信息,比 DEBUG 更细粒度的信息事件 (除非有特殊用意,否则请使用 DEBUG 级别替代)
日志级别是开发人员自己设置的,开发人员根据自己的理解来判断该信息的重要程度.
针对不同级别,Logger对象分别提供了对应的方法来输出日志.
@RequestMapping("/printLog1") public String logger1(){ logger.trace("----------trace-----------"); logger.debug("----------debug-----------"); logger.info("----------info-----------"); logger.warn("----------warn-----------"); logger.error("----------error-----------"); return "日志打印成功"; }运行程序,我们可以发现,只打印了三条日志,trace,debug级别的日志并没有被打印出来.
这个和日志级别的配置有关,日志的输出级别默认是info级别,所以智慧打印大于等于此级别的日志.
5.日志配置
5.1 配置日志级别
日志级别的配置只需要在配置文件中设置logging.level配置项即可.
设置为debug之后再次运行程序.
5.2 日志持久化
以上这些日志都是输出在控制台上的,然而在线上环境中,我们需要把日志保存下来,以便出现问题之后追溯问题,把日志保存下来,就叫日志的持久化.
日志的持久化有两种方式.
1.配置日志文件名
2.配置日志的存储目录.
配置日志文件的路径和文件名:
properties配置:
logging.file.name=logger/springboot.logyml配置:
logging: file: name: logger/springboot.log运行程序,就会发现出现了一个新的包,里面记录了日志
配置日志文件的保存路径:
这里注意,这两种日志方式只能选择一种使用.
properties配置:
logging.file.path=D:/springboot/loggeryml配置:
logging: file: path: D:/springboot/logger配置完成之后运行程序就会出现这个文件夹
5.3 配置日志文件分割
如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,所以我们需要对日志文件进行分割.
日志框架当然也考虑到了这一点,如果我们不进行配置,默认日志文件超过10M就进行分割,
properties配置:
logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i logging.logback.rollingpolicy.max-file-size=1KByml配置:
logging: logback: rollingpolicy: max-file-size: 1KB file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i配置完成,循环打印日志,看看效果.
5.4 配置日志格式
目前日志打印的格式是默认的,打印日志的格式也是支持配置的.支持控制台和日志文件分别设置.
通常情况下,我们使用默认的日志格式打印即可.
6.更简单的日志输出
每次使用LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都添加一遍,lombok给我们提供了一种更简单的方式.使用@slf4j注解添加日志
6.1 添加lombok依赖
6.2 输出日志
在类上添加@slf4j注解.这个注解会给我们提供一个log对象,我们直接使用就可以.
运行程序,就可以打印日志了
7.总结
1.日志是程序中的重要组成部分,使用日志可以快速的发现和定位问题,
Spring Boot 内容了日志框架,默认情况下使用的是 info 日志级别将日志输出到控制台的,我们可以通过lombok 提供的 @Slf4j注解和 log 对象快速的打印自定义日志。
2.日志包含 6 个级别,日志级别越高,收到的日志信息也就越少,我们可以通过配置日志的保存名称或保存目录来将日志持久化
