javaEE-SpringBoot日志

一.日志的用途

平时我们使用日志,就是通过控制台打印一些信息,或者程序运行保存,查看控制台报错原因.

随着项⽬的复杂度提升, 我们对⽇志的打印也有了更⾼的需求, ⽽不仅仅是定位排查问题.

⽐如需要记录⼀些⽤⼾的操作记录 (⼀些审计公司会要求), 也可能需要使⽤⽇志来记录⽤⼾的⼀些喜好, 把⽇志持久化, 后续进⾏数据分析等. 但是 System.out.print 不能很好的满⾜我们的需求, 我们就需要使⽤⼀些专⻔⽇志框架来实现这些功能.

1.系统监控:

通过日志记录系统的运行状态.

每⼀个⽅法的响应时间, 响应状态等, 对数据进⾏分析, 设置不同的规则, 超过阈值时进⾏报警. ⽐如统计⽇志中关键字的数量,并在关键字数量达到⼀定条件时报警.

2.数据采集:

数据采集是一个很大的范围,可以作⽤在很多⽅⾯, ⽐如数据统计, 推荐排序等.

数据统计: 统计⻚⾯的浏览量(PV), 访客量(UV), 点击量等, 根据这些数据进⾏数据分析, 优化公司运营策略.

推荐排序: ⽬前推荐排序应⽤在各个领域, 我们经常接触的各⾏各业很多也都涉及推荐排序, ⽐如购物, ⼴告, 新闻等领域. 数据采集是推荐排序⼯作中必须做的⼀环, 系统通过⽇志记录⽤⼾的浏览历史, 停留时⻓等, 算法⼈员通过分析这些数据, 训练模型, 给⽤⼾做推荐.

3.日志审计

随着互联⽹的发展,众多企业的关键业务越来越多的运⾏于⽹络之上. ⽹络安全 越来越受到⼤家的关注,系统安全也成为了项⽬中的⼀个重要环节, 安全审计也是系统中⾮常重要的部分. 国家的政策法规、⾏业标准等都明确对⽇志审计提出了要求. 通过系统⽇志分析,可以判断⼀些⾮法攻击, ⾮法调⽤,以及系统处理过程中的安全隐患.

二.日志的使用

springboot项目在启动的时候,就有日志打印,这些日志和代码中通过System.out.print打印的日志有什么不同呢?

可以看到启动时打印的日志记录了很多信息,而自己通过System.out.print打印的日志就非常简单了.

springBoot内置了日志框架 slf4j.

我们自己通过代码可以调用slf4j来输出日志.

打印日志步骤:

1.获取日志对象,

获取日志对象时,要通过日志工厂来创建,注意要导入org.slf4j包,不要导错.

复制代码
LoggerFactory.getLogger()要传递一个参数,用来标识这个类的名称,代表哪个类打印的日志,可以更方便定位到问题.

2.使用日志对象打印日志

java 复制代码
package com.springlogger.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/logger")
public class LoggerController {
    private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
    @RequestMapping("/get")
    public String getLogger(){
//日志对象的打印方式有很多种,这里先用info()方法打印
        logger.info("日志信息");
        System.out.println("控制台信息");
        return "success";
    }
}

访问一下浏览器,让方法被执行,就能看到控制台的日志信息了.

三.日志框架的介绍

slf4j包 并不是实现了日志框架,而是一个接口,通过一些类实现了日志框架.

slf4j 是⼀个抽象层, 对⽇志框架制定的⼀种规范, 标准, 接⼝. 所有SLF4J并不能独⽴使⽤, 需要和具体的⽇志框架配合使⽤

日志的实现有: log4j1.log4j2,JUL,logback.

springboot 的日志是由logback框架实现的.

四.门面模式

slf4j就是门面模式的典型用例.

门面模式:(Facade Pattern)⼜称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口. 就是定义了一个高层级别的接口,让子系统使用更方便.

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

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

2.子系统角色:(SubSystem) 可以同时有一个或多个子系统角色,子系统角色不是一个类,而是一个类的集合.子系统角色并不知道门面角色的存在,对子系统来说,外观角色只是一个客户端.

未引入日志门面时存在的问题:

1.不同的日志框架的API和配置文件是不相同的,当多套日志框架同时存在,就要维护多套日志框架的配置文件(指用户自定义的配置文件).

2.当要更换日志框架时,要修改代码,修改时可能会产生代码冲突.

**3.**如果引⼊的第三⽅框架,使⽤了多套,那就不得不维护多套配置

++门面模式的优点:++

1.减少了系统的依赖

降低了客户端和子系统的耦合度,使得子系统修改时,不会影响到调用它的客户端.

2.提高了灵活性

降低了客户端使用子系统的难度.只需要调用接口就行了,不用关心子系统的内部实现.

3.**提高了安全性,**可以带门面模式中灵活设置访问权限.

引入日志框架后,相当于应用程序和日志实现之间就有了统一的API接口,此时的应用程序只需要维护一台日志文件配置就可以了.SLF4J 就是其他⽇志框架( log4j1.log4j2,JUL,logback)的⻔⾯. SLF4J 可以理解为是提供⽇志服务的统⼀API接⼝, 并不涉及到具体的⽇志实现.

SLF4J使你的代码独⽴于任意⼀个特定的⽇志API.

五.日志格式

打印出来的日志包含了很多内容.每一段都代表不同的内容.

1.具体元素如下:

1.: 打印日志时的 时间日期,精确到毫秒.

2.: 日志级别 :FATAL,ERROR,WARN,INFO,DEBUG,TRACE依次降低, 日志级别越高,出现的次数越少.

3.: 进程ID.

4.: 配置文件名称.

5.: 线程名.

6.: 打印日志的类路径(存在简写)

7.: 日志内容.

2.日志级别:

日志级别代表着日志信息对应问题的严重性.以便更快地筛选出符合目标的日志信息.

日志级别的分类:

从高到低依次为:FATAL,ERROR,WARN,INFO,DEBUG,TARCE

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

ERROR:错误信息,较为严重的错误,但不影响系统的继续运行.

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

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

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

TARCE:追踪信息,⽐DEBUG更细粒度的信息事件

日志级别的调试人员的bug级别没有关系.

级别越高,收到的消息就越少.

3.日志级别的使用:

日志级别是开发人员自己定义的,根据自己的理解来判断信息的重要程度.

根据这些级别,日志对象分别提供的不同的方法,输出日志:

java 复制代码
package com.springlogger.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/logger")
public class LoggerController {
    private static Logger logger = LoggerFactory.getLogger(LoggerController.class);
    @RequestMapping("/get")
    public String getLogger(){
        logger.trace("trace信息");
        logger.debug("debug信息");
        logger.info("info信息");
        logger.warn("warn信息");
        logger.error("error信息");
//        springboot内置的日志框架地logback,logback没有fatal级别,将其映射到了error级别中.
//        logger.fatal("fatal信息");
        System.out.println("控制台信息");
        return "success";
    }
}

fatal级别是顶级错误,出现该类日志时,就不是打印在控制台了.要通过更快,更直接的方法通知到开发人员紧急处理.

查看控制台中的日志,发现,只打印了info级别以上的信息,而info级别一下的信息没有被打印出来.

这与日志级别的配置有关,日志的默认配置为info,就会只打印info级别以上的信息,info是最低打印级别.

4.日志配置

1>.配置日志级别:

⽇志级别配置只需要在配置⽂件中设置**"logging.level**"配置项即可.

.properties配置:

.yml配置:

当.properties文件和 .yml文件同时存在时,两个文件是都生效的,但若出现冲突时, .properties文件的优先级更高.

设置日志级别为trace后,再次运行程序,查看日志:所有的日志级别都被打印了出来:

2>.日志文件持久化

当日志仅输出在控制台中,再次启动程序后,日志就不存在了,我们需要把⽇志保存下来,以便出现问题之后追 溯问题.把⽇志保存下来就叫持久化.

日志持久化的两种方法:

1.配置日志文件名:

配置日志的文件名为:spring.log,在logger文件夹中,可以使用相对路径,也可以使用绝对路径.

启动程序,就可以看到左边窗槛中有一个logger文件夹,里面有一个spring.log文件.

2.配置日志的存储目录:

在D盘中查看:

这种方式只能配置存储路径,存储日志的文件名固定为:spring.log .

当两种方式同时存在时,只有一种生效 ,以配置文件名 (logging.file.name) 为准.

配置日志文件分割:

随着项目的运行,日志文件会越来越多,都放在一个文件中不方便管理,就需要对日志文件进行分割.

对文件超过1KB的文件进行分割,分割的文件名为: 文件名 +日期+索引.

多打印一些日志,查看logger文件夹.

3>.配置日志格式

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

分别是对控制台中日志的不同内容进行的设置.

%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MMdd'T'HH:mm:ss.SSSXXX}}){faint}: 时间日期的设置.

%5p: 日志级别

%t: 线程名

%5: 字符长度小于5,右遍用空格填充, %-5: 若字符⻓度⼩于5,则左边⽤空格填充.

相关推荐
barcke2 分钟前
【深度解析】Java接入DeepSeek大模型:从零实现流式对话+多轮会话管理(完整项目实战) —— SpringBoot整合、API安全封装、性能优化全攻略
java·spring boot
zl97989914 分钟前
MybatisPlus-注解
java·spring·maven
杰九24 分钟前
【环境配置】maven,mysql,node.js,vue的快速配置与上手
java·vue.js·spring boot·mysql·node.js·maven
wapicn9935 分钟前
‌挖数据平台对接DeepSeek推出一键云端部署功能:API接口驱动金融、汽车等行业智能化升级
java·人工智能·python·金融·汽车·php
逸狼1 小时前
【JavaEE进阶】Spring DI
java·开发语言
m0_748248651 小时前
SpringBoot整合easy-es
spring boot·后端·elasticsearch
yonuyeung1 小时前
代码随想录算法【Day54】
java·数据结构·算法
敲上瘾1 小时前
基础dp——动态规划
java·数据结构·c++·python·算法·线性回归·动态规划
一个热爱生活的普通人1 小时前
golang的切片(Slice)底层实现解析
后端·go