当前位置: 首页 > news >正文

日志收集笔记(架构设计、Log4j2项目初始化、Lombok)

1 架构设计

ELK 技术栈架构设计图:
在这里插入图片描述
从左往右看,

  • Beats:主要是使用 Filebeat,用于收集日志,将收集后的日志数据发送给 Kafka,充当 Kafka 的生产者
  • Kafka:高性能消息队列,主要起缓冲层的作用
  • Logstash:数据采集引擎,可以从数据库采集数据到 ES 中,起筛选、过滤日志数据作用
  • ElasticSearchKibana:展示数据

下面是例子全量的示意图:

在这里插入图片描述

  • Log4j2:使用 Log4j2 的原因是其性能更好,底层使用无锁并行框架,缺点是服务器的性能需要高一些
  • app.log:存储全量日志
  • error.log:存储异常日志
  • xpack-watch:通过触发器做一个错误日志的上报和告警功能,同过对接 api,推送到对应的负责人微信之类

2 Log4j2

在之前的 《Java基础笔记(日志,反射)》 文章中就有对 Log4j2 进行学习,这里再做一些知识盲点的笔记
slf4jLog4j2 的区别:

  • slf4j:全称是 simple log facade for java,即它是日志库的一个统一规范接口,其下的实现有很多,如:Log4jLog4j2LogBack
  • Log4j2Log4j 全称是 Log for java,即是上面接口的一个实现,Log4j2Log4j 的升级版本,提高日志输出的吞吐量

2.2 配置文件

参考文章:《Log4j2同步日志,混合日志和异步日志配置详解》

Log4j2 中记录日志的方式有同步日志和异步日志两种方式,其中异步日志又可分为使用 AsyncAppender 和使用 AsyncLogger 两种方式。上面的参考文章写得很详细了,这里不再赘述。
如下是输出日志的格式:

[%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ}] [%level{length=5}] [%thread-%tid] [%logger] [%X{hostName}] [%X{ip}] [%X{applicationName}] [%F,%L,%C,%M] [%m] ## '%ex'%n

其代表的各自意义是:

  • [%d{yyyy-MM-dd'T'HH:mm:ss.SSSZZ}]:时间,UTC美国的时间,因为后期elk也是使用这个时区
  • [%level{length=5}]:日志级别
  • [%thread-%tid]:线程id
  • [%logger]:创建对应 logger 实例传入的 class
  • [%X{hostName}]:自定义 MDC 的字段,当前应用主机名称
  • [%X{ip}]:自定义 MDC 的字段,当前应用的 IP
  • [%X{applicationName}]:自定义 MDC 的字段,当前应用的 applicationName
  • [%F,%L,%C,%M]%F 表示当前输出日志的文件名、%L 表示是日志输出所在的行数、%C 表示当前输出日志的类名、%M 表示当前输出日志所在的方法名
  • [%m]:日志输出的自定义内容
  • ##:自行编的特殊约定分隔符,将普通信息和错误堆栈分隔开
  • '%ex':错误信息,其中单引号是特殊约定
  • %n 换行符

2.3 MDC

MDC 线程变量,它的作用就是自定义变量,可以看做为一个 Map 对象,供日志输出时使用,如上自定义输出格式的 [%X{hostName}],其中 %X 表示的就是自定义变量,使用 MDC 很简单,只要在调用日志输出之前,调用 MDC 的 put 方法设置变量即可,如果没有调用 put 方法,则输出日志时,该变量为空。

MDC.put("hostName", NetUtil.getLocalHostName());
MDC.put("ip", NetUtil.getLocalIp());
MDC.put("applicationName", applicationName);

3 Lombok

在以往日志输出的时候,都需要在对应类下创建诸如:

final static Logger logger = LoggerFactory.getLogger(IndexController.class);

Logger 实例,然后调用该实例的方法进行相对应的日志输出,这里引用一个简化代码的工具 Lombok
Lombok 是一个可以通过简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 Java 代码的工具,即能够在源码中不需要写一些通用的方法,但是在编译生成的字节码文件中会帮我们生成这些方法。(即使 IDE 也有自带自动生成方法的功能,但使用 Lombok 会使代码看起来更加简洁)

3.1 Lombok 的使用

导入依赖:

<!-- lombok 工具 -->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId>
</dependency>

同时 idea 也需要安装对应的插件,但我在插件搜索窗口搜索不到对应的插件,只能在浏览器下载后在进行安装,参考一下这篇文章 《idea安装 Lombok 插件》,注意下载与 idea 对应的版本。

常用的 Lombok 注解:

  • @NonNull:判断是否为空,如果为空,则抛出 java.lang.NullPointerException
  • @Data:注解在类上;提供类所有属性的 gettingsetting 方法,此外还提供了 equalscanEqualhashCodetoString 方法
  • @Setter:注解在属性上;为属性提供 setting 方法
  • @Getter:注解在属性上;为属性提供 getting 方法
  • @SneakyThrows:这个注解用在方法上,可以将方法中的代码用 try-catch 语句包裹起来,捕获异常并在 catch 中用Lombok.sneakyThrow(e) 把异常抛出,可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常
  • @Slf4j:注解在类上;为类提供一个 属性名为 log 的日志对像
  • @NoArgsConstructor:注解在类上;为类提供一个无参的构造方法
  • @AllArgsConstructor:注解在类上;为类提供一个全参的构造方法
  • @Builder:提供了构造者的模式

参考文章:《Lombok工具 : 常用注解介绍 (全)》

相关文章:

日志收集笔记(架构设计、Log4j2项目初始化、Lombok)

1 架构设计 ELK 技术栈架构设计图&#xff1a; 从左往右看&#xff0c; Beats&#xff1a;主要是使用 Filebeat&#xff0c;用于收集日志&#xff0c;将收集后的日志数据发送给 Kafka&#xff0c;充当 Kafka 的生产者Kafka&#xff1a;高性能消息队列&#xff0c;主要起缓冲…...

一文教你玩转 Apache Doris 分区分桶新功能|新版本揭秘

数据分片&#xff08;Sharding&#xff09;是分布式数据库分而治之 (Divide And Conquer) 这一设计思想的体现。过去的单机数据库在大数据量下往往面临存储和 IO 的限制&#xff0c;而分布式数据库则通过数据划分的规则&#xff0c;将数据打散分布至不同的机器或节点上&#xf…...

数据挖掘,计算机网络、操作系统刷题笔记54

数据挖掘&#xff0c;计算机网络、操作系统刷题笔记54 2022找工作是学历、能力和运气的超强结合体&#xff0c;遇到寒冬&#xff0c;大厂不招人&#xff0c;可能很多算法学生都得去找开发&#xff0c;测开 测开的话&#xff0c;你就得学数据库&#xff0c;sql&#xff0c;orac…...

将数组中的每个元素四舍五入到指定的精度numpy.rint()

【小白从小学Python、C、Java】 【计算机等级考试500强双证书】 【Python-数据分析】 将数组中的每个元素 四舍五入到指定的精度 numpy.rint() 选择题 请问np.rint(a)的输出结果是? import numpy as np anp.array([-1.72,-1.3,0.37,2.4]) print("【显示】a&#xff1a;\n…...

Web安全之服务器端请求伪造(SSRF)类漏洞详解及预防

如何理解服务器端请求伪造&#xff08;SSRF&#xff09;类漏洞当服务器向用户提交的未被严格校验的URL发起请求的时候&#xff0c;就有可能会发生服务器端请求伪造&#xff08;SSRF&#xff0c;即Server-Side Request Forgery&#xff09;攻击。SSRF是由攻击者构造恶意请求URL&…...

LeetCode:239. 滑动窗口最大值

239. 滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-…...

JS 函数参数(动态参数、剩余参数)

需求&#xff1a;求和函数 传入不同实参 求和出来1.动态参数 arguments 只存在于函数内function getSum() {//arguments 获取传递的所有参数 是一个伪数组let num 0for(let i0;i<arguments.length;i){num arguments[i]}return num}//调用console.log(getSum(1,2,3))consol…...

365天深度学习训练营-第J3周:DenseNet算法实战与解析

目录 一、前言 二、论文解读 1、DenseNet的优势 2、设计理念 3、网络结构 4、与其他算法进行对比 三、代码复现 1、使用Pytorch实现DenseNet 2、使用Tensorflow实现DenseNet网络 四、分析总结 一、前言 &#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习…...

Parisland NFT 作品集

该作品集用来自 Parisland 体验&#xff0c;共包含 11 个 NFT 资产&#xff0c;把你的土地装扮成一个眼花缭乱的热带天堂吧&#xff01; 登上芭黎丝的爱情船和戴上豪华的螺旋爱情戒指&#xff0c;成为她在数位世界举办的真人秀的一部分吧&#xff01;该系列还包含两个传奇级别的…...

uniapp: 基础开发官网文档

1、uniapp官网文档&#xff1a;https://uniapp.dcloud.net.cn/component/2、uView跨端UI组件库&#xff1a;http://v1.uviewui.com/components/intro.html3、lunch-request&#xff08;类似axios的请求库&#xff09;&#xff1a;https://www.quanzhan.co/luch-request/handboo…...

mybatis中配置连接池的原理介绍分析

1.连接池&#xff1a;我们在实际开发中都会使用连接池。因为它可以减少我们获取连接所消耗的时间。2、mybatis中的连接池mybatis连接池提供了3种方式的配置&#xff1a;配置的位置&#xff1a;主配置文件SqlMapConfig.xml中的dataSource标签&#xff0c;type属性就是表示采用何…...

二叉树——路径总和

路径总和 链接 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径&#xff0c;这条路径上所有节点值相加等于目标和 targetSum 。如果存在&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 叶子节点…...

WebDAV之π-Disk派盘+文件管理器

文件管理器 支持WebDAV方式连接π-Disk派盘。 推荐一款iOS上的免费文件管理器新秀。 文件管理器这是一款功能强大的文件管理工具,支持zip,rar,7z等压缩包的解压和压缩,支持小说,漫画,视频下载及播,极大提升日常办公,娱乐,文件管理的工作效率,使得文档的归档和管理随心…...

form表单单输入框回车提交事件处理

问题 form表单中如果只有一个输入框&#xff0c;在输入时按Enter回车键会出发默认事件自动提交表单&#xff0c;该交互是同步发生的&#xff0c;会导致页面刷新。 解决思路 有三种解决思路&#xff1a; 1. 增加input输入框的数量 如果form表单中不止一个input输入框&#…...

c++常用stl算法

1、头文件 这些算法通常包含在头文件<algorithm> <functional> <numeric>中。 2、常用遍历算法 for_each(v.begin(),v.end(), 元素处理函数/仿函数) 注意&#xff1a;在使用transform转存时&#xff0c;目标容器需要提取开辟合适的空间。 void printfunc(…...

非对称密钥PKCS#1和PKCS#8格式互相转换(Java)

目录一、序言二、代码示例1、Maven依赖2、工具类封装三、测试用例1、密钥文件2、公私钥PKCS1和PKCS8格式互相转换一、序言 之前在 《前后端RSA互相加解密、加签验签、密钥对生成》 中提到过PKCS#1格式和PKCS#8格式密钥的区别以及如何生成密钥。实际有些场景中有可能也会涉及到…...

java获取当前时间的方法:LocalDateTime、Date、Calendar,以及三者的比较

文章目录前言一、LocalDateTime1.1 获取当前时间LocalDate.now()1.2 获取当前时间的年、月、日、时分秒localDateTime.getYear()……1.3 给LocalDateTime赋值LocalDateTime.of()1.4 时间与字符串相互转换LocalDateTime.parse()1.5 时间运算——加上对应时间LocalDateTime.now()…...

npm link

正文npm link的用法假如我们想自己开发一个依赖包&#xff0c;以便在多个项目中使用。一种可行的方法&#xff0c;也是npm给我们提供的标准做法&#xff0c;那就是我们独立开发好这个 "依赖包"&#xff0c;然后将它直接发布到 npm镜像站 上去&#xff0c;等以后想在其…...

Docker 如何配置镜像加速

Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难&#xff0c;此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务&#xff0c;例如&#xff1a; 科大镜像&#xff1a;https://docker.mirrors.ustc.edu.cn/网易&#xff1a;https://hub-…...

阅读笔记7——Focal Loss

一、提出背景 当前一阶的物体检测算法&#xff0c;如SSD和YOLO等虽然实现了实时的速度&#xff0c;但精度始终无法与两阶的Faster RCNN相比。是什么阻碍了一阶算法的高精度呢&#xff1f;何凯明等人将其归咎于正、负样本的不平衡&#xff0c;并基于此提出了新的损失函数Focal L…...

浅谈 React Hooks

React Hooks 是 React 16.8 引入的一组 API&#xff0c;用于在函数组件中使用 state 和其他 React 特性&#xff08;例如生命周期方法、context 等&#xff09;。Hooks 通过简洁的函数接口&#xff0c;解决了状态与 UI 的高度解耦&#xff0c;通过函数式编程范式实现更灵活 Rea…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...