在项目初期的时候,大家都是赶着上线,一般来说对日志没有过多的考虑,当然日志量也不大,所以用log4net就够了,随着应用的越来越多,日志散

落在各个服务器的logs文件夹下,确实有点不大方便,这个时候就想到了,在log4net中配置 mysql的数据源,不过这里面有一个坑,熟悉log4net的同学知

道写入mysql有一个batch的阈值,比如说batchcache中有100条,才写入mysql,这样的话,就有一个延迟的效果,而且如果batchcache中不满100条的话,

你在mysql中是看不到最新的100条日志。。。而且采用中心化的mysql,涉及到tcp传输,其中的性能大家也应该明白,而且mysql没有一个好的日志界面,

只能自己去写UI,所以还还得继续寻找其他的解决方案,也就是本篇的ELK。

一:ELK名字解释

    ELK就是ElasticSearch + LogStash + Kibana,这三样搭配起来确实非常不错,先画张图给大家看一下。

1. LogStash

它可以流放到各自的服务器上收集Log日志,通过内置的ElasticSearch插件解析后输出到ES中。

2.ElasticSearch

这是一个基于Lucene的分布式全文搜索框架,可以对logs进行分布式存储,有点像hdfs哈。。。

3. Kibana

所有的log日志都到ElasticSearch之后,我们需要给他展示出来,对吧? 这个时候Kibana就出手了,它可以多维度的展示es中的数据。这也解决了

用mysql存储带来了难以可视化的问题。

二:快速搭建

上面只是名词解释,为了演示,我只在一台centos上面搭建了。

1.  官方下载 :https://www.elastic.co/cn/products,在下面这张图上,我们找到对应的三个产品,进行下载就好了。

[root@slave1 myapp]# ls
elasticsearch kafka_2.-1.0..tgz nginx-1.13..tar.gz
elasticsearch-5.6.4.tar.gz kibana node
elasticsearch-head kibana-5.2.0-linux-x86_64.tar.gz node-v8.9.1-linux-x64.tar.xz
images logstash portal
java logstash-5.6.3.tar.gz service
jdk1. logstash-tutorial-dataset sql
jdk-8u144-linux-x64.tar.gz nginx
kafka nginx-1.13.
[root@slave1 myapp]#

我这里下载的是elasticsearch 5.6.4,kibana5.2.0 ,logstash5.6.3三个版本。。。然后用 tar -xzvf解压一下。

2. logstash配置

解压完之后,我们到config目录中新建一个logstash.conf配置。

[root@slave1 config]# ls
jvm.options log4j2.properties logstash.conf logstash.yml startup.options
[root@slave1 config]# pwd
/usr/myapp/logstash/config
[root@slave1 config]# vim logstash.conf

然后做好input ,filter,output三大块, 其中input是吸取logs文件下的所有log后缀的日志文件,filter是一个过滤函数,这里不用配置,output配置了导入到

hosts为127.0.0.1:9200的elasticsearch中,每天一个索引。

input {
file {
type => "log"
path => "/logs/*.log"
start_position => "beginning"
}
} output {
stdout {
codec => rubydebug { }
} elasticsearch {
hosts => "127.0.0.1"
index => "log-%{+YYYY.MM.dd}"
}
}

配置完了之后,我们就可以到bin目录下启动logstash了,配置文件设置为conf/logstash.conf,从下图中可以看到,当前开启的是9600端口。

[root@slave1 bin]# ls
cpdump logstash logstash.lib.sh logstash-plugin.bat setup.bat
ingest-convert.sh logstash.bat logstash-plugin ruby system-install
[root@slave1 bin]# ./logstash -f ../config/logstash.conf
Sending Logstash's logs to /usr/myapp/logstash/logs which is now configured via log4j2.properties
[--28T17::,][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"fb_apache", :directory=>"/usr/myapp/logstash/modules/fb_apache/configuration"}
[--28T17::,][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"netflow", :directory=>"/usr/myapp/logstash/modules/netflow/configuration"}
[--28T17::,][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://127.0.0.1:9200/]}}
[--28T17::,][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://127.0.0.1:9200/, :path=>"/"}
[--28T17::,][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>"http://127.0.0.1:9200/"}
[--28T17::,][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=>nil}
[--28T17::,][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>, "settings"=>{"index.refresh_interval"=>"5s"}, "mappings"=>{"_default_"=>{"_all"=>{"enabled"=>true, "norms"=>false}, "dynamic_templates"=>[{"message_field"=>{"path_match"=>"message", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false}}}, {"string_fields"=>{"match"=>"*", "match_mapping_type"=>"string", "mapping"=>{"type"=>"text", "norms"=>false, "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>}}}}}], "properties"=>{"@timestamp"=>{"type"=>"date", "include_in_all"=>false}, "@version"=>{"type"=>"keyword", "include_in_all"=>false}, "geoip"=>{"dynamic"=>true, "properties"=>{"ip"=>{"type"=>"ip"}, "location"=>{"type"=>"geo_point"}, "latitude"=>{"type"=>"half_float"}, "longitude"=>{"type"=>"half_float"}}}}}}}}
[--28T17::,][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//127.0.0.1"]}
[--28T17::,][INFO ][logstash.pipeline ] Starting pipeline {"id"=>"main", "pipeline.workers"=>, "pipeline.batch.size"=>, "pipeline.batch.delay"=>, "pipeline.max_inflight"=>}
[--28T17::,][INFO ][logstash.pipeline ] Pipeline main started
[--28T17::,][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>}

3. elasticSearch

这个其实也是ELK中的核心,启动的时候一定要注意,因为es不可以进行root账户启动,所以你还需要开启一个elsearch账户。

groupadd elsearch                   #新建elsearch组
useradd elsearch -g elsearch -p elasticsearch #新建一个elsearch用户
chown -R elsearch:elsearch ./elasticsearch #指定elasticsearch所属elsearch组

接下来我们默认启动就好了,什么也不用配置,然后在日志中大概可以看到开启了9200,9300端口。

[elsearch@slave1 bin]$ ./elasticsearch
[--28T17::,][INFO ][o.e.n.Node ] [] initializing ...
[--28T17::,][INFO ][o.e.e.NodeEnvironment ] [0bC8MSi] using [] data paths, mounts [[/ (rootfs)]], net usable_space [.9gb], net total_space [.6gb], spins? [unknown], types [rootfs]
[--28T17::,][INFO ][o.e.e.NodeEnvironment ] [0bC8MSi] heap size [.9gb], compressed ordinary object pointers [true]
[--28T17::,][INFO ][o.e.n.Node ] node name [0bC8MSi] derived from node ID [0bC8MSi_SUywaqz_Zl-MFA]; set [node.name] to override
[--28T17::,][INFO ][o.e.n.Node ] version[5.6.], pid[], build[8bbedf5/--31T18::.105Z], OS[Linux/3.10.-.el7.x86_64/amd64], JVM[Oracle Corporation/Java HotSpot(TM) -Bit Server VM/1.8.0_144/25.144-b01]
[--28T17::,][INFO ][o.e.n.Node ] JVM arguments [-Xms2g, -Xmx2g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-, -Djna.nosys=true, -Djdk.io.permissionsUseCanonicalPath=true, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Dlog4j.skipJansi=true, -XX:+HeapDumpOnOutOfMemoryError, -Des.path.home=/usr/myapp/elasticsearch]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [aggs-matrix-stats]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [ingest-common]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [lang-expression]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [lang-groovy]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [lang-mustache]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [lang-painless]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [parent-join]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [percolator]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [reindex]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [transport-netty3]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] loaded module [transport-netty4]
[--28T17::,][INFO ][o.e.p.PluginsService ] [0bC8MSi] no plugins loaded
[--28T17::,][INFO ][o.e.d.DiscoveryModule ] [0bC8MSi] using discovery type [zen]
[--28T17::,][INFO ][o.e.n.Node ] initialized
[--28T17::,][INFO ][o.e.n.Node ] [0bC8MSi] starting ...
[--28T17::,][INFO ][o.e.t.TransportService ] [0bC8MSi] publish_address {192.168.23.151:}, bound_addresses {[::]:}
[--28T17::,][INFO ][o.e.b.BootstrapChecks ] [0bC8MSi] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[--28T17::,][INFO ][o.e.c.s.ClusterService ] [0bC8MSi] new_master {0bC8MSi}{0bC8MSi_SUywaqz_Zl-MFA}{xcbC53RVSHajdLop7sdhpA}{192.168.23.151}{192.168.23.151:}, reason: zen-disco-elected-as-master ([] nodes joined)
[--28T17::,][INFO ][o.e.h.n.Netty4HttpServerTransport] [0bC8MSi] publish_address {192.168.23.151:}, bound_addresses {[::]:}
[--28T17::,][INFO ][o.e.n.Node ] [0bC8MSi] started
[--28T17::,][INFO ][o.e.g.GatewayService ] [0bC8MSi] recovered [] indices into cluster_state
[--28T17::,][INFO ][o.e.c.r.a.AllocationService] [0bC8MSi] Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[.kibana][]] ...]).

4. kibana

它的配置也非常简单,你需要在kibana.yml文件中指定一下你需要读取的elasticSearch地址和可供外网访问的bind地址就可以了。

[root@slave1 config]# pwd
/usr/myapp/kibana/config [root@slave1 config]# vim kibana.yml elasticsearch.url: "http://localhost:9200"
server.host: 0.0.0.0

然后就是启动,从日志中可以看出,当前开了5601端口。

[root@slave1 kibana]# cd bin
[root@slave1 bin]# ls
kibana kibana-plugin nohup.out
[root@slave1 bin]# ./kibana
log [::27.650] [info][status][plugin:kibana@5.2.] Status changed from uninitialized to green - Ready
log [::27.748] [info][status][plugin:elasticsearch@5.2.] Status changed from uninitialized to yellow - Waiting for Elasticsearch
log [::27.786] [info][status][plugin:console@5.2.] Status changed from uninitialized to green - Ready
log [::27.794] [warning] You're running Kibana 5.2.0 with some different versions of Elasticsearch. Update Kibana or Elasticsearch to the same version to prevent compatibility issues: v5.6.4 @ 192.168.23.151:9200 (192.168.23.151)
log [::27.811] [info][status][plugin:elasticsearch@5.2.] Status changed from yellow to green - Kibana index ready
log [::28.250] [info][status][plugin:timelion@5.2.] Status changed from uninitialized to green - Ready
log [01:23:28.255] [info][listening] Server running at http://0.0.0.0:5601
log [::28.259] [info][status][ui settings] Status changed from uninitialized to green - Ready

5. 浏览器中输入:http://192.168.23.151:5601/ 你就可以打开kibana页面了,,默认让我指定一个查看的Index。

接下来我们在本机的/logs文件夹下创建一个简单的1.log文件,内容为“hello world”,然后在kibana上将logstash-*  改成 log* ,Create按钮就会自动出来。

[root@slave1 logs]# echo 'hello world' > .log

进入之后,点击Discover,你就可以找到你输入的内容啦~~~~ 是不是很帅气。。。

如果你装了head安装包,你还可以看到它确实带了日期模式的Index索引,还自带5个默认分片数。

好了,本篇就说这么多吧,希望对你有帮助。

通过ELK快速搭建一个你可能需要的集中化日志平台的更多相关文章

  1. 快速搭建一个Quartz定时任务【转载,好文 ,值得收藏,亲身试用 效果不错】

    Quartz.NET 入门 概述 Quartz.NET是一个开源的作业调度框架,非常适合在平时的工作中,定时轮询数据库同步,定时邮件通知,定时处理数据等. Quartz.NET允许开发人员根据时间间隔 ...

  2. NodeJS 最快速搭建一个HttpServer

    最快速搭建一个HttpServer 在目录里放一个index.html cd D:\Web\InternalWeb start http-server -i -p 8081

  3. vuejsLearn---通过手脚架快速搭建一个vuejs项目

    开始快速搭建一个项目 通过Webpack + vue-loader 手脚架 https://github.com/vuejs-templates/webpack 按照它的步骤一步一步来 $ npm i ...

  4. [原创] zabbix学习之旅五:如何快速搭建一个报警系统

    通过之前的文章,我们已搭建好zabbix server.agent和mail客户端,现在万事俱备,只差在server的界面中进行相应配置,即可快速搭建一个报警系统.总的来说,快速搭建一个报警系统的顺序 ...

  5. 快速搭建一个本地的FTP服务器

    快速搭建一个本地的FTP服务器   如果需要开发FTP文件上传下载功能,那么需要在本机上搭建一个本地FTP服务器,方便调试. 第一步:配置IIS Web服务器 1.1 控制面板中找到"程序& ...

  6. 快速搭建一个Spring Boot + MyBatis的开发框架

    前言:Spring Boot的自动化配置确实非常强大,为了方便大家把项目迁移到Spring Boot,特意总结了一下如何快速搭建一个Spring Boot + MyBatis的简易文档,下面是简单的步 ...

  7. 快速搭建一个直播Demo

    缘由 最近帮朋友看一个直播网站的源码,发现这份直播源码借助 阿里云 .腾讯云这些大公司提供的SDK 可以非常方便的搭建一个直播网站.下面我们来给大家讲解下如何借助 腾讯云 我们搭建一个简易的 直播示例 ...

  8. 快速搭建一个“微视”类短视频 App

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云视频发表于云+社区专栏 关注公众号"腾讯云视频",一键获取 技术干货 | 优惠活动 | 视频方案 " ...

  9. 【Head First Servlets and JSP】笔记6:什么是响应首部 & 快速搭建一个简单的测试环境

    搭建简单的测试环境 什么是响应首部 最简单的响应首部——Content-Type 设置响应首部 请求重定向与响应首部 在浏览器中查看Response Headers 1.先快速搭建一个简单的测试环境, ...

随机推荐

  1. Android基础知识笔记01—框架结构与四大组件

    -----------Andriod 01--------------->>> Andriod系统架构    linux内核与驱动层. 系统运行库层. 应用框架层. 应用层 内核驱动 ...

  2. python第四课——线程、进程、协程

    面试or笔试题:简述线程.进程.协程之间的关系? 内容概要 1.进程与线程优.缺点的比较 2.适用情况 3.线程 线程的创建 setDaemon join event RLock 队列 4.进程 创建 ...

  3. Kafka 学习笔记-基本概念

    一.基本概念 Kafka是一个分布式的,可分区的,可复制的消息系统 Kafka以由一个或多个服务以集群的方式运行,服务叫broker producer,consuer通过kafka topic发布,预 ...

  4. [SVN服务器搭建] 在myecplise下使用的 tortoise1.9 64位 跟 subversion1.9的服务器使用

    由于在公司经常用到SVN服务器,所以自己也想搭建在本机上面搭建一个SVN服务器玩玩,废话不多说,下面直接贴出来如何搭建的.  一.tortoise1.9 64位下载 直接百度下载即可,百度时候需要显示 ...

  5. Visual Studio中让一个JS文件智能提示另一个JS文件中的成员

    当一个Web页面引用了两个JS文件(假如分别叫common.js和JScript1.js),如果JScript1.js中需要调用大量的common.js中的方法,这时候在JScript1.js中智能提 ...

  6. Android 自定义View实现QQ运动积分抽奖转盘

    因为偶尔关注QQ运动, 看到QQ运动的积分抽奖界面比较有意思,所以就尝试用自定义View实现了下,原本想通过开发者选项查看下界面的一些信息,后来发现积分抽奖界面是在WebView中展示的,应该是在H5 ...

  7. 实验排队功能实现(JAVA)

    1.功能要求 实验室有固定台数的设备供学生通过网络连接进行实验,一台设备只能同时被一个用户使用,一个用户只能占用一台设备. 下面是一个功能的简图: 2.实现方案 2.1 初始化 在项目启动之后,开始进 ...

  8. 动态加载js,css(项目中需要的)

    最近做的一个项目需要加入百度统计,大家都知道百度统计在页面引用就是一坨js,实现方法很简单引用到页面就ok了. 那么问题来了,虽然我不知道百度统计的原理是啥,我的测试服引用了百度统计,百度统计账号里面 ...

  9. css超过一定长度显示省略号

    overflow: hidden; white-space: nowrap; text-overflow: ellipsis;

  10. Elasticsearch集群调优

    系统调优 禁用swap 使用swapoff命令可以暂时关闭swap.永久关闭需要编辑/etc/fstab,注释掉swap设备的挂载项. swapoff -a 如果完全关闭swap不可行,可以试着降低s ...