javaEE-SpringBoot日志

news/2025/2/23 14:12:26

一.日志的用途

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

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

⽐如需要记录⼀些⽤⼾的操作记录(⼀些审计公司会要求), 也可能需要使⽤⽇志来记录⽤⼾的⼀些喜好, 把⽇志持久化, 后续进⾏数据分析等. 但是 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,则左边⽤空格填充.


http://www.niftyadmin.cn/n/5863464.html

相关文章

全链路优化:如何让单点登录认证接口并发性能翻倍?

背景 最近针对一个单点登录认证项目进行性能优化,在 8核 16G 环境下的认证并发能力从每秒800次提升至每秒1600次,性能提升一倍,整理此次优化过程中的相关性能优化操作总结和大家分享一下。 Nginx配置优化 在并发认证场景下,Ngi…

leetcode刷题记录(一百一十六)——5. 最长回文子串

(一)问题描述 5. 最长回文子串 - 力扣(LeetCode)5. 最长回文子串 - 给你一个字符串 s,找到 s 中最长的 回文 子串。 示例 1:输入:s "babad"输出:"bab"解释&am…

Docker实战-使用docker compose搭建博客

docker run 部署 创建blog网络 [rootk8s-master ~]# docker network create blog 8f533a5a1ec65eae3f98c0ae5a76014a3ab1bf3c087ad952cdc100cc7a658948 [rootk8s-master ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 8f533a5a1ec6 blog bridge …

大语言模型微调的公开JSON数据

大语言模型微调的公开JSON数据 以下是一些可用于大语言模型微调的公开JSON数据及地址: EmoLLM数据集 介绍:EmoLLM是一系列能够支持理解用户、帮助用户心理健康辅导链路的心理健康大模型,其开源了数据集、微调方法、训练方法及脚本等。数据集按用处分为general和role-play两种…

【GPU驱动】- 状态机

一、概述 Mesa 是一个开源的图形库,它提供了一个通用的图形抽象层,支持多种硬件和驱动程序。Mesa 的核心组件之一是 State Tracker,它在抽象图形 API(如 OpenGL )与具体的图形驱动之间起到桥梁作用。State Tracker 通…

基于SSM的《计算机网络》题库管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘 要 《计算机网络》题库管理系统是一种新颖的考试管理模式,因为系统是用Java技术进行开发。系统分为三个用户进行登录并操作,分别是管理员、教师和学生。教师在系统后台新增试题和试卷,学生进行在线考试,还能对考生记录、错题…

c#编程:学习Linq,重几个简单示例开始

学习LINQ(Language Integrated Query)是掌握C#中数据处理和分析的重要一步。LINQ 提供了一种简洁、声明性的方式来查询和操作内存中的数据集合(如数组、列表等)以及数据库中的数据。 以下是一些入门级的经典LINQ示例,…