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() 来记录日志。在上面的代码中,我们使用了三种方式来记录日志:

  1. LOG.info(homeMessage);
  2. 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"));
    
  3. 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 应用程序中提取日志

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Prometheus各类监控及监控指标和告警规则

目录 linux docker监控 linux 系统进程监控 linux 系统os监控 windows 系统os监控 配置文件&告警规则 Prometheus配置文件 node_alert.rules docker_container.rules mysql_alert.rules vmware.rules Alertmanager告警规则 consoul注册服务 Dashboard JSON…

GD 32 流水灯

前言&#xff1a; 通过后面的学习掌握了一些逻辑架构的知识&#xff0c;通过复习的方式将学到的裸机任务架构的知识运用起来&#xff0c;同时巩固前面学到的知识&#xff0c;GPIO的配置等。 开发板上LED引脚使用示意图 注&#xff1a;此次LED灯的点亮凡是是高电平点亮&#xff…

如何解决ChromeDriver 126找不到chromedriver.exe问题

引言 在使用Selenium和ChromeDriver进行网页自动化时&#xff0c;ChromeDriver与Chrome浏览器版本不匹配的问题时有发生。最近&#xff0c;许多开发者在使用ChromeDriver 126时遇到了无法找到chromedriver.exe文件的错误。本文将介绍该问题的原因&#xff0c;并提供详细的解决…

【第一天】计算机网络 TCP/IP模型和OSI模型,从输入URL到页面显示发生了什么

TCP/IP模型和OSI模型 这两个模型属于计算机网络的体系结构。 OSI模型是七层模型&#xff0c;从上到下包括&#xff1a; 应用层&#xff0c;表示层&#xff0c;会话层&#xff0c;传输层&#xff0c;网络层&#xff0c;数据链路层&#xff0c;物理层 TCP/IP模型是四层模型&…

uniapp原生插件开发实战——iOS打开文件到自己的app

用原生开发获取文件的名称、路径等能力封装为一个插件包供前端使用 首先根据ios插件开发教程&#xff0c;创建一个插件工程&#xff0c;template 选framework 开始编写代码&#xff1a; iOS 9 及以下版本会调用以下方法&#xff1a; - (BOOL)application:(UIApplication *_N…

关键词查找【Boyer-Moore 算法】

1、【Boyer-Moore 算法】 【算法】哪种算法有分数复杂度&#xff1f;- BoyerMoore字符串匹配_哔哩哔哩_bilibili BM算法的精华就在于BM(text, pattern),也就是BM算法当不匹配的时候一次性可以跳过不止一个字符。即它不需要对被搜索的字符串中的字符进行逐一比较&#xff0c;而…

HTML前端面试题之<iframe>标签

面试题&#xff1a;iframe 标签的作用是什么?有哪些优缺点 ? 讲真&#xff0c;刷这道面试题之前我根本没有接触过iframe&#xff0c;网课没讲过&#xff0c;项目实战没用过&#xff0c;但却在面试题里出现了&#xff01;好吧&#xff0c;我只能说&#xff1a;前端路漫漫&…

2024年软件系统与信息处理国际会议(ICSSIP 2024)即将召开!

2024年软件系统与信息处理国际会议&#xff08;ICSSIP 2024&#xff09;将于2024年10月25-27日在中国昆明举行。引领技术前沿&#xff0c;共谋创新未来。ICSSIP 2024将汇聚来自世界各地的专家学者&#xff0c;他们将在会上分享最新的研究成果、技术突破及实践经验。会议议题涵盖…

DataEase一键部署:轻松搭建数据可视化平台

DataEase是一个开源的数据可视化和分析工具&#xff0c;旨在帮助用户轻松创建和共享数据仪表盘。它支持多种数据源&#xff0c;包括关系型数据库&#xff0c;文件数据源&#xff0c;NoSQL数据库等&#xff0c;提供强大的数据查询、处理和可视化功能。DataEase 不仅是一款数据可…

通信原理-思科实验四:静态路由项配置实验

实验四 静态路由项配置实验 一&#xff1a;实验内容 二&#xff1a;实验目的 三、实验原理 四、实验步骤 选择三个2811型号的路由器 R1、R2、R3 路由器默认只有两个快速以太网接口&#xff0c;为路由器R1和R3增加快速以太网接口模块NM-1FE-TX&#xff0c;安装后检查路由器的接…

【电源专题】结合锂电池相关资料和华为手机聊聊锂离子电池使用条件限制

在文章:【电源专题】锂电池的特点和工作原理 中我们讲到了一些关于锂电池种类和特点、工作原理等。但是对于锂离子电池使用条件限制却没有介绍,本文基于手机产商 锂离子电池使用条件-电池性能和应用介绍 | 华为官网 (huawei.com)提供的介绍文档再次深入学习锂离子电池的一些特…

bug+测试用例

bug的概念&#xff1a; 1.当且仅当规格说明是存在的并且正确&#xff0c;程序与规格说明之间的不匹配才是错误。 2.当需求规格说明书没有提到的功能&#xff0c;判断标准以最终用户为准&#xff1b;当程序没有实现其最终用户合理预期的功能要求时&#xff0c;就是软件错误 bug…

区块链浏览器开发指南分享

01 概括 区块链浏览器是联盟链上的一种数据可视化工具&#xff0c;用户可以通过web页面&#xff0c;直接在浏览器上查看联盟链的节点、区块、交易信息和子链信息、标识使用信息等&#xff0c;用以验证交易等区块链常用操作。 02功能模块 区块链网络概览 区块链网络概览显示…

【Linux】进程IO|系统调用|open|write|文件描述符fd|封装|理解一切皆文件

目录 ​编辑 前言 系统调用 open 参数flags 参数mode write 追加方式 read close 文件描述符 打开多个文件并观察其文件描述符 C语言文件操作 理解一切皆文件 理解open操作 前言 各类语言的文件操作其实是对系统调用的封装 我们经常说&#xff0c;创建一个文件&a…

【数据结构】顺序表(杨辉三角、简单的洗牌算法)

&#x1f387;&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳&#xff0c;欢迎大佬指点&#xff01; 欢迎志同道合的朋友一起加油喔 &#x1f4aa;&#x1f4aa;&#x1f4aa; 谢谢你这么帅…

MySQL可重复读的隔离机制下是否彻底解决了幻读?

答案&#xff1a;没有彻底解决。 一、什么是幻读&#xff1f; 当同一个查询在不同时间产生不同的结果集时&#xff0c;事务中就会出现幻读问题。 幻读关注的是记录数量的不同。 不可重复读关注的是记录内容的不同。 二、快照读和当前读 InnoDB引擎的默认隔离级别是可重复读&…

音视频入门基础:H.264专题(17)——FFmpeg源码获取H.264裸流文件信息(视频压缩编码格式、色彩格式、视频分辨率、帧率)的总流程

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…

Spark 运行架构

运行架构 Spark 框架的核心是一个计算引擎&#xff0c;整体来说&#xff0c;它采用了标准的 master-slave 结构。上图中的 Driver 表示 master &#xff0c;负责管理整个集群中的作业任务调度&#xff1b;Executor 则是 slave&#xff0c;负责实际执行任务&#xff1b; 核心组…

深入解析:百数平台图表联动功能设置与实战应用

在当今数据驱动的时代&#xff0c;图表的联动功能已成为数据分析的得力助手。通过深度整合各类图表&#xff0c;如柱形图、折线图、饼图、雷达图、条形图、透视图、面积图、双轴图、地图以及漏斗图等&#xff0c;我们实现了图表之间的无缝衔接&#xff0c;使得数据的呈现与探索…

Spring Boot的Web开发

目录 Spring Boot的Web开发 1.静态资源映射规则 第一种静态资源映射规则 2.enjoy模板引擎 3.springMVC 3.1请求处理 RequestMapping DeleteMapping 删除 PutMapping 修改 GetMapping 查询 PostMapping 新增 3.2参数绑定 一.支持数据类型: 3.3常用注解 一.Request…