Day920.结构化日志业务审计日志 -SpringBoot与K8s云原生微服务实践

结构化日志&业务审计日志

Hi,我是阿昌,今天学习记录的是关于结构化日志&业务审计日志的内容。

1、什么是结构化日志

结构化日志(Structured Logging)是一种将日志信息组织为结构化数据的技术。

传统的日志通常是一些文本信息,比如一行记录一个错误或者事件,这些信息往往是自由格式的。

相比之下,结构化日志则采用一定的数据格式和模式,将日志信息组织为结构化的数据。

结构化日志可以提供更多的信息,比如时间戳、请求 ID、日志级别、错误类型等等,并且还可以包含一些自定义字段。

这些信息可以用于更好地理解应用程序的行为,从而更快地定位问题并进行故障排除。

在这里插入图片描述

另外,结构化日志还可以方便地与其他工具集成,比如日志聚合工具、监控系统、日志分析工具等等,以便于更好地管理和分析日志数据。

总之,结构化日志是一种更加规范和高效的日志记录方式,它可以提供更多的信息和更好的可读性,同时还能够更好地支持各种日志管理和分析工具的集成。


2、什么是业务审计日志

业务审计日志(Business Audit Log)是一种记录系统中关键业务事件的日志,这些事件通常与应用程序的业务逻辑有关。

业务审计日志可以记录诸如用户登录、数据修改、交易流程、审批流程等重要事件,以便管理人员对系统进行审计。

此外,业务审计日志还可以跟踪应用程序中的所有操作,并记录有关这些操作的详细信息,如时间戳、请求 ID、执行结果、错误类型等等。

通过使用业务审计日志,管理人员可以快速定位和排查系统中的问题,以便及时采取措施。

此外,业务审计日志还可以帮助企业遵守法规和标准,如HIPAA、PCI DSS等等。

这是因为这些法规和标准通常要求企业记录和保留关键业务事件的详细信息,以便进行监管和审核。

总之,业务审计日志是软件开发领域中一种重要的日志记录方式,它可以提供关键的业务信息,帮助管理人员了解应用程序的运行状况,并支持企业遵守法规和标准。


3、Log4j2

Log4j2 提供了一些内置的格式化器和日志适配器,可以轻松地将日志发送到各种目标,如文件、控制台、远程服务器和数据库。

它还提供了灵活的配置选项,使开发人员能够根据不同的需求对日志记录进行定制。除了传统的日志级别和文本消息之外,Log4j 2 还支持使用消息对象来记录结构化日志。

这些消息对象可以包含多个键值对,表示一些事件、错误或其他信息。这种方式可以更清晰地记录日志事件,并支持更好的可读性和可搜索性。

总之,Log4j 2 是 Java 领域中一种常见的结构化日志库,它提供了方便的方式来记录结构化日志,并支持灵活的配置选项和多种目标输出。


4、Structlog4j

Structlog4j用了Log4j2规范的一种结构化日志框架


Maven

<!--基础包-->
<dependency>
    <groupId>tech.ibit</groupId>
    <artifactId>structlog4j-api</artifactId>
    <version>1.2</version>
</dependency>

<!--扩展包-->
<dependency>
    <groupId>tech.ibit</groupId>
    <artifactId>structlog4j-extend</artifactId>
    <version>1.2</version>
</dependency>

structlog4j的核心思想就是将日志已key-value的方式呈现,方便日期切分。

引入logger

import tech.ibit.structlog4j.Logger;
import tech.ibit.structlog4j.StructLoggerFactory;
private static final Logger log = StructLoggerFactory.getLogger(Test.class);

默认日志格式(key-value):

_message=Something error!&user=ibit-tech_errorMessage=Test Exception

json日志格式

{"_message":"Something error!","user":"ibit-tech","_errorMessage":"Test Exception"}

修改全局formatter方法:

方法1(java代码):
StructLog4J.setFormatter(JsonFormatter.getInstance());
方法2(classpath:/structlog4j.properties):
formatter=tech.ibit.structlog4j.extend.JsonFormatter#getInstance

用法

_message说明(以error为例子)

Logger存在一下方法支持error级别日志

/**
 * ERROR日志
 *
 * @param message 消息
 * @param params  参数
 */
void error(String message, Object... params);


/**
 * ERROR日志
 *
 * @param messages 消息片段
 * @param params   参数
 */
void error(Object[] messages, Object... params);

其中message和messages的区别在于,messages支持传入占位符,eg:

logger.error("Something error, id: 12, username: ibit-tech");

等价于:

logger.error(new Object[] {"Something error, id: {}, username: {}", 12, "ibit-tech"});

使用key-value的方式

log.error("Something error", "user", "ibit-tech", "age", 100);

实现ToLog对key-value进行包装

log.error("Something error", (ToLog) () -> new Object[] {"user", "ibit-tech", "age", 1.2});

异常处理

log.error("Something error", "user", "ibit-tech", "age", 100, new RuntimeException("Test Exception"));

混合使用

log.error("Something error", (ToLog) () -> new Object[] {"user", "ibit-tech"}, "age", 1.2);
log.error("Something error", (ToLog) () -> new Object[] {"user", "ibit-tech"}, "age", 1.2, (ToLog) () -> new Object[] {"city", "sz"}, new RuntimeException("Test Exception"));

POJO实现MapToLog,toLog()会返回POJO中所有字段

@Test
public void toLog() {
    User user = new User("ibit-tech", 21);
    Assert.assertEquals("[name, ibit-tech, age, 21]", Arrays.asList(user.toLog()).toString());
}
	
@Value
public class User implements MapToLog {
    private String name;
    private int age;
}

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

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

相关文章

UE实现建筑分层抽屉展示效果

文章目录 1.实现目标2.实现过程2.1 基础设置2.2 核心函数3.参考资料1.实现目标 使用时间轴对建筑楼层的位置偏移进行控制,实现分层抽屉的动画展示效果。 2.实现过程 建筑抽屉的实现原理比较简单,即对Actor的位置进行偏移,计算并更新其世界位置即可。这里还是基于ArchVizExp…

Mybatis报BindingException:Invalid bound statement (not found)异常

一、前言 本文的mybatis是与springboot整合时出现的异常&#xff0c;若使用的不是基于springboot&#xff0c;解决思路也大体一样的。 二、从整合mybatis的三个步骤排查问题 但在这之前&#xff0c;我们先要知道整合mybatis的三个重要的工作&#xff0c;如此才能排查&#x…

SDG,ADAM,LookAhead,Lion等优化器的对比介绍

本文将介绍了最先进的深度学习优化方法&#xff0c;帮助神经网络训练得更快&#xff0c;表现得更好。有很多个不同形式的优化器&#xff0c;这里我们只找最基础、最常用、最有效和最新的来介绍。 优化器 首先&#xff0c;让我们定义优化。当我们训练我们的模型以使其表现更好…

MySQL中事务的相关问题

事务 一、事务的概述&#xff1a; 1、事务处理&#xff08;事务操作&#xff09;&#xff1a;保证所有事务都作为一个工作单元来执行&#xff0c;即使出现了故障&#xff0c;都不能改变这种执行方式。当在一个事务中执行多个操作时&#xff0c;要么所有的事务都被提交(commit…

[ROC-RK3568-PC] [Firefly-Android] 10min带你了解Camera的使用

&#x1f347; 博主主页&#xff1a; 【Systemcall小酒屋】&#x1f347; 博主追寻&#xff1a;热衷于用简单的案例讲述复杂的技术&#xff0c;“假传万卷书&#xff0c;真传一案例”&#xff0c;这是林群院士说过的一句话&#xff0c;另外“成就是最好的老师”&#xff0c;技术…

再也不想去字节跳动面试了,6年测开面试遭到这样打击.....

前几天我朋友跟我吐苦水&#xff0c;这波面试又把他打击到了&#xff0c;做了快6年软件测试员。。。为了进大厂&#xff0c;也花了很多时间和精力在面试准备上&#xff0c;也刷了很多题。但题刷多了之后有点怀疑人生&#xff0c;不知道刷的这些题在之后的工作中能不能用到&…

【Python/Opencv】图像权重加法函数:cv2.addWeighted()详解

【Python/Opencv】图像权重加法函数&#xff1a;cv2.addWeighted()详解 文章目录【Python/Opencv】图像权重加法函数&#xff1a;cv2.addWeighted()详解1. 介绍2. API3. 代码示例与效果3.1 代码3.2 效果4. 参考1. 介绍 在OpenCV图像加法cv2.add函数详解详细介绍了图像的加法运…

字符串匹配【BF、KMP算法】

文章目录:star:BF算法代码实现BF的改进思路:star:KMP算法&#x1f6a9;next数组&#x1f6a9;代码实现优化next数组最终代码⭐️BF算法 BF算法&#xff0c;即暴力(Brute Force)算法&#xff0c;是普通的模式匹配算法&#xff0c;BF算法的思想就是将主串S的第一个字符与模式串P…

三、Python 操作 MongoDB ----非 ODM

文章目录一、连接器的安装和配置二、新增文档三、查询文档四、更新文档五、删除文档一、连接器的安装和配置 pymongo&#xff1a; MongoDB 官方提供的 Python 工具包。官方文档&#xff1a; https://pymongo.readthedocs.io/en/stable/ pip安装&#xff0c;命令如下&#xff1…

JVM调优,调的是什么?目的是什么?

文章目录前言一、jvm是如何运行代码的&#xff1f;二、jvm的内存模型1 整体内存模型结构图2 堆中的年代区域划分3 对象在内存模型中是如何流转的?4 什么是FULL GC,STW? 为什么会发生FULL GC?5 要调优,首先要知道有哪些垃圾收集器及哪些算法6 调优不是盲目的,要有依据,几款内…

HttpRunner3.x(1)-框架介绍

HttpRunner 是一款面向 HTTP(S) 协议的通用测试框架&#xff0c;只需编写维护一份 YAML/JSON 脚本&#xff0c;即可实现自动化测试、性能测试、线上监控、持续集成等多种测试需求。主要特征继承的所有强大功能requests &#xff0c;只需以人工方式获得乐趣即可处理HTTP&#xf…

【每日反刍】——指针运算

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;每日反刍 &#x1f48c;其他专栏&#xff1a; &#x1f534; 每日一题 &#x1f7e2; 读书笔记 &#x1f7e1; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓称…

【Java进阶篇】—— File类与IO流

一、File类的使用 1.1 概述 File 类以及本章中的各种流都定义在 java.io 包下 一个File对象代表硬盘或网络中可能存在的一个文件或文件夹&#xff08;文件目录&#xff09; File 能新建、删除、重命名 文件和目录&#xff0c;但 File不能访问文件内容本身。如果我们想要访问…

【LeetCode】二叉树基础练习 5 道题

第一题&#xff1a;单值二叉树 题目介绍&#xff1a; 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时&#xff0c;才返回true&#xff1b;否则返回false。 //题目框架 bool isUnivalTree(struct TreeNode* root){ }…

【24】Verilog进阶 - 序列检测2

VL35 状态机-非重叠的序列检测 1 思路 状态机嘛,也是比较熟悉的朋友啦, 我就火速写出了STG。如下黑色所示: 2 初版代码 `timescale 1ns/1nsmodule sequence_test1(input wire clk ,input wire rst ,input wire data ,output reg flag ); //*************code**********…

系统架构:经典三层架构

引言 经典三层架构是分层架构中最原始最典型的分层模式&#xff0c;其他分层架构都是其变种或扩展&#xff0c;例如阿里的四层架构模式和DDD领域驱动模型。阿里的 四层架构模型在三层基础上增加了 Manager 层&#xff0c;从而形成变种四层模型&#xff1b;DDD架构则在顶层用户…

Canvas百战成神-圆(1)

Canvas百战成神-圆 初始化容器 <canvas id"canvas"></canvas>canvas{border: 1px solid black; }让页面占满屏幕 *{margin: 0;padding: 0; } html,body{width: 100%;height: 100%;overflow: hidden; } ::-webkit-scrollbar{display: none; }初始化画笔…

JavaEE--Thread 类的基本用法(不看你会后悔的嘿嘿)

Thread类是JVM用来管理线程的一个类,换句话说,每个线程都唯一对应着一个Thread对象. 因此,认识和掌握Thread类弥足重要. 本文将从 线程创建线程中断线程等待线程休眠获取线程实例 等方面来进行具体说明. 1)线程创建 方法1:通过创建Thread类的子类并重写run () 方法 class M…

UDS 14229 -1 刷写34,36,37服务,标准加Trace讲解,没理由搞不明白

&#x1f345; 我是蚂蚁小兵&#xff0c;专注于车载诊断领域&#xff0c;尤其擅长于对CANoe工具的使用&#x1f345; 寻找组织 &#xff0c;答疑解惑&#xff0c;摸鱼聊天&#xff0c;博客源码&#xff0c;点击加入&#x1f449;【相亲相爱一家人】&#x1f345; 玩转CANoe&…

Windows环境下实现设计模式——状态模式(JAVA版)

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天总结一下Windows环境下如何编程实现状态模式&#xff08;设计模式&#xff09;。不知道大家有没有这样的感觉&#xff0c;看了一大堆编程和设计模式的书&#xff0c;却还是很难理解设计模式&#xff0c;无…