您的日志就是您的数据:logstash + elasticsearch

今天的帖子的主题与日常的编码和开发无关,但是涵盖了一个非常重要的主题:我们的应用程序日志文件。 我们的应用程序确实会生成大量日志,如果处理正确,则非常有助于解决问题。 如果您启动并运行一个应用程序并没什么大不了,但是如今,应用程序(特别是Web应用程序)可以在数百台服务器上运行。 有了这样的规模,找出问题所在就成为了挑战。 拥有某种视图将所有正在运行的应用程序中的所有日志聚合到单个仪表板中,这样我们就可以看到由碎片构成的整体画面,这不是很好吗? 请欢迎: Logstash ,日志聚合框架。

尽管它不是唯一可用的解决方案,但我发现Logstash易于使用且易于集成。 首先,我们甚至不需要在应用程序方面做任何事情, Logstash可以为我们完成所有工作。 让我介绍一个示例项目:具有某些多线程活动的独立Java应用程序。 使用出色的Logback库(配置为SLF4J可以无缝替换)对配置文件进行日志记录。 POM文件看起来非常简单:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelversion>4.0.0</modelversion><groupid>com.example</groupid><artifactid>logstash</artifactid><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><properties><project.build.sourceencoding>UTF-8</project.build.sourceencoding><logback.version>1.0.6</logback.version></properties><dependencies><dependency><groupid>ch.qos.logback</groupid><artifactid>logback-classic</artifactid><version>${logback.version}</version></dependency><dependency><groupid>ch.qos.logback</groupid><artifactid>logback-core</artifactid><version>${logback.version}</version></dependency></dependencies><build><plugins><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-compiler-plugin</artifactid><version>3.0</version><configuration><source>1.7<target>1.7</target></configuration></plugin></plugins></build>
</project>

而且只有一个名为Starter的 Java类,它使用Executors服务同时执行一些工作。 当然,每个线程都会进行一些日志记录,并且有时会引发异常。

package com.example.logstash;import java.util.ArrayList;
import java.util.Collection;
import java.util.Random;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class Starter {private final static Logger log = LoggerFactory.getLogger( Starter.class );public static void main( String[] args ) {final ExecutorService executor = Executors.newCachedThreadPool();final Collection< Future< Void > > futures = new ArrayList< Future< Void > >();final Random random = new Random();for( int i = 0; i < 10; ++i ) {futures.add( executor.submit(new Callable< Void >() {public Void call() throws Exception {int sleep = Math.abs( random.nextInt( 10000 ) % 10000 );log.warn( 'Sleeping for ' + sleep + 'ms' );Thread.sleep( sleep );return null;}}));}for( final Future< Void > future: futures ) {try {Void result = future.get( 3, TimeUnit.SECONDS );log.info( 'Result ' + result );} catch (InterruptedException | ExecutionException | TimeoutException ex ) {log.error( ex.getMessage(), ex );}   }}
}

这个想法不仅要演示简单的单行日志事件,还要演示著名的Java堆栈跟踪。 当每个线程睡眠随机的时间间隔时,每当从底层的Future对象请求计算结果并花费3秒钟以上的时间返回时,都会引发TimeoutException。 最后一部分是Logback配置( logback.xml ):

<configuration scan="true" scanperiod="5 seconds"><appender name="FILE" class="ch.qos.logback.core.FileAppender"><file>/tmp/application.log</file><append>true</append><encoder><pattern>[%level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %logger{36} - %msg%n</pattern></encoder></appender><root level="INFO"><appender-ref ref="FILE"></appender-ref></root>
</configuration>

而且我们很高兴去! 请注意,文件路径/tmp/application.log对应于Windows上的c:\ tmp \ application.log 。 运行我们的应用程序将用以下内容填充日志文件:

[WARN] 2013-02-19 19:26:03.175 [pool-2-thread-1] com.example.logstash.Starter - Sleeping for 2506ms
[WARN] 2013-02-19 19:26:03.175 [pool-2-thread-4] com.example.logstash.Starter - Sleeping for 9147ms
[WARN] 2013-02-19 19:26:03.175 [pool-2-thread-9] com.example.logstash.Starter - Sleeping for 3124ms
[WARN] 2013-02-19 19:26:03.175 [pool-2-thread-3] com.example.logstash.Starter - Sleeping for 6239ms
[WARN] 2013-02-19 19:26:03.175 [pool-2-thread-5] com.example.logstash.Starter - Sleeping for 4534ms
[WARN] 2013-02-19 19:26:03.175 [pool-2-thread-10] com.example.logstash.Starter - Sleeping for 1167ms
[WARN] 2013-02-19 19:26:03.175 [pool-2-thread-7] com.example.logstash.Starter - Sleeping for 7228ms
[WARN] 2013-02-19 19:26:03.175 [pool-2-thread-6] com.example.logstash.Starter - Sleeping for 1587ms
[WARN] 2013-02-19 19:26:03.175 [pool-2-thread-8] com.example.logstash.Starter - Sleeping for 9457ms
[WARN] 2013-02-19 19:26:03.176 [pool-2-thread-2] com.example.logstash.Starter - Sleeping for 1584ms
[INFO] 2013-02-19 19:26:05.687 [main] com.example.logstash.Starter - Result null
[INFO] 2013-02-19 19:26:05.687 [main] com.example.logstash.Starter - Result null
[ERROR] 2013-02-19 19:26:08.695 [main] com.example.logstash.Starter - null
java.util.concurrent.TimeoutException: nullat java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:258) ~[na:1.7.0_13]at java.util.concurrent.FutureTask.get(FutureTask.java:119) ~[na:1.7.0_13]at com.example.logstash.Starter.main(Starter.java:43) ~[classes/:na]
[ERROR] 2013-02-19 19:26:11.696 [main] com.example.logstash.Starter - null
java.util.concurrent.TimeoutException: nullat java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:258) ~[na:1.7.0_13]at java.util.concurrent.FutureTask.get(FutureTask.java:119) ~[na:1.7.0_13]at com.example.logstash.Starter.main(Starter.java:43) ~[classes/:na]
[INFO] 2013-02-19 19:26:11.696 [main] com.example.logstash.Starter - Result null
[INFO] 2013-02-19 19:26:11.696 [main] com.example.logstash.Starter - Result null
[INFO] 2013-02-19 19:26:11.697 [main] com.example.logstash.Starter - Result null
[INFO] 2013-02-19 19:26:12.639 [main] com.example.logstash.Starter - Result null
[INFO] 2013-02-19 19:26:12.639 [main] com.example.logstash.Starter - Result null
[INFO] 2013-02-19 19:26:12.639 [main] com.example.logstash.Starter - Result null

现在,让我们看看Logstash可以为我们做些什么。 从下载部分,我们获得了单个JAR文件: logstash-1.1.9-monolithic.jar 。 这就是我们现在所需要的。 不幸的是,由于Windows上的这个错误,我们必须将logstash-1.1.9-monolithic.jar扩展到festash-1.1.9-monolithic文件夹中。 Logstash刚刚三个概念: 输入 滤波器输出 。 这些在文档中有很好的解释。 在我们的例子中,输入是应用程序的日志文件c:\ tmp \ application.log 。 但是输出是什么? ElasticSearch似乎是一个很好的选择:让我们的日志可以随时索引和搜索。 让我们下载并运行它:

elasticsearch.bat -Des.index.store.type=memory -Des.network.host=localhost

现在我们准备好集成Logstash了 ,它应该拖尾我们的日志文件,并将其直接提供给ElasticSearch 。 以下配置完全可以做到这一点( logstash.conf ):

input {file {add_field => [ 'host', 'my-dev-host' ]path => 'c:\tmp\application.log'type => 'app'format => 'plain'}
}output {elasticsearch_http {host => 'localhost'port => 9200 type => 'app'flush_size => 10}
}filter {multiline {type => 'app'pattern => '^[^\[]'what => 'previous'  }
}

乍一看可能看起来不太清楚,但让我解释一下是什么。 因此,输入为c:\ tmp \ application.log ,这是一个纯文本文件( format =>'plain' )。 类型=>'app'用作简单标记,因此可以通过具有相同类型的过滤器将不同类型的输入路由到输出。 add_field => ['host','my-dev-host']允许向传入流fe主机名中注入其他任意数据。

输出非常清晰:通过HTTP的ElasticSearch ,端口9200(默认设置)。 过滤器需要一点魔术,所有这些都是由于Java堆栈跟踪。 多行过滤器会将堆栈跟踪粘贴到其所属的log语句,因此将其存储为单个(大)多行。 让我们运行Logstash :

java -cp logstash-1.1.9-monolithic logstash.runner agent -f logstash.conf

大! 现在,每当我们运行应用程序时, Logstash都会监视日志文件,对其进行过滤,然后将其直接发送到ElasticSearch 。 很酷,但是我们如何进行搜索或至少查看我们拥有什么样的数据? 虽然ElasticSearch有真棒REST API,我们可以用另一种优秀的项目, Kibana ,web用户界面前端为ElasticSearch 。 安装非常简单,无缝。 经过一些必要的步骤后,我们启动了Kibana并开始运行:

ruby kibana.rb

默认情况下, Kibana在端口5601上提供了可用的Web UI,让我们将浏览器指向它,即http:// localhost:5601 / ,我们应该看到类似的内容(请单击图像放大):


我们所有的日志语句(由主机名补充)都在那里。 异常(带有堆栈跟踪)与相关的log语句结合在一起。 日志级别,时间戳,所有内容均已显示。 借助ElasticSearch ,可以立即使用全文搜索。

一切都很棒,但是我们的应用程序非常简单。 这种方法是否可以跨多服务器/多应用程序部署工作? 我很确定它将正常工作。 Logstash与Redis , ZeroMQ , RabbitMQ … 的集成允许捕获来自数十个不同来源的日志并将其合并到一个位置。 非常感谢Logstash伙计们!

参考: 您的日志就是您的数据:来自Andry Redko {devmind}博客的JCG合作伙伴 Andrey Redko的logstash + elasticsearch 。

翻译自: https://www.javacodegeeks.com/2013/02/your-logs-are-your-data-logstash-elasticsearch.html

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

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

相关文章

关于C++中二维vector使用

https://blog.csdn.net/u014453443/article/details/98057251

面向对象设计与构造第一次总结作业

第一次作业——多项式计算 ---结构分析 第一次作业我只使用了两个类&#xff0c;正像下面的类图所表示的那样&#xff0c;分别是Poly和ComputePoly。Poly类是不可变的&#xff0c;能保存一个多项式&#xff0c;可以进行加、减运算。ComputePoly是程序的主类&#xff0c;能够读取…

想提升java知识的同学请进

这是我最近在整理的笔记&#xff0c;大家可以看看。 https://www.gitbook.com/book/jackal007/java_more/ 如果觉得有问题可以提出&#xff0c;随时修改。 这个笔记是我花了好多时间看各种书籍&#xff0c;博客后整理的&#xff0c;希望能帮助到更多的朋友。转载于:https://www…

mysql 3种报错_MySQL读取Binlog日志常见的3种错误-阿里云开发者社区

MySQL读取Binlog日志常见的3种错误mysqlbinlog: [ERROR] unknown variable default-character-setutf8mb4当我们在my.cnf中添加default-character-setutf8mb4选项&#xff0c;那么在mysqlbinlog查看binlog时就会报错。解决方案&#xff1a;.mysqlbinlog 后面添加 --no-defaults…

膨胀的JavaBeans –不要在您的API中添加“ Getters”

我已经最近在博客的想法的JavaBeans™如何可以扩展以减少在Java世界中&#xff0c;这被广泛接受的公约设立的膨胀。 该文章在DZone上重新发布&#xff0c;并在这里获得了颇具争议的反馈&#xff08;例如&#xff0c;大多数试图将一些新想法带入Java世界的想法&#xff09;。 我…

css:hover伪类的使用

&#xff1a;hover的使用&#xff0c;即当鼠标指针移入元素时&#xff0c;所做出的样式设置 示例一 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>demo01</title><style>*{margin: 0;p…

Redis内存淘汰机制

转自&#xff1a;https://my.oschina.net/andylucc/blog/741965 摘要 Redis是一款优秀的、开源的内存数据库&#xff0c;我在阅读Redis源码实现的过程中&#xff0c;时时刻刻能感受到Redis作者为更好地使用内存而费尽各种心思&#xff0c;例如最明显的是对于同一种数据结构在不…

python字符串常见操作

字符串常见操作 如有字符串mystr hello world itcast and itcastcpp&#xff0c;以下是常见的操作 <1>find 检测 str 是否包含在 mystr中&#xff0c;如果是返回开始的索引值&#xff0c;否则返回-1 mystr.find(str, start0, endlen(mystr))<2>index 跟find()方法…

mysql数据库的体系结构包括什么组件_MySQL数据库的体系结构

MySQL体系结构遵循C/S模型&#xff0c;即客户机/服务器模型&#xff0c;MySQL客户机通过原生的多种接口&#xff0c;可以与MySQL服务器进行交互。MySQL数据库是单进程多线程的架构&#xff0c;同windows平台下的Oracle数据库与全平台下的达梦数据库一样&#xff0c;采取单进程多…

同步多线程集成测试

测试线程非常困难&#xff0c;这使得为要测试的多线程系统编写良好的集成测试非常困难。 这是因为在JUnit中&#xff0c;测试代码&#xff0c;被测对象和任何线程之间没有内置的同步。 这意味着&#xff0c;当您必须为创建并运行线程的方法编写测试时&#xff0c;通常会出现问题…

调整图像的灰度级数C++实现

图像灰度级数我们见得最多的就是256了&#xff0c;如果想调整它的灰度级数&#xff0c;我们可以使用图像库的imadjust函数来作出调整&#xff0c;比如讲256个灰度级变成2个灰度级&#xff08;也就是二值图了&#xff09;。再举一个例子&#xff0c;原来一幅256个灰度级的图像&a…

angular4获得焦点事件_Angular 4 文本框自动获取焦点二

Angular是不推荐直接通过DOM操作获取元素的&#xff0c;要操作元素就通过ViewChild装饰器。在HTML中对元素添加引用myInput&#xff1a;在ts中可以通过ViewChild获取指定元素的引用&#xff1a;import { ViewChild } from angular/core;ViewChild(myInput) input;获取到对应元素…

Bootstrap源码解读之栅格化篇

本文纯属自己研究所写笔记&#xff0c;如果有错误还请多多指教提出 版心(container) 版心&#xff1a;class名为.container的容器&#xff0c;其版心的宽度在各个屏幕设备下是不一样的值&#xff0c;版心两边就是留白。 各尺寸下版心宽度如下表&#xff1a; 屏幕设备版心宽度ma…

EasyCriteria 2.0 – JPA标准应该很容易

在今天的帖子中&#xff0c;我们将看到名为EasyCriteria的框架的新版本。 在这篇文章的结尾&#xff0c;我们将在博客中看到这里的内容。 不幸的是&#xff0c;JPA标准存在一个巨大的问题&#xff0c;即冗长。 为什么不变得更简单&#xff1f; 像这样认为EasyCriteria框架已经诞…

[BZOJ2095][Poi2010]Bridges 最大流(混合图欧拉回路)

2095: [Poi2010]Bridges Time Limit: 10 Sec Memory Limit: 259 MBDescription YYD为了减肥&#xff0c;他来到了瘦海&#xff0c;这是一个巨大的海&#xff0c;海中有n个小岛&#xff0c;小岛之间有m座桥连接&#xff0c;两个小岛之间不会有两座桥&#xff0c;并且从一个小岛…

excel和python建模_利用Excel学习Python:准备篇

写在前面这个系列我们要利用Excel的知识&#xff0c;学会用python进行数据分析&#xff0c;如果你精通Excel想要用python提高数据分析效率&#xff0c;那么这个系列你来对了&#xff0c;如果你已经是python大神&#xff0c;想要建模/算法等高级技巧的&#xff0c;这个系列可能不…

故障公告:IIS应用程序池停止工作造成博客站点无法访问

非常抱歉&#xff0c;今天凌晨博客站点负载均衡中所有3台服务器的IIS应用程序池突然停止工作&#xff0c;造成 1:20-7:45 左右博客站点无法正常访问&#xff0c;由此给您带来很大的麻烦&#xff0c;请您谅解。 服务器操作系统是 Windows Server 2016&#xff0c;对应的 IIS 错误…

前端HTML以及HTML5(基本标签)

前面一章介绍了一下前端的发展&#xff0c;这章简单介绍一下html的发展以及基本的标签。 一、HTML的发展史 1、概念 超文本标记语言&#xff08;HyperText Markup Language&#xff0c;简称HTML&#xff09;是为 [ 网页创建和其他可在浏览器中看到的信息 ] 设计的一种标记语言…

方法内联在JVM中有多积极?

IntelliJ IDEA中使用Ctrl Alt M 提取方法 。 Ctrl Alt M。 这就像选择一段代码并按此组合一样简单。 Eclipse也有它 。 我讨厌冗长的方法。 对于我来说&#xff0c;闻起来太久了&#xff1a; public void processOnEndOfDay(Contract c) {if (DateUtils.addDays(c.getCrea…

Python正则表达式基础

1. 正则表达式基础 1.1. 简单介绍 正则表达式并不是Python的一部分。正则表达式是用于处理字符串的强大工具&#xff0c;拥有自己独特的语法以及一个独立的处理引擎&#xff0c;效率上可能不如str自带的方法&#xff0c;但功能十分强大。得益于这一点&#xff0c;在提供了正则表…