日志收集笔记(架构设计、Log4j2项目初始化、Lombok)
1 架构设计
ELK 技术栈架构设计图:

从左往右看,
Beats:主要是使用Filebeat,用于收集日志,将收集后的日志数据发送给 Kafka,充当 Kafka 的生产者Kafka:高性能消息队列,主要起缓冲层的作用Logstash:数据采集引擎,可以从数据库采集数据到 ES 中,起筛选、过滤日志数据作用ElasticSearch和Kibana:展示数据
下面是例子全量的示意图:

Log4j2:使用Log4j2的原因是其性能更好,底层使用无锁并行框架,缺点是服务器的性能需要高一些app.log:存储全量日志error.log:存储异常日志xpack-watch:通过触发器做一个错误日志的上报和告警功能,同过对接 api,推送到对应的负责人微信之类
2 Log4j2
在之前的 《Java基础笔记(日志,反射)》 文章中就有对 Log4j2 进行学习,这里再做一些知识盲点的笔记
slf4j 与 Log4j2 的区别:
slf4j:全称是simple log facade for java,即它是日志库的一个统一规范接口,其下的实现有很多,如:Log4j,Log4j2,LogBackLog4j2:Log4j全称是Log for java,即是上面接口的一个实现,Log4j2是Log4j的升级版本,提高日志输出的吞吐量
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:注解在类上;提供类所有属性的getting和setting方法,此外还提供了equals、canEqual、hashCode、toString方法@Setter:注解在属性上;为属性提供setting方法@Getter:注解在属性上;为属性提供getting方法@SneakyThrows:这个注解用在方法上,可以将方法中的代码用try-catch语句包裹起来,捕获异常并在catch中用Lombok.sneakyThrow(e)把异常抛出,可以使用@SneakyThrows(Exception.class)的形式指定抛出哪种异常@Slf4j:注解在类上;为类提供一个 属性名为log的日志对像@NoArgsConstructor:注解在类上;为类提供一个无参的构造方法@AllArgsConstructor:注解在类上;为类提供一个全参的构造方法@Builder:提供了构造者的模式
参考文章:《Lombok工具 : 常用注解介绍 (全)》
相关文章:
日志收集笔记(架构设计、Log4j2项目初始化、Lombok)
1 架构设计 ELK 技术栈架构设计图: 从左往右看, Beats:主要是使用 Filebeat,用于收集日志,将收集后的日志数据发送给 Kafka,充当 Kafka 的生产者Kafka:高性能消息队列,主要起缓冲…...
一文教你玩转 Apache Doris 分区分桶新功能|新版本揭秘
数据分片(Sharding)是分布式数据库分而治之 (Divide And Conquer) 这一设计思想的体现。过去的单机数据库在大数据量下往往面临存储和 IO 的限制,而分布式数据库则通过数据划分的规则,将数据打散分布至不同的机器或节点上…...
数据挖掘,计算机网络、操作系统刷题笔记54
数据挖掘,计算机网络、操作系统刷题笔记54 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,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:\n…...
Web安全之服务器端请求伪造(SSRF)类漏洞详解及预防
如何理解服务器端请求伪造(SSRF)类漏洞当服务器向用户提交的未被严格校验的URL发起请求的时候,就有可能会发生服务器端请求伪造(SSRF,即Server-Side Request Forgery)攻击。SSRF是由攻击者构造恶意请求URL&…...
LeetCode:239. 滑动窗口最大值
239. 滑动窗口最大值 给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1: 输入:nums [1,3,-…...
JS 函数参数(动态参数、剩余参数)
需求:求和函数 传入不同实参 求和出来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网络 四、分析总结 一、前言 🍨 本文为🔗365天深度学习训练营 中的学习…...
Parisland NFT 作品集
该作品集用来自 Parisland 体验,共包含 11 个 NFT 资产,把你的土地装扮成一个眼花缭乱的热带天堂吧! 登上芭黎丝的爱情船和戴上豪华的螺旋爱情戒指,成为她在数位世界举办的真人秀的一部分吧!该系列还包含两个传奇级别的…...
uniapp: 基础开发官网文档
1、uniapp官网文档:https://uniapp.dcloud.net.cn/component/2、uView跨端UI组件库:http://v1.uviewui.com/components/intro.html3、lunch-request(类似axios的请求库):https://www.quanzhan.co/luch-request/handboo…...
mybatis中配置连接池的原理介绍分析
1.连接池:我们在实际开发中都会使用连接池。因为它可以减少我们获取连接所消耗的时间。2、mybatis中的连接池mybatis连接池提供了3种方式的配置:配置的位置:主配置文件SqlMapConfig.xml中的dataSource标签,type属性就是表示采用何…...
二叉树——路径总和
路径总和 链接 给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。 叶子节点…...
WebDAV之π-Disk派盘+文件管理器
文件管理器 支持WebDAV方式连接π-Disk派盘。 推荐一款iOS上的免费文件管理器新秀。 文件管理器这是一款功能强大的文件管理工具,支持zip,rar,7z等压缩包的解压和压缩,支持小说,漫画,视频下载及播,极大提升日常办公,娱乐,文件管理的工作效率,使得文档的归档和管理随心…...
form表单单输入框回车提交事件处理
问题 form表单中如果只有一个输入框,在输入时按Enter回车键会出发默认事件自动提交表单,该交互是同步发生的,会导致页面刷新。 解决思路 有三种解决思路: 1. 增加input输入框的数量 如果form表单中不止一个input输入框&#…...
c++常用stl算法
1、头文件 这些算法通常包含在头文件<algorithm> <functional> <numeric>中。 2、常用遍历算法 for_each(v.begin(),v.end(), 元素处理函数/仿函数) 注意:在使用transform转存时,目标容器需要提取开辟合适的空间。 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的用法假如我们想自己开发一个依赖包,以便在多个项目中使用。一种可行的方法,也是npm给我们提供的标准做法,那就是我们独立开发好这个 "依赖包",然后将它直接发布到 npm镜像站 上去,等以后想在其…...
Docker 如何配置镜像加速
Docker 镜像加速 国内从 DockerHub 拉取镜像有时会遇到困难,此时可以配置镜像加速器。Docker 官方和国内很多云服务商都提供了国内加速器服务,例如: 科大镜像:https://docker.mirrors.ustc.edu.cn/网易:https://hub-…...
阅读笔记7——Focal Loss
一、提出背景 当前一阶的物体检测算法,如SSD和YOLO等虽然实现了实时的速度,但精度始终无法与两阶的Faster RCNN相比。是什么阻碍了一阶算法的高精度呢?何凯明等人将其归咎于正、负样本的不平衡,并基于此提出了新的损失函数Focal L…...
保姆级教程:用串口和Telnet连接Hi3559/Hi3516开发板,5分钟搞定环境搭建
5分钟极速上手:Hi3559/Hi3516开发板串口与Telnet连接实战指南 刚拿到海思开发板时,许多开发者会被一堆陌生的接口和术语吓退。其实只要掌握几个关键步骤,从拆箱到建立稳定连接只需一根串口线和五分钟时间。本文将用最直白的语言,带…...
GitHub访问加速终极指南:5分钟告别龟速访问的完整解决方案
GitHub访问加速终极指南:5分钟告别龟速访问的完整解决方案 【免费下载链接】fetch-github-hosts 🌏 同步github的hosts工具,支持多平台的图形化和命令行,内置客户端和服务端两种模式~ | Synchronize GitHub hosts tool, support m…...
从CISC到RISC:指令寻址方式如何影响CPU设计?
从CISC到RISC:指令寻址方式如何重塑现代CPU设计? 在计算机体系结构的演进历程中,指令寻址方式始终是影响处理器性能的关键因素。当我们比较x86与ARM处理器的能效差异时,或是分析苹果M系列芯片为何能在低功耗下实现惊人性能时&…...
Obsidian Full Calendar:5步构建个人知识与时间管理一体化系统
Obsidian Full Calendar:5步构建个人知识与时间管理一体化系统 【免费下载链接】obsidian-full-calendar Keep events and manage your calendar alongside all your other notes in your Obsidian Vault. 项目地址: https://gitcode.com/gh_mirrors/obs/obsidian…...
Python 装饰器实战:用@syntax 优雅地增强函数功能
# Python 装饰器实战:用syntax 优雅地增强函数功能## 什么是装饰器?装饰器(Decorator)是 Python 中的一种高级特性,它允许你在不修改原函数代码的情况下,动态地给函数添加功能。简单来说,装饰器…...
Leetcode 数据结构刷题 ->链表1
[27. 移除元素]移除等于所给值的元素,我们可以直接使用双指针,对着来的。关键就是把不等于x的值(我改一下,没用val),放到后面去,这样前面就全部都是不等于x值,再计数即可。看代码就对…...
Realistic Vision V5.1镜像部署实操:解决‘模型路径不存在’异常的完整排查链
Realistic Vision V5.1镜像部署实操:解决‘模型路径不存在’异常的完整排查链 1. 引言:从“模型路径不存在”说起 如果你在部署Realistic Vision V5.1虚拟摄影棚时,满怀期待地启动程序,结果却在控制台看到一行冰冷的“模型路径不…...
微信聊天记录永久保存与智能分析:WeChatMsg完全使用指南
微信聊天记录永久保存与智能分析:WeChatMsg完全使用指南 【免费下载链接】WeChatMsg 提取微信聊天记录,将其导出成HTML、Word、CSV文档永久保存,对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeC…...
为什么90%的Python项目误用SM9?——基于NIST SP 800-56A rev3与GB/T 38635.2的合规性性能审计清单
第一章:SM9密码算法的合规性认知误区与审计必要性在国产密码应用推广过程中,SM9标识密码体系常被误认为“天然合规”——仅因列入《GB/T 38635.1—2020 信息安全技术 SM9标识密码算法 第1部分:总则》即等同于满足等保2.0、密评及《商用密码管…...
亚洲美女-造相Z-Turbo惊艳案例分享:高还原度旗袍/汉服/都市职场风人像生成
亚洲美女-造相Z-Turbo惊艳案例分享:高还原度旗袍/汉服/都市职场风人像生成 最近在玩一个挺有意思的AI模型,叫“亚洲美女-造相Z-Turbo”。这名字听起来有点技术范儿,但说白了,它就是个专门生成亚洲女性人像的AI工具。 你可能用过…...
