微服务中的日志管理 — ELK

微服务中的日志管理 — ELK通过使用微服务,我们能够解决许多在单体应用中暴露的问题,并且它允许我们创建稳定的分布式应用程序,并对代码,团队规模,维护,发布周期,云计算等进行所需要的控制。但同时微服务也引入了一些挑战,例如分布式日志管理和查看。需要提供在众多服务中查看分布的完整事务日志和分布式调试的能力。实际上,挑战在于微服务是相互隔离的,它们不共享公共数据库和日志文件。随着微服务数量的增加以及我们使用自动化持续集成工具实现…

大家好,又见面了,我是你们的朋友全栈君。

通过使用微服务,我们能够解决许多在单体应用中暴露的问题,并且它允许我们创建稳定的分布式应用程序,并对代码,团队规模,维护,发布周期,云计算等进行所需要的控制。但同时微服务也引入了一些挑战,例如分布式日志管理和查看。需要提供在众多服务中查看分布的完整事务日志和分布式调试的能力。

实际上,挑战在于微服务是相互隔离的,它们不共享公共数据库和日志文件。随着微服务数量的增加以及我们使用自动化持续集成工具实现云部署,当我们遇到任何问题时,非常有必要对组件进行调试。

幸运的我们已经拥有了一系列工具,可将它们一起使用发挥魔力。一组流行的工具是Elastic Search,Logstash和Kibana —— 放在一起被称为ELK堆栈。它们用于实时搜索,分析和可视化日志数据。

在本文中,介绍了如何将ELK堆栈集成到微服务生态系统中。

1. 什么是ELK

  • Elasticsearch是一种基于JSON的分布式搜索和分析引擎,提供水平可扩展性,为高可靠性和易管理性而设计。
  • Logstash是一个动态数据收集管道,具有可扩展的插件生态系统和强大的Elasticsearch协同作用。
  • Kibana通过 UI 提供数据可视化。

ELK 架构

Logstash根据我们设置的过滤条件处理应用程序日志文件,并将这些日志发送到Elasticsearch。通过Kibana,我们可以在需要时查看和分析这些日志。

ELK操作方式

2. ELK安装

所有这三个工具都基于JVM,在开始安装之前,请验证JDK是否已正确配置。检查标准JDK 1.8安装,JAVA_HOME并且PATH已经完成设置。

2.1 Elasticsearch

  • 从此下载页面下载最新版本的Elasticsearch 并将其解压缩到任何文件夹中。
  • 在命令提示符下运行bin\elasticsearch.bat。
  • 默认情况下,它可从http://localhost:9200开始访问

2.2 Kibana

  • 下载页面下载最新的发行版并解压缩到任何文件夹中。
  • 在编辑器中打开config/kibana.yml,并设置elasticsearch.url指向您的Elasticsearch实例。在我们的例子中,elasticsearch.url: “http://localhost:9200
  • 在命令提示符下运行bin\kibana.bat。
  • 成功启动后,Kibana将启动默认端口5601,Kibana UI将通过http://localhost:5601访问

2.3 Logstash

  • 下载页面下载最新的发行版并解压缩到任何文件夹中。
  • 根据配置说明创建一个文件logstash.conf。我们将在后面实际演示时再次确定配置。
  • 现在运行bin/logstash -f logstash.conf以启动logstash。

3. 创建微服务

3.1 创建Spring Boot项目

让我们使用spring boot创建一个应用程序。MAVEN依赖如下:

<parent>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-parent</artifactId>
	<version>1.5.6.RELEASE</version>
	<relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
	<java.version>1.8</java.version>
</properties>

<dependencies>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-data-rest</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-web</artifactId>
	</dependency>

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>

<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
		</plugin>
	</plugins>
</build>

3.2 添加REST端点

新建一个RestController类来暴露一些端点/elk,/elkdemo,/exception。实际上我们只是输出了几个日志语句,因此可以根据您的选择随意添加/修改日志。

@RestController
public class ELKController {
	private static final Logger LOG = Logger.getLogger(ELKController.class.getName());
	
	@Autowired
	RestTemplate restTemplete;
	
	@Bean
	RestTemplate restTemplate() {
		return new RestTemplate();
	}
	
	@RequestMapping(value = "/elkdemo")
	public String helloWorld() {
		String response = "Hello user ! " + new Date();
		LOG.log(Level.INFO, "/elkdemo - > " + response);

		return response;
	}
	
	@RequestMapping(value = "/exception")
	public String exception() {
		String rsp = "";
		try {
			int i = 1 / 0;
			// should get exception
		} catch (Exception e) {
			e.printStackTrace();
			LOG.error(e);
			
			StringWriter sw = new StringWriter();
			PrintWriter pw = new PrintWriter(sw);
			e.printStackTrace(pw);
			String sStackTrace = sw.toString(); // stack trace as a string
			LOG.error("Exception As String :: - > "+sStackTrace);
			
			rsp = sStackTrace;
		}

		return rsp;
	}
	
	@RequestMapping(value = "/elk")
	public String helloWorld1() {

		String response = restTemplete.exchange("http://localhost:8080/elkdemo", HttpMethod.GET, null, new ParameterizedTypeReference<String>() {
		}).getBody();
		LOG.log(Level.INFO, "/elk - > " + response);

		try {
			String exceptionrsp = restTemplete.exchange("http://localhost:8080/exception", HttpMethod.GET, null, new ParameterizedTypeReference<String>() {
			}).getBody();
			LOG.log(Level.INFO, "/elk trying to print exception - > " + exceptionrsp);
			response = response + " === " + exceptionrsp;
		} catch (Exception e) {
			// exception should not reach here. Really bad practice :)
		}

		return response;
	}
}

3.3 配置Spring boot Logging

logging.file=elk-example.log
spring.application.name = elk-example

3.4 验证微服务生成的日志

构建并启动应用程序,通过浏览器访问http://localhost:8080/elk。会看到一些异常信息输出。

转到应用程序根目录并检查是否已创建日志文件elk-example.log,并对端点执行几次访问并验证日志文件中是否添加了日志。

4. Logstash配置

我们需要创建一个logstash配置文件,以便让它监听日志文件并将日志消息推送到Elasticsearch。以下是示例中介绍了logstash 配置,请根据你的设置更改日志路径。

input {
  file {
    type => "java"
    path => "D:/eclipse-workspace/java-samples/elk-example-spring-boot/elk-example.log"
    codec => multiline {
      pattern => "^%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME}.*"
      negate => "true"
      what => "previous"
    }
  }
}
 
filter {
  #If log line contains tab character followed by 'at' then we will tag that entry as stacktrace
  if [message] =~ "\tat" {
    grok {
      match => ["message", "^(\tat)"]
      add_tag => ["stacktrace"]
    }
  }
 
 grok {
    match => [ "message",
               "(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} --- \[(?<thread>[A-Za-z0-9-]+)\] [A-Za-z0-9.]*\.(?<class>[A-Za-z0-9#_]+)\s*:\s+(?<logmessage>.*)",
               "message",
               "(?<timestamp>%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} --- .+? :\s+(?<logmessage>.*)"
             ]
  }
 
  
  date {
    match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]
  }
}
 
output {
   
  stdout {
    codec => rubydebug
  }
 
  # Sending properly parsed log events to elasticsearch
  elasticsearch {
    hosts => ["localhost:9200"]
  }
}

5. Kibana配置

在查看Kibana中的日志之前,我们需要配置索引模式。我们可以配置logstash-*为默认配置。

在Kibana中,打开“Management”,然后单击“Index Patterns”。如果这是你的第一个索引模式,则会自动打开“Create index pattern”页面。 否则,单击左上角的“Create index pattern”。在索引模式Index pattern 字段中输入logstash-*。

创建索引模式

单击下一步Next step。在配置设置Configure settings中,在时间过滤器字段名称Time Filter field name下拉菜单中选择@timestamp。

时间过滤器

注意:
定义索引模式时,与该模式匹配的索引必须存在于Elasticsearch中,并且它们必须包含数据。 要检查哪些索引可用,
可使用curl -XGET “http://localhost:9200/_cat/indices?v”。

索引模式管理页面如下所示。通过这种配置,我们将Kibana指向你选择的Elasticsearch索引。Logstash使用名称模式创建索引,名称格式为logstash-YYYY.MM.DD

索引模式管理

6.验证

现在,当所有组件都启动并运行时,让我们验证整个生态系统。

转到应用程序并访问端点几次以便生成日志,然后转到Kibana控制台,看看日志是否正确堆叠在Kibana中,还有许多额外的功能,比如我们可以过滤,查看内置的不同图表等。

以下是Kibana中生成的日志的视图。

Kibana视图

7. 总结

在这个ELK示例中,我们学习了如何配置ELK堆栈以及如何将应用程序日志文件指向ELK,并查看和分析Kibana中的日志。除了演示的这些功能外还可以有很多其他的配置。例如:

  • 不是监听我们的日志文件,我们可以通过logback配置来使用TCP appender,通过TCP协议将日志发送到远程Logstash实例。
  • 我们可以使用Logstash指向多个日志文件。
  • 我们可以在logstash配置文件中使用更复杂的过滤器,以根据需要执行更多操作。
  • 我们可以使用远程ELK集群指向我们的日志文件,或者将日志推入,这在将应用程序部署到云中时是必需的。
  • 在logstash中创建不同的索引模式。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134700.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java事务_Java 事务详解[通俗易懂]

    java事务_Java 事务详解[通俗易懂]一、事务(1)事务(Transaction),一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。(2)事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。原子性(atomicity)。一个事务是一个不可分割的工作单位。比如A向B转账1000元,那么这就一定要保证原子性(要么同时成功,要么同时失败)。一致性…

    2022年10月13日
    2
  • 用PHPMailer在本地win环境,可以接收到邮件和附件,但在linux环境只能接收邮件信息接不到附件,是我的路…

    用PHPMailer在本地win环境,可以接收到邮件和附件,但在linux环境只能接收邮件信息接不到附件,是我的路…

    2021年9月25日
    39
  • JVM内存模型详解(1.7与1.8的区别)[通俗易懂]

    JVM内存模型详解(1.7与1.8的区别)[通俗易懂]文章目录1.JDK、JRE、JVM关系2.JAVA程序的运行(为什么java可以跨平台)3.JVM运行时数据区1.JDK、JRE、JVM关系从图中就可以很清晰的看清他们之间的关系:JDK>JRE>JVM2.JAVA程序的运行(为什么java可以跨平台)比如我们编写一个HelloWord.java,他是如何运行的呢因为有JVM,所以我们在不同平台只需要下载对应的JDK即可…

    2022年5月16日
    47
  • mysql查看表结构的几种方式

    在我第N次忘记如何查看表结构后,在网上查了一下后,看到有好几种查看表结构的方式,总结一下。以student(sid,sname,birthday,sex)的查看为例。【方式一】:descstudent;语法:desc表名;———————用于查看表整体结构【方式二】:describestudent;…

    2022年4月3日
    199
  • Drone2Map:如何使用带有POS信息的无人机数据生成三维模型「建议收藏」

    Drone2Map:如何使用带有POS信息的无人机数据生成三维模型「建议收藏」使用Drone2Map生成slpk,将slpk加载至ArcGISPro中,slpk悬浮在空中。首先想到的是在pro中调整一下模型高度不就行了,遗憾的是slpk格式是压缩包,不支持模型高度的调整,所以,就必须追根溯源,考虑在Drone2Map生成三维模型的过程中如何解决此问题。 问题分析:一般用户拿到的无人机数据,基本分为两种,一种是无人机拍摄的照片自身带有xyz

    2022年8月15日
    5
  • dell计算机运行慢怎么解决方法,戴尔笔记本电脑运行速度慢怎么办?

    dell计算机运行慢怎么解决方法,戴尔笔记本电脑运行速度慢怎么办?戴尔笔记本电脑运行速度慢怎么办?戴尔(Dell),是一家总部位于美国德克萨斯州朗德罗克的世界五百强企业,由迈克尔·戴尔于1984年创立。戴尔以生产、设计、销售家用以及办公室电脑而闻名,不过它同时也涉足高端电脑市场,生产与销售服务器、数据储存设备、网络设备等。下面是小编收集整理的戴尔笔记本电脑运行速度慢的解决方法,欢迎阅读。戴尔笔记本电脑运行速度慢的解决方法用户在购买电脑的时候,如果预装了Win8系…

    2025年10月26日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号