1. 程式人生 > >通過ELK快速搭建一個你可能需要的集中化日誌平臺

通過ELK快速搭建一個你可能需要的集中化日誌平臺

 在專案初期的時候,大家都是趕著上線,一般來說對日誌沒有過多的考慮,當然日誌量也不大,所以用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,在下面這張圖上,我們找到對應的三個產品,進行下載就好了。

複製程式碼
[[email protected] myapp]# ls
elasticsearch               kafka_2.11-1.0.0.tgz              nginx-1.13.6.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.8 logstash-tutorial-dataset sql jdk-8u144-linux-x64.tar.gz nginx kafka nginx-1.13.6 [[email protected] myapp]#
複製程式碼

我這裡下載的是elasticsearch 5.6.4,kibana5.2.0 ,logstash5.6.3三個版本。。。然後用 tar -xzvf解壓一下。

2. logstash配置

     解壓完之後,我們到config目錄中新建一個logstash.conf配置。

[[email protected] config]# ls
jvm.options  log4j2.properties  logstash.conf  logstash.yml  startup.options
[[email protected] config]# pwd
/usr/myapp/logstash/config
[[email protected] 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埠。

複製程式碼
[[email protected] bin]# ls
cpdump             logstash      logstash.lib.sh  logstash-plugin.bat  setup.bat
ingest-convert.sh  logstash.bat  logstash-plugin  ruby                 system-install
[[email protected] bin]# ./logstash -f ../config/logstash.conf
Sending Logstash's logs to /usr/myapp/logstash/logs which is now configured via log4j2.properties
[2017-11-28T17:11:53,411][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"fb_apache", :directory=>"/usr/myapp/logstash/modules/fb_apache/configuration"}
[2017-11-28T17:11:53,414][INFO ][logstash.modules.scaffold] Initializing module {:module_name=>"netflow", :directory=>"/usr/myapp/logstash/modules/netflow/configuration"}
[2017-11-28T17:11:54,063][INFO ][logstash.outputs.elasticsearch] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://127.0.0.1:9200/]}}
[2017-11-28T17:11:54,066][INFO ][logstash.outputs.elasticsearch] Running health check to see if an Elasticsearch connection is working {:healthcheck_url=>http://127.0.0.1:9200/, :path=>"/"}
[2017-11-28T17:11:54,199][WARN ][logstash.outputs.elasticsearch] Restored connection to ES instance {:url=>"http://127.0.0.1:9200/"}
[2017-11-28T17:11:54,244][INFO ][logstash.outputs.elasticsearch] Using mapping template from {:path=>nil}
[2017-11-28T17:11:54,247][INFO ][logstash.outputs.elasticsearch] Attempting to install template {:manage_template=>{"template"=>"logstash-*", "version"=>50001, "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"=>256}}}}}], "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"}}}}}}}}
[2017-11-28T17:11:54,265][INFO ][logstash.outputs.elasticsearch] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//127.0.0.1"]}
[2017-11-28T17:11:54,266][INFO ][logstash.pipeline        ] Starting pipeline {"id"=>"main", "pipeline.workers"=>2, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>5, "pipeline.max_inflight"=>250}
[2017-11-28T17:11:54,427][INFO ][logstash.pipeline        ] Pipeline main started
[2017-11-28T17:11:54,493][INFO ][logstash.agent           ] Successfully started Logstash API endpoint {:port=>9600}
複製程式碼

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埠。

複製程式碼
[[email protected] bin]$ ./elasticsearch
[2017-11-28T17:19:36,893][INFO ][o.e.n.Node               ] [] initializing ...
[2017-11-28T17:19:36,973][INFO ][o.e.e.NodeEnvironment    ] [0bC8MSi] using [1] data paths, mounts [[/ (rootfs)]], net usable_space [17.9gb], net total_space [27.6gb], spins? [unknown], types [rootfs]
[2017-11-28T17:19:36,974][INFO ][o.e.e.NodeEnvironment    ] [0bC8MSi] heap size [1.9gb], compressed ordinary object pointers [true]
[2017-11-28T17:19:36,982][INFO ][o.e.n.Node               ] node name [0bC8MSi] derived from node ID [0bC8MSi_SUywaqz_Zl-MFA]; set [node.name] to override
[2017-11-28T17:19:36,982][INFO ][o.e.n.Node               ] version[5.6.4], pid[12592], build[8bbedf5/2017-10-31T18:55:38.105Z], OS[Linux/3.10.0-327.el7.x86_64/amd64], JVM[Oracle Corporation/Java HotSpot(TM) 64-Bit Server VM/1.8.0_144/25.144-b01]
[2017-11-28T17:19:36,982][INFO ][o.e.n.Node               ] JVM arguments [-Xms2g, -Xmx2g, -XX:+UseConcMarkSweepGC, -XX:CMSInitiatingOccupancyFraction=75, -XX:+UseCMSInitiatingOccupancyOnly, -XX:+AlwaysPreTouch, -Xss1m, -Djava.awt.headless=true, -Dfile.encoding=UTF-8, -Djna.nosys=true, -Djdk.io.permissionsUseCanonicalPath=true, -Dio.netty.noUnsafe=true, -Dio.netty.noKeySetOptimization=true, -Dio.netty.recycler.maxCapacityPerThread=0, -Dlog4j.shutdownHookEnabled=false, -Dlog4j2.disable.jmx=true, -Dlog4j.skipJansi=true, -XX:+HeapDumpOnOutOfMemoryError, -Des.path.home=/usr/myapp/elasticsearch]
[2017-11-28T17:19:37,780][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [aggs-matrix-stats]
[2017-11-28T17:19:37,780][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [ingest-common]
[2017-11-28T17:19:37,780][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [lang-expression]
[2017-11-28T17:19:37,780][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [lang-groovy]
[2017-11-28T17:19:37,780][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [lang-mustache]
[2017-11-28T17:19:37,780][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [lang-painless]
[2017-11-28T17:19:37,780][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [parent-join]
[2017-11-28T17:19:37,780][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [percolator]
[2017-11-28T17:19:37,781][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [reindex]
[2017-11-28T17:19:37,781][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [transport-netty3]
[2017-11-28T17:19:37,781][INFO ][o.e.p.PluginsService     ] [0bC8MSi] loaded module [transport-netty4]
[2017-11-28T17:19:37,781][INFO ][o.e.p.PluginsService     ] [0bC8MSi] no plugins loaded
[2017-11-28T17:19:39,782][INFO ][o.e.d.DiscoveryModule    ] [0bC8MSi] using discovery type [zen]
[2017-11-28T17:19:40,409][INFO ][o.e.n.Node               ] initialized
[2017-11-28T17:19:40,409][INFO ][o.e.n.Node               ] [0bC8MSi] starting ...
[2017-11-28T17:19:40,539][INFO ][o.e.t.TransportService   ] [0bC8MSi] publish_address {192.168.23.151:9300}, bound_addresses {[::]:9300}
[2017-11-28T17:19:40,549][INFO ][o.e.b.BootstrapChecks    ] [0bC8MSi] bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks
[2017-11-28T17:19:43,638][INFO ][o.e.c.s.ClusterService   ] [0bC8MSi] new_master {0bC8MSi}{0bC8MSi_SUywaqz_Zl-MFA}{xcbC53RVSHajdLop7sdhpA}{192.168.23.151}{192.168.23.151:9300}, reason: zen-disco-elected-as-master ([0] nodes joined)
[2017-11-28T17:19:43,732][INFO ][o.e.h.n.Netty4HttpServerTransport] [0bC8MSi] publish_address {192.168.23.151:9200}, bound_addresses {[::]:9200}
[2017-11-28T17:19:43,733][INFO ][o.e.n.Node               ] [0bC8MSi] started
[2017-11-28T17:19:43,860][INFO ][o.e.g.GatewayService     ] [0bC8MSi] recovered [1] indices into cluster_state
[2017-11-28T17:19:44,035][INFO ][o.e.c.r.a.AllocationService] [0bC8MSi] Cluster health status changed from [RED] to [YELLOW] (reason: [shards started [[.kibana][0]] ...]).
複製程式碼

4. kibana

    它的配置也非常簡單,你需要在kibana.yml檔案中指定一下你需要讀取的elasticSearch地址和可供外網訪問的bind地址就可以了。

複製程式碼
[[email protected] config]# pwd
/usr/myapp/kibana/config

[[email protected] config]# vim kibana.yml

elasticsearch.url: "http://localhost:9200"
server.host: 0.0.0.0
複製程式碼

      然後就是啟動,從日誌中可以看出,當前開了5601埠。

複製程式碼
[[email protected] kibana]# cd bin
[[email protected] bin]# ls
kibana  kibana-plugin  nohup.out
[[email protected] bin]# ./kibana
  log   [01:23:27.650] [info][status][plugin:[email protected]5.2.0] Status changed from uninitialized to green - Ready
  log   [01:23:27.748] [info][status][plugin:[email protected]5.2.0] Status changed from uninitialized to yellow - Waiting for Elasticsearch
  log   [01:23:27.786] [info][status][plugin:[email protected]5.2.0] Status changed from uninitialized to green - Ready
  log   [01:23: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   [01:23:27.811] [info][status][plugin:[email protected]5.2.0] Status changed from yellow to green - Kibana index ready
  log   [01:23:28.250] [info][status][plugin:[email protected]5.2.0] Status changed from uninitialized to green - Ready
  log   [01:23:28.255] [info][listening] Server running at http://0.0.0.0:5601
  log   [01:23: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按鈕就會自動出來。

[[email protected] logs]# echo 'hello world' > 1.log

  進入之後,點選Discover,你就可以找到你輸入的內容啦~~~~ 是不是很帥氣。。。

如果你裝了head安裝包,你還可以看到它確實帶了日期模式的Index索引,還自帶5個預設分片數。

好了,本篇就說這麼多吧,希望對你有幫助。

相關推薦

通過ELK快速搭建一個可能需要集中日誌平臺

 在專案初期的時候,大家都是趕著上線,一般來說對日誌沒有過多的考慮,當然日誌量也不大,所以用log4net就夠了,隨著應用的越來越多,日誌散落在各個伺服器的logs資料夾下,確實有點不大方便,這個時候就想到了,在log4net中配置 mysql的資料來源,不過這裡面有一個坑,

Java 通過gecco快速搭建一個爬蟲框架

Java gecco 爬蟲Demo Gecco是一款用java語言開發的輕量化的易用的網路爬蟲框架。 官網:http://www.geccocrawler.com/ 1.匯入依賴 <dependency> <groupI

通過express快速搭建一個node服務

Node.js 是一個基於Chrome JavaScript 執行時建立的一個平臺。可以理解為是執行在服務端的 JavaScript。如果你是一個前端程式設計師,不太擅長像PHP、Python或Ruby等動態程式語言,想建立自己的服務,那麼Node.js是一個非常好的選擇。本文將通過幾個簡要步驟,運用expr

初識集中日誌平臺框架 【ELK

擴展 目前 避免 監控 www 副本 日誌收集 and 簡單的 ELK是三個開源軟件的縮寫,分別表示:Elasticsearch , Logstash, Kibana , 它們都是開源軟件。新增了一個FileBeat,它是一個輕量級的日誌收集處理工具(Agent),File

使用 Python 10分鐘 教快速搭建一個部落格

10個優秀的程式設計師裡,有9個人都有寫部落格的習慣。這是非常好的習慣,它使得知識得以提煉,轉輸出為輸入,在提升自己的同時,還能利用網際網路易傳播的特性,將知識分享給每一個熱愛學習的人。               &n

ELK筆記】ELK的安裝,快速搭建一個ELK日誌分析平臺

ELK 是 ElasticSearch、 LogStash、 Kibana 三個開源工具的簡稱,現在還包括 Beats,其分工如下: LogStash/Beats: 負責資料的收集與處理 ElasticSearch: 一個開源的分散式搜尋引擎,負責資料的儲存

使用 Python 30分鐘 教快速搭建一個部落格

10個優秀的程式設計師裡,有9個人都有寫部落格的習慣。這是非常好的習慣,它使得知識得以提煉,轉輸

搭建一個網站最低需要多少錢?如何以最低成本做一個網站?

網站 網站優化 seo 想要搭建一個屬於自己的網站,但是不清楚需要花費多少錢,如果可以怎麽以最低的成本建設一個網站呢?這篇文章大發跡創業項目網就簡單的分享一下搭建一個網站的成本是多少。 搭建一個網站最低需要多少錢?如何以最低成本做一個網站?22.jpg 網站建設的三要素是域名,服務器和程序。我們就

系統集成項目經理和高級項目經理資格通過培訓可以獲得,需要軟考嗎?

項目管理 原系統集成項目經理和高級項目經理的資格獲得的渠道為必須取得工信部的軟考資格後,才可以由用人單位向工信部資質管理部門申請。 現在改由電子聯合會負責資質相關工作了,直接向電子聯合會註冊申請項目經理了,目前直接培訓就可以拿項目經理證了,前幾個年苦哈哈考了軟考的小夥伴們情何以堪。 其實

搭建一個個人網站需要多少錢預算?

href 而且 isp ali tps 數碼 身份證 scu 聯網 在這個互聯網井噴時代,跟多站長朋友都玩過個人博客網站,而且用的最多的程序恐怕就是WordPress程序和織夢CMS,不但模板多,而且設計的樣式還非常的漂亮。互聯網+時代,擁有個人網站是在正常不過的了,那麽創

快速搭建ELK集中日誌管理平臺

command uri tun sock one cau else inf span 由於我們的項目是分布式,服務分布於多個服務器上,每次查看日誌都要登錄不同服務器查看,而且查看起來還比較麻煩,老大讓搭一個集中化日誌管理的東西,然後就在網上找到了這個東西ELK E

快速搭建一個Quartz定時任務【轉載,好文 ,值得收藏,親身試用 效果不錯】 Quartz.NET 入門

Quartz.NET 入門   概述 Quartz.NET是一個開源的作業排程框架,非常適合在平時的工作中,定時輪詢資料庫同步,定時郵件通知,定時處理資料等。 Quartz.NET允許開發人員根據時間間隔(或天)來排程作業。它實現了作業和觸發器的多對多關係,還能把多

NodeJS 最快速搭建一個HttpServer anywhere

anywhere 會自動開啟index.html npm install anywhere -g cd 想要以某個路徑作為靜態檔案伺服器的根目錄分享,只需要在該目錄下執行: anywhere 預設不新增 -s 命令會在命令敲擊後,同時開啟瀏覽器訪問 http://i

可能需要了解下Laravel集合

前言 集合通過 Illuminate\Support\Collection 進行例項,Laravel的核心大部分的引數傳遞都用到了集合,但這並不代表集合就是好的。Laravel作為快捷並優雅的開發框架,是有他一定的道理所在的,並非因他的路由、DB、監聽器等等。當你需要處理一組陣列時,你可能就需要它幫助你快

可能需要的一本前端小冊:Vue 專案構建與開發入門

最近抽時間寫了一本關於 Vue 的小冊:《Vue 專案構建與開發入門》,前前後後斷斷續續花了大概兩個月的時間。作為 Vue 的第一批使用者,同時也作為一名專欄作者,雖然我之前寫過好幾篇關於 Vue 的文章,但是該小冊是我第一本系統性介紹 Vue 專案構建與開發相關知識的書籍,也是我對於自己積累的 Vue 經驗

快速搭建一個SpringBoot入門專案

在官網建立專案 https://start.spring.io 下載到本地解壓 用idea開啟 編寫HelloWorld服務 @RestController public class HelloController { @RequestMapping("/hello")

快速搭建一個本地的FTP伺服器

https://www.cnblogs.com/popfisher/p/7992036.html   第一步:配置IIS Web伺服器 1.1 控制面板中找到“程式”並開啟 1.2 程式介面找到“啟用或關閉Windows功能”並開啟 1.3 上面兩步也可以簡化為一步:按【Win +

如何快速搭建一個微服務架構-咕泡學院Java架構VIP試聽視訊

  如何快速搭建一個微服務架構-咕泡學院Java架構VIP試聽視訊https://pan.baidu.com/s/1I4fs5juFNY_sV8yc_zwcYQ  密碼:bsvl 咕泡學院Java架構師每日錄播視訊索取加QQ群:788692365咕泡學院Java架構師往期視訊

關於 MySQL LEFT JOIN 可能需要了解的三點

即使你認為自己已對 MySQL 的 LEFT JOIN 理解深刻,但我敢打賭,這篇文章肯定能讓你學會點東西! ON 子句與 WHERE 子句的不同 一種更好地理解帶有 WHERE ... IS NULL 子句的複雜匹配條件的簡單方法  Matching-Conditio

快速搭建一個開源的Git伺服器

有的時候,我們需要搭建一個內部的Git伺服器,作為自己的研究或者暫時作專案程式碼的存放地,這個時候,我們可以考慮使用一個Gitblit,非常方便和好用。具體的搭建步驟如下: 1.下載安裝檔案 到網站 http://gitblit.com/上下載一個安裝檔案, 直接下載GO版本