Elasticsearch:Java ECS 日志记录 - log4j2
ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松将日志格式化为与 ECS 兼容的 JSON。ECS 兼容的 JSON 日志记录可以帮我们简化很多分析,可视化及解析的工作。在今天的文章里,我来详述如何在 Java 应用里生成 ECS 相兼容的日志。
如果大家对完整的项目感兴趣,你可以在地址下载示例代码。
git clone https://github.com/liu-xiao-guo/elasticsearch-java-ecs
步骤1:生成模板 Spring boot 应用
我们可以在 https://start.spring.io/ 生成一个模板的 Spring boot 应用:

我们下载所生成的代码,并解压缩到我们的电脑目录中。我们可以使用我们所喜欢的 IDE 来进行导入。
步骤 2:配置应用程序日志记录
如果你使用的是 Elastic APM Java 代理,将日志转换为与 ECS 兼容的 JSON 格式的最简单方法是通过 log_ecs_reformatting 配置选项。只需设置此选项,Java 代理就会自动导入正确的 ECS 日志库并配置你的日志框架以使用它来代替(覆盖/替换)或补充(遮蔽)你当前的配置。无需进行其他更改!请务必查看其他日志配置选项以充分发挥此选项的潜力。
否则,请按照以下步骤通过你的日志框架配置手动应用 ECS 格式。支持以下日志框架:
- Logback(Spring Boot 的默认设置)
- Log4j2
- Log4j
- java.util.logging (JUL)
- JBoss 日志管理器
在今天的文章里,我们来展示如何使用 Log4j2 来进行生成 ECS 相兼容的日志。更多的资料可以在地址查看。
添加 dependency
所需的最低 log4j2 版本为 2.6。下载最新版本的 Elastic 日志记录:Maven Central v1.6.0
向你的应用程序添加依赖项:
<dependency><groupId>co.elastic.logging</groupId><artifactId>log4j2-ecs-layout</artifactId><version>${ecs-logging-java.version}</version></dependency>
提示:如果你不使用依赖项管理工具(如 maven),则必须手动将 log4j2-ecs-layout 和 ecs-logging-core jar 添加到类路径。例如,添加到 $CATALINA_HOME/lib 目录。除此之外,没有必需的依赖项。
除此之外,我们还必须添加如下的 dependency:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>
这个是为了记录日志之用。
由于 Spring Boot 使用 logback 作为默认记录器,因此我们将其从 spring-boot-starter 依赖项中排除。我们需要做如下的修改:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency>
在上面,为了能够使得它能在 Java 1.8 下进行编译,我必须把上面的 spring-boot-starter 修改为 spring-boot-starter-web,否则会有错误。
添加 log4j2.xml 文件
接下来,在 src/main/resources 中为 log4j2 记录器 log4j2.xml 添加一个 log4j2 配置。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG"><Appenders><Console name="LogToConsole" target="SYSTEM_OUT"><EcsLayout serviceName="my-app" serviceVersion="my-app-version" serviceEnvironment="my-app-environment" serviceNodeName="my-app-cluster-node"/></Console><File name="LogToFile" fileName="logs/app.log"><EcsLayout serviceName="my-app" serviceVersion="my-app-version" serviceEnvironment="my-app-environment" serviceNodeName="my-app-cluster-node"/></File></Appenders><Loggers><Root level="info"><AppenderRef ref="LogToFile"/><AppenderRef ref="LogToConsole"/></Root></Loggers>
</Configuration>
在上面,我们定义了日志的文件名 logs/app.log。里面参数的描述请参考链接。
修改 application.properties 文件
我们修改 application.properties 文件为:
spring.application.name=elasticsearch-java-ecs
spring.main.allow-circular-references=true

在应用中使用 Log4j2 来记录日志
我们在 ElasticController class 中使用如下的方式来记录日志:
ElasticController.java
package com.liuxg.elasticsearch_java_ecs;import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Date;import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.message.StringMapMessage;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;@RestController
class ElasticController {private static final Logger LOG = LogManager.getLogger(ElasticController.class);@AutowiredRestTemplate restTemplete;@BeanRestTemplate restTemplate() {return new RestTemplate();}@RequestMapping(value = "/")public String home() {String homeMessage = "Welcome to Elastic ECS logging demo";LOG.info(homeMessage);return homeMessage;}@RequestMapping(value = "/elk")public String helloWorld() {String response = "Welcome to JAVA " + new Date();LOG.info(new StringMapMessage().with("message", "API called").with("customer.id", "client-1").with("product.id", "25a76f91-41dd-49da-8020-3553c9100267").with("customer.action", "CREATE"));return response;}@RequestMapping(value = "/exception")public String exception() {String response = "";try {throw new Exception("Opps Exception raised....");} catch (Exception e) {e.printStackTrace();LOG.error(e);StringWriter sw = new StringWriter();PrintWriter pw = new PrintWriter(sw);e.printStackTrace(pw);String stackTrace = sw.toString();LOG.error("Exception - " + stackTrace);response = stackTrace;}return response;}
}
如上所示,我们可以使用 Log.info() 来记录日志。在上面的代码中,我们使用了三种方式来记录日志:
-
LOG.info(homeMessage);
-
LOG.info(new StringMapMessage().with("message", "API called").with("customer.id", "client-1").with("product.id", "25a76f91-41dd-49da-8020-3553c9100267").with("customer.action", "CREATE")); -
LOG.error(e);
我们为 Spring Boot 应用定义了三个接口。运行我们的 Spring Boot 应用:

它将在程序的更目录下的 logs 下生成一个叫做 app.log 的文件:

从上面的日志输出中,我们可以看出来日志是一个 ECS 相兼容的 JSON 日志文件。我们相下滚动直到文件的底部:

上面的最后一条日志就是我们刚生成的日志。
我们接着访问另外一个接口:

我们滚动到最后的一条日志:

上面显示的是我们的一条自定义的日志。
我们再接着访问一个 exception 接口:

同样的我们滚动到最后查看 app.log 日志的内容:

我们可以看到日志的内容。
把日志写入到 Elasticsearch
我们配置 filebeat.yml 文件:
Filebeat 7.16+
filebeat.yaml
filebeat.inputs:
- type: filestream paths: /path/to/app.logparsers:- ndjson:overwrite_keys: true add_error_key: true expand_keys: true processors: - add_host_metadata: ~- add_cloud_metadata: ~- add_docker_metadata: ~- add_kubernetes_metadata: ~
Filebeat < 7.16
filebeat.yaml
filebeat.inputs:
- type: logpaths: /path/to/logs.jsonjson.keys_under_root: truejson.overwrite_keys: truejson.add_error_key: truejson.expand_keys: trueprocessors:
- add_host_metadata: ~
- add_cloud_metadata: ~
- add_docker_metadata: ~
- add_kubernetes_metadata: ~
针对 exception 这类的错误信息。我们可能需要进行特殊的处理。请参考文章 “Beats:使用 Filebeat 传送多行日志”。
更多关于如何写入 ECS 相兼容的 JSON 日志文件,请详细阅读文章:
-
Elastic:运用 Elastic Stack 分析 Spring Boot 微服务日志 (一)(二)
-
Elasticsearch:使用 Filebeat 从 Node.js Web 应用程序提取日志
-
Beats:使用 Filebeat 从 Python 应用程序中提取日志
相关文章:
Elasticsearch:Java ECS 日志记录 - log4j2
ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松将日志格式化为与 ECS 兼容的 JSON。ECS 兼容的 JSON 日志记录可以帮我们简化很多分析,可视化及解析的工作。在今天的文章里,我来详述如何在 Java 应用里生成 ECS 相兼容的日志。 …...
MongoDB自学笔记(四)
一、前文回顾 上一篇文章中我们学习了MongoDB中的更新方法,也学了一部分操作符。今天我们将学习最后一个操作“删除”。 二、删除 原始数据如下: 1、deleteOne 语法:db.collection.deleteOne(< query >,< options >) 具体参…...
时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解
时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解 目录 时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解效果一览基本介绍程序设计参考资料 效果一览…...
新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题
苹果CMS2022新版海螺影视主题M3.1版本,这个主题我挺喜欢的,之前也有朋友给我提供过原版主题,一直想要破解但是后来找了几个SG11解密的大哥都表示解密需要大几百大洋,所以一直被搁置了。这个版本是完全解密的,无需SG11加…...
汽车免拆诊断案例 | 2014 款上汽名爵 GT 车发动机无法起动
故障现象 一辆2014款上汽名爵GT车,搭载15S4G发动机,累计行驶里程约为18.4万km。该车因左前部发生碰撞事故进厂维修,更换损坏的部件后起动发动机,起动机运转有力,但无着机迹象。用故障检测仪检测,发现无法与…...
vue3前端开发-小兔鲜项目-登录功能的业务接口调用
vue3前端开发-小兔鲜项目-登录功能的业务接口调用!这次,正式调用远程服务器的登录接口了。大家要必须使用测试账号密码,才能验证我们的代码。 测试账号密码是:账号(xiaotuxian001);密码是(1234…...
【Linux】vim编辑器使用详解
目录 一、vim编辑器简介二、 vim编辑器使用指南1.基本操作1.进入与退出2.模式切换 2.命令模式1.移动光标2.选择文本(可视模式)3.删除文字4.复制粘贴5.替换6.撤销7.注释8.多文件窗口切换 3.底行模式1.列出每行的行号2.跳转到某行3.查找字符4.保存文件5.在…...
手机怎么设置不同的ip地址
在数字化日益深入的今天,智能手机已成为我们生活、工作和学习中不可或缺的设备。然而,随着网络应用的广泛和深入,我们有时需要为手机设置不同的IP地址来满足特定需求。比如,避免网络限制、提高网络安全、或者进行网络测试等。本文…...
SpringBoot读取配置的6种方式
在SpringBoot应用开发中,配置文件是不可或缺的一部分。它们帮助我们管理应用的运行时参数,使得应用的部署和维护变得更加灵活。SpringBoot提供了多种方式来读取配置文件,每种方式都有其适用场景和优缺点。本文将介绍六种常用的SpringBoot读取…...
1.1 openCv -- 介绍
OpenCV(开放源代码计算机视觉库:http://opencv.org)是一个开源库,包含了数百种计算机视觉算法。本文件描述了所谓的OpenCV 2.x API,这是一个本质上基于C++的API,与基于C的OpenCV 1.x API(C API已被弃用,并且自从OpenCV 2.4版本起不再使用“C”编译器进行测试)相对。 …...
探索PostgreSQL的GUI工具:提升数据库管理效率
在当今快速发展的技术世界中,数据库管理是任何软件开发项目的核心部分。PostgreSQL,作为一款功能强大的开源关系型数据库管理系统,因其稳定性、可靠性和高度的可扩展性而广受开发者和数据库管理员的青睐。然而,尽管PostgreSQL自带…...
【从零开始实现stm32无刷电机FOC】【实践】【5/7 stm32 adc外设的高级用法】
目录 采样时刻触发采样同步采样 点击查看本文开源的完整FOC工程 本节介绍的adc外设高级用法用于电机电流控制。 从前面几节可知,电机力矩来自于转子的q轴受磁力,而磁场强度与电流成正比,也就是说电机力矩与q轴电流成正相关,控制了…...
springcloud接入seata管理分布式事务
下载安装包 链接: seata 配置seata-server 文件上传Linux解压 压缩包我放在/usr/local/seata中 tar -zxvf seata-server-2.0.0.tar.gz修改配置文件 设置nacos为注册和配置中心 进入文件夹 cd /usr/local/seata/seata/conf修改application.yml文件 ...... ...... cons…...
Android APP 音视频(02)MediaProjection录屏与MediaCodec编码
说明: 此MediaProjection 录屏和编码实操主要针对Android12.0系统。通过MediaProjection获取屏幕数据,将数据通过mediacodec编码输出H264码流(使用ffmpeg播放),存储到sd卡上。 1 MediaProjection录屏与编码简介 这里…...
java中log4j.properties配置文件浅析
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可按keyvalue格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。 1、配置文件 Log4J配置文件的基本格式如下: #配置根Logger log4j.roo…...
RV1126 Linux 系统,接外设,时好时坏(二)排查问题的常用命令
在 RV1126 Linux 系统中,排查外设连接问题时,可以使用多种命令来诊断和调试。以下是一些常用的命令和工具: 1. 查看系统日志 dmesg: 显示内核环形缓冲区的消息,通常包含设备初始化、驱动加载和错误等信息。 dmesg | grep <设备名或相关关键字>journalctl: 查看系统…...
鸿蒙北向开发 DevEco Studio 4.1 下载安装傻瓜式教程
开篇 由于鸿蒙处于快速发展中,鸿蒙的api快速迭代更新,老版本的DevEco studio无法支持更新版本的api,因此华为官网放弃了老版本的维护.直接从华为开发者官网无法下载老版本,当前华为开发者官网已经推出next版本了 DevEco studio3.1安装教程 上述教程提供的华为开发者官网地址已经…...
pglogical扩展的基本用法介绍
瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:14 文档用途 本文翻译了pglogical扩展的官方文档,介绍了pglogical扩展的各类管理函数及使用限制,详情请看下文. 一、节点管理 节点可以使用以下…...
2024年虚拟主机转移教程
转移网站并不困难,但选择正确的选项和最佳程序才是关键。网站托管服务被视为当今数字世界的基石,全球有18 亿个网站。网站所有者可以通过下载备份、将其上传到新服务器并指向域名来手动转移网站。他们还可以通过新网站托管商的助手请求来移动网站。对于初…...
Python 函数对象和函数调用
Python 函数对象和函数调用 在 Python 中,函数是第一类对象(first-class objects)。这意味着函数可以像其他对象(如整数、字符串、列表等)一样被传递、赋值和操作。理解函数对象和函数调用的区别是学习 Python 的关键…...
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?
Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
3-11单元格区域边界定位(End属性)学习笔记
返回一个Range 对象,只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意:它移动的位置必须是相连的有内容的单元格…...
快刀集(1): 一刀斩断视频片头广告
一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
学习一下用鸿蒙DevEco Studio HarmonyOS5实现百度地图
在鸿蒙(HarmonyOS5)中集成百度地图,可以通过以下步骤和技术方案实现。结合鸿蒙的分布式能力和百度地图的API,可以构建跨设备的定位、导航和地图展示功能。 1. 鸿蒙环境准备 开发工具:下载安装 De…...
若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...
【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
