Spring日志

一.日志概述

1.为什么要学习日志

日志对于我们来说并不陌生,从JAVASE部分,我们就在使用System.out.print来打印日志了.通过打印日志来发现和定位问题,或者根据日志来分析程序的运行过程.在Spring的学习中,也经常根据控制台的日志来分析和定位问题

随着项目的复杂度提升,我们对日志的打印也有了更高的需求,而不仅仅是定位排查问题

比如需要记录一些用户的操作记录,也可能需要使用日志来记录用户的一些喜好,把日志持久化,后续进行数据分析等,但是System.out.print不能很好的满足我们的需求,我们就需要使用一些专门的日志框架

2.日志的用途

1.系统监控

监控现在几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,每一个方法的响应时间,响应状态等,对数据进行分析,设置不同的规则,超过阈值进行报警.比如统计日志中关键字的数量,并在关键字数量达到一定条件时报警,这也是日志的常见需求之一

2.数据采集

采集的数据可以作用在很多方面,比如数据统计,推荐排序等

3.日志审计

二.日志使用

SpringBoot项目在启动的时候默认就有日志输出

SpringBoot内置了日志框架Slf4j,我们可以直接在程序中调用Slf4j来输出日志

1.打印日志

打印日志的步骤:

1.在程序中得到日志对象.

private static Logger logger = LoggerFactory.getLogger(LoggerController.class);

LoggerFactory.getLogger需要传递一个参数,表示这个日志的名称,这样可以更清晰的知道是哪个类输出的日志,当有问题的时候,可以更方便直观的定位到问题类

注意Logger对象是属于org.slf4j包下的,不要导错包

2.使用日志对象输出要打印的内容.

java 复制代码
@RestController
public class LoggerController {
    private static Logger logger = LoggerFactory.getLogger(LoggerController.class);

    @RequestMapping("/logger")
    public String logger(){
        logger. info("------要输出的日志内容-----"")
        return"打印日志";
    }
}

2.日志框架

SLF4J不同于其他日志框架,他不是一个真正的日志实现,而是一个抽象层,对日志框架制定的一种规范标准,接口,所有SLF4J并不能独立使用,需要和具体的日志框架配合使用

门面模式

SLF4J门面模式的典型应用(但不仅仅使用了门面模式)

门面模式的定义

门面面试(Facade Pattern) 又称之为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口,其主要特征是定义了一个高层接口,让子系统更容易使用

门面模式主要包含了两种角色:

1.外观角色(Facade):也称门面角色,系统统一对外的统一接口

2,子系统角色(SubSystem):可以同时有一个或者多个SubSystem,每个Substem都是不是一个单独的类,而是一个类的集合,SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对SubSystem透明)

门面模式的实现:

场景:回家,我们会打开各个屋的灯,离开家的时候,会关闭各个屋的灯

如果有一个总开关,来控制整个屋的灯就会很方便

我们可以使用门面模式来实现

我们可以先设置一个外观角色.让他对外提供开灯关灯的方法,我们在使用的时候直接调用这个client的on和off方法即可

接下来我们设置子系统角色

由于所有的地方的灯都具有一些相同的功能,我们可以把这些相同的功能抽出一个接口

这个时候我们就可以修改外观角色的代码

门面模式的优点:

1.减少了系统的相互依赖,实现了客户端与子系统的耦合关系,这使得子系统的变化不会影响到调用它的客户端

2.提高了灵活性,简化了客户端对子系统的使用难度,客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可

3.提高了安全性,可以灵活设定访问权限,不在门面对象中开通方法,就无法访问

门面模式是设计模式的一种,设计模式重思想轻代码的实现

SLF4J框架介绍

SLF4J就是其他日志框架的门面,SLF4J可以理解为提供日志服务的统一API接口,并不涉及到具体的日志逻辑实现

不引入日志门面

常用的日志框架有log4J,logback等,如果一个项目已经使用log4j,而你依赖的另一个类库,假如是Apache Active MQ,他依赖于另一个日志框架,那么你就需要把logback也加载进去

存在问题:

1.不同日志框架的API接口和配置文件不同,如果多个日志框架同时存在,那么不得不维护多套配置文件(这个配置文件是指用户自定义的配置文件)

2.如果要更换日志框架,应用程序将不得不修改代码,并且修改过程中可能会存在一些代码冲突

3.如果引入的第三方框架,使用了多套,那么就不得不维护多套配置

引入日志门面

引入日志门面框架之后,应用程序和日志框架之间有了统一的API接口,此时应用程序只需维护一套日志文件配置,且当底层实现框架改变的时候,也不许啊哟更改应用程序代码

日志级别

日志的级别从高到低依次为:FATAL,ERROR,WARN,INFO,DEBUG,TRACE

FATAL:致命信息,表示需要立即被处理的系统级错误

ERROR:错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行

WARN:警告信息,不影响使用,但需要注意的问题

INFO:普通信息,用于记录应用程序正常运行的一些信息,例如系统启动完成,请求处理完成等

DEBUG:调试信息,需要调试的时候的关键信息打印

TRACE:追踪信息,比debug更细粒度的信息事件

默认低于info不打印

日志配置

1.配置日志级别

日志级别配置只需要在配置文件中设置"logging.level"配置项即可,如下所示:

logging.level.root=debug

2.日志持久化

我们之前见的日志都是在控制台上的,然而在线上环境中,我们需要把日志保存下来,以便出现问题之后追溯问题,把日志保存下来叫持久化

日志持久化有两种方式:

1.配置日志文件名

logging.file.name=logger/springboot.log

2.配置日志的存储目录

logging.file.path=D:/temp

如果这两个配置同时存在,以logging.file.name为主

3.日志文件分割

如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,需要对日志文件进行分割

|--------------------------------------------------|------------------|----------------------------------|
| 配置项 | 说明 | 默认值 |
| logging.logback.rollingpolicy.fil e-name-pattern | 日志分割后的文件名 格式 | ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz |
| logging.logback.rollingpolicy.m ax-file-size | 日志文件超过这个大 小就自动分割 | 10MB |

4.日志格式配置

|-------------------------|-----------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 配置项 | 说明 | 默认值 |
| Logging.pattern.console | 控制台日志格式 | %clr(%d{{LOG_DATEFORMAT_PATTERN :- yyyy-MM-dd'T'HH:mm:ss.SSSXXX}}){faint}%clr({LOG_LEVEL_PATTERN :-%5p}) %clr({PID :- }){magenta} %clr( --- ){faint} %clr(\[%15.15t\]) {faint} %clr(%-40.40logger{39}){cyan}%clr(:){faint} %m%n{LOG_EXCEPTION_CONVERSION_WORD :- %wEx} |
| logging.pattern.file | 日志文件的日志格式 | %d{{LOG_DATEFORMAT_PATTERN :- yyyy-MM- dd'T'HH:mm:ss.SSSXXX}} {LOG_LEVEL_PATTERN :- %5p} {PID :- } --- \[%t\] %-40.40logger(39}: %m%n{LOG_EXCEPTION_CONVERSION_WORD :- %wEx} |

配置项说明

1.%clr(表达式){颜色} 设置输入日志的颜色

  1. %d{${LOG_DATEFORMAT_PATTERN :- yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} 日期和时间 -- 精确到毫 秒

3.%5p显示日志级别ERROR,MARN,INFO,DEBUG,TRACE

三.更简单的日志输出

每次使用LoggerFactory.getLogger(xx.class)很繁琐,且每个类都添加一遍,很麻烦,lombok给我们提供了一种更加简单的方式

1.添加lombok框架支持

2,使用@slf4j注解输出日志

相关推荐
牛油果子哥q1 小时前
【C++ STL vector】C++ STL vector 终极精讲:动态数组底层原理、两倍扩容机制、迭代器失效、增删查改、性能剖析与工程避坑指南
开发语言·c++
IT空门:门主1 小时前
Spring 注入三剑客:@Resource、@Autowired、@RequiredArgsConstructor 到底该用哪个?
java·后端·spring
贩卖黄昏的熊1 小时前
flex 布局快速梳理
开发语言·javascript·css3·html5
Sam_Deep_Thinking1 小时前
Spring Boot 的启动原理是什么?
java·spring boot·后端
南部余额2 小时前
Spring WebClient 从入门到精通
java·后端·spring
天天进步20152 小时前
Python全栈项目--校园智能宿舍管理系统
开发语言·python
CodeStats2 小时前
从 CPU 指令到 JVM 进程:彻底讲透 Java 执行 main 方法时,类加载、主线程、栈帧入栈的完整底层逻辑
java·linux·开发语言
摇滚侠2 小时前
Spring 零基础入门到进阶 基于注解管理 Bean 38-43
xml·java·后端·spring·intellij-idea