您的日志就是您的数据: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;能够读取…

python字符串常见操作

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

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

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

[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;这个系列可能不…

方法内联在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;在提供了正则表…

Java并发:隐藏线程死锁

大多数Java程序员熟悉Java线程死锁概念。 它本质上涉及2个线程&#xff0c;它们彼此永远等待。 这种情况通常是平面&#xff08;同步&#xff09;或ReentrantLock&#xff08;读或写&#xff09;锁排序问题的结果。 Found one Java-level deadlock:"pool-1-thread-2"…

vue中使用axios发送请求

我们知道&#xff0c;vue2.0以后&#xff0c;vue就不再对vue-resource进行更新&#xff0c;而是推荐axios&#xff0c;而大型项目都会使用 Vuex 来管理数据&#xff0c;所以这篇博客将结合两者来发送请求 1.安装axios cnpm i axios -S 2.方案一&#xff1a;修改原型链 首先&…

django缓存

由于Django是动态网站&#xff0c;所有每次请求均会去数据进行相应的操作&#xff0c;当程序访问量大时&#xff0c;耗时必然会更加明显&#xff0c;最简单解决方式是使用&#xff1a;缓存&#xff0c;缓存将一个某个views的返回值保存至内存或者memcache中&#xff0c;5分钟内…

linux 输入法成繁体字_寻找Ubuntu中繁体字输入法

当客户来自港台地区时&#xff0c;英文和繁体字就成了交流的主要工具。windows下我们有搜狗输入法可以切换简体与繁体&#xff0c;那么Ubuntu下怎么办&#xff1f;這是我第一次考慮這個問題&#xff0c;在我的印象裏Linux下的中文輸入法還不是那麼完善&#xff0c;所以我進行了…

vue跨域解决方法

vue跨域解决方法 vue项目中&#xff0c;前端与后台进行数据请求或者提交的时候&#xff0c;如果后台没有设置跨域&#xff0c;前端本地调试代码的时候就会报“No Access-Control-Allow-Origin header is present on the requested resource.” 这种跨域错误。 要想本地正常的调…

CSS盒子模型之详解

前言&#xff1a; 盒子模型是css中最核心的基础知识&#xff0c;理解了这个重要的概念才能更好的排版&#xff0c;进行页面布局。一、css盒子模型概念 CSS盒子模型 又称框模型 (Box Model) &#xff0c;包含了元素内容&#xff08;content&#xff09;、内边距&#…

LeetCode的二分查找的练习部分总结

这两天由于工作的原因&#xff0c;一直没有写博客&#xff0c;但是却把LeetCode上面的题目做了不少——二分查找。上面这些题都是这两天写的。现在简单做一个总结。 首先二分查找的思想就是对一个有规律的元素&#xff08;事情&#xff09;进行不断的排除&#xff0c;最后找到符…

在Mac上安装IntelliJ IDEA

在Mac上安装IntelliJ IDEA http://www.jetbrains.com/idea/documentation/ 入门视频 这篇文章旨在介绍如何在Mac系统上安装IntelliJ IDEA&#xff0c;至于IntelliJ IDEA的介绍和使用方法&#xff0c;大家另行查阅&#xff0c;本篇的文章不再详细阐述。 简短解说&#xff0c;I…

行内元素,块级元素,各自特点及其相互转化

作为一名小前端&#xff0c;块级元素、行内元素用了几千几万次&#xff0c;除了“块级独占一行&#xff0c;行内不独占”之外&#xff0c;对细节属性的了解十分匮乏&#xff0c;今天做以部分属性的测试和阐述。 一、 对物理属性的支持 元素类别widthheightpaddingmargin是否独…

从RSS Feed和YQL创建数据表

Yahoo Query Language&#xff08; YQL &#xff09;是一种查询语言&#xff0c;例如SQL。 使用YQL&#xff0c;我们可以跨Web服务 查询 &#xff0c; 过滤和联接数据。 YQL也可以阅读RSS feed。 响应可以是JSON或XML。 雅虎提供了一个YQL控制台&#xff0c;用于调试 &…

Qt之QSS(Q_PROPERTY-自定义属性)

版权声明&#xff1a;进步始于交流&#xff0c;收获源于分享&#xff01;纯正开源之美&#xff0c;有趣、好玩、靠谱。。。作者&#xff1a;一去丶二三里 博客地址&#xff1a;http://blog.csdn.net/liang19890820 目录(?)[] 简述 在Qt之QSS&#xff08;Q_PROPERTY-原始属性&a…

python print error 空_python笔记37:10分钟掌握异常处理,再也不担心程序挂了

主要内容&#xff1a;小目标&#xff1a;异常处理主要内容&#xff1a;错误与异常&#xff0c;try_except语句对于撸代码的程序员来说&#xff0c;程序运行中出现问题是常见的现象&#xff1b;实际学习与工作中&#xff0c;我们会花很大的精力去解决各种问题&#xff1b;1. 程序…