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.使用日志对象打印日志

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.日志级别的使用:

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

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

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,则左边⽤空格填充.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/975045.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

DeepSeek vs ChatGPT:AI 领域的华山论剑,谁主沉浮?

一、引言 在当今科技飞速发展的时代,人工智能(AI)已然成为推动各领域变革的核心力量。而在人工智能的众多分支中,自然语言处理(NLP)因其与人类日常交流和信息处理的紧密联系,成为了最受瞩目的领…

LangChain-基础(prompts、序列化、流式输出、自定义输出)

LangChain-基础 我们现在使用的大模型训练数据都是基于历史数据训练出来的,它们都无法处理一些实时性的问题或者一些在训练时为训练到的一些问题,解决这个问题有2种解决方案 基于现有的大模型上进行微调,使得它能适应这些问题(本…

数据库面试知识点总结

目录 1. MySQL 基础题1.1 执行⼀条 select / update 语句,在 MySQL 中发生了什么?1.2 MySQL 一行记录是怎么存储的? 2. 三大范式3. 数据库引擎3.1 Innodb3.2 MyISAM 4. 数据库索引4.1 索引分类4.2 索引优缺点4.3 索引使用场景4.4 优化索引方法…

Spring事务原理 二

在上一篇博文《Spring事务原理 一》中,我们熟悉了Spring声明式事务的AOP原理,以及事务执行的大体流程。 本文中,介绍了Spring事务的核心组件、传播行为的源码实现。下一篇中,我们将结合案例,来讲解实战中有关事务的易…

使用 C++ 和 gRPC 的常见陷阱及解决方案

文章目录 1. 环境配置的陷阱1.1 依赖版本冲突或混淆1.2 gRPC 工具缺失 2. 编译和链接的陷阱2.1 运行时库不匹配(/MT vs /MD)2.2 未解析的外部符号 3. Protobuf 文件生成的陷阱3.1 工具版本不匹配3.2 生成文件运行时库不一致 4. 运行时的陷阱4.1 缺少 DLL…

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类

《深度学习实战》第2集:卷积神经网络(CNN)与图像分类 引言 卷积神经网络(Convolutional Neural Network, CNN)是深度学习在计算机视觉领域的核心工具。从早期的 LeNet 到现代的 ResNet 和 Vision Transformer&#xf…

创建Linux虚拟环境并远程连接

目录 下载VMware软件 下载CentOS 创建虚拟环境 远程连接Linux系统 下载VMware软件 不会的可以参考 传送门 下载CentOS 不会的可以参考 传送门 创建虚拟环境 打开VMware软件,创建虚拟机 选择典型安装 找到我们安装好的centOS文件,之后会自动检…

RV1126解码(5) read_vdec_thread线程

read_vdec_thread线程的用处 read_vdec_thread线程主要是获取每一帧VDEC解码数据,并打印出来每一帧数据的具体信息。 代码: //用于从 VDEC 解码器获取每一帧解码后的图像数据 void *read_vdec_thread(void *args) {pthread_detach(pthread_self());MED…

verilog笔记

Verilog学习笔记(一)入门和基础语法BY电棍233 由于某些不可抗拒的因素和各种的特殊原因,主要是因为我是微电子专业的,我需要去学习一门名为verilog的硬件解释语言,由于我是在某西部地区的神秘大学上学,这所…

Three.js 快速入门教程【六】相机控件 OrbitControls

系列文章目录 Three.js 快速入门教程【一】开启你的 3D Web 开发之旅 Three.js 快速入门教程【二】透视投影相机 Three.js 快速入门教程【三】渲染器 Three.js 快速入门教程【四】三维坐标系 Three.js 快速入门教程【五】动画渲染循环 Three.js 快速入门教程【六】相机控件 Or…

抗辐照加固CAN FD芯片的商业航天与车规级应用解析

在工业自动化、智能汽车、航空航天及国防装备等关键领域,数据传输的安全性、可靠性与极端环境适应能力是技术升级的核心挑战。国科安芯推出全新一代CANFD(Controller Area Network Flexible Data Rate)芯片,以高安全、高可靠、断电…

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试!

经验分享—WEB渗透测试中遇到加密内容的数据包该如何测试! 01 加解密的意义 现阶段的渗透测试让我发现越来越多的系统不只是在漏洞修补方面做了功夫,还对一些参数进行加密,干扰爬虫或者渗透测试的进行。 在我小白阶段看到下图这种加密方式…

在群晖上使用Docker安装思源笔记

​​ 最近一段时间,docker的镜像地址都失效了,在群晖系统中,无论是早期版本的docker,还是最新版本中的Container Manager,注册表中都无法链接到docker的镜像,于是,就花了点时间查找资料&#x…

网络安全营运周报

🍅 点击文末小卡片 ,免费获取网络安全全套资料,资料在手,涨薪更快 第三章网络安全基础 一、网络安全概述 1、网络安全现状及安全挑战 网络安全范畴极其广泛,可以说是涉及多方面。 因为计算机病毒层出不穷以及黑客的…

Linux 进程通信——管道

目录 一、什么是进程通信 二、为什么要进行进程通信 三、如何进行通信 四、管道 1、什么是管道 2、管道的原理 3、接口 4、编码实现 5、管道的特征 6、管道的4种情况 一、什么是进程通信 进程通信是两个或多个进程实现数据层面的交互。 因为进程具有独立性&#xff0…

Linux中DataX使用第四期

简介 紧接着上期关于定义如何一个简单的插件,本期了解下关系型数据库的数据读取和数据写入。 环境 Windows10 (linux中命令相似,为了方面调试就用windows的)JDK(1.8以上,推荐1.8)Python(2或3都可以)Apache Maven (推荐3.x版本)IntelliJ IDEA…

Java计算机毕业设计基于SSM宠物美容信息管理系统数据库源代码+LW文档+开题报告+答辩稿+部署教程+代码讲解

源代码数据库LW文档(1万字以上)开题报告答辩稿 部署教程代码讲解代码时间修改教程 一、开发工具、运行环境、开发技术 开发工具 1、操作系统:Window操作系统 2、开发工具:IntelliJ IDEA或者Eclipse 3、数据库存储&#xff1a…

核货宝助力连锁门店订货数字化转型升级

在竞争激烈的连锁零售行业,传统订货模式弊端日益凸显,严重制约着企业的发展。核货宝订货系统以其卓越的数字化解决方案,为连锁门店订货带来了全方位的变革,助力企业实现数字化转型升级,在市场中抢占先机。 一、增强总部…

论文解读 | AAAI'25 Cobra:多模态扩展的大型语言模型,以实现高效推理

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击 阅读原文 观看作者讲解回放! 个人信息 作者:赵晗,浙江大学-西湖大学联合培养博士生 内容简介 近年来,在各个领域应用多模态大语言模型(MLLMs&…

java中的Entry类,map接口

看Redisson源码时候发现有个Entry&#xff0c;眼熟&#xff0c;遂查资料 Map.Enty<KV> 是在Map接口中的一个内部接口Entry 作用&#xff1a;当Map集合一创建那么就会在Map集合中创建一个Enty对象&#xff0c;用来记录键与值&#xff08;键值对对象&#xff0c;键与值的…