最近由於之前協助前公司做了點力所能及的事情,居然收到了一份貴重的端午禮物,是給我女兒的一個樂高積木,整個有7大包物件,我花了接近一天的時間一磚一瓦的組織起來,雖然很辛苦但是能夠從過程中體驗到樂趣。這次將分享從頭搭建分布式日志系統,主要是在spring mvc上結合ELK套件實現(之前有些工作由於分工不同由不同的同事來完成,我只是在已經配置好的環境下做開發而已),包含如下這些技術點:
來看下整體的架構圖,這類架構非常容易解決當下分布式系統下的日志記錄,查詢以及分析困難的問題。
操作系統,IDE環境:
1:搭建spring mvc項目
eclipse自帶創建的dynamic web project是個空結構,沒有任何配置,我們要想跑起來一個hello world的項目,還需要做些配置,比如創建程序文件,比如view,controller等等。
spring tool suite可以幫助我們解決這個問題,它提供了spring mvc的項目模板,裡面自帶一個hello world的可啟動的應用頁面,在eclipse中可以很方便的以插件形式安裝spring tool suit,安裝好之後就可以創建了。
這裡需要注意的是不同版本的spring tool suite在創建時的菜單會有不同,我目前的菜單位於:
首先要選中spring標簽:
然後在File菜單下找:
創建好之後,我們就可以直接在tomcat下運行了,不需要任何的其它操作,相對創建的dynamic web project要方便的多,不過通過這種模板創建的項目也有缺點:如果你喜歡新的一些依賴包,那麼你需要手工去pom文件中去更新版本號為你想要的,還有可能會引入部分你暫時可能用不上的一些第三方包。下圖是稍加修改的項目完成圖,是一個標准的maven結構的spring mvc。
2:redis安裝
由於我的是windows環境,所以相應的需要下載windows版本的redis:
windows版:https://github.com/mythz/redis-windows
下載下來解壓,然後選擇一個版本:
配置文件我只修改了一個:bind,它是用來綁定一個固定IP的,為什麼要顯示的去綁定一個IP呢?後面會介紹我遇到的問題。
啟動服務端:在redis/bin目錄下執行:redis-server.exe redis.windows.conf即可啟動
啟動客戶端:在redis/bin目錄下執行:redis-cli.exe -h 127.0.0.1 -p 6379,在這個窗口可以通過一些redis命令再測試redis是否正常,比如get,set ,keys *等等。
3:ELK安裝
在這個網站可以找到ELK最新版本:https://www.elastic.co/downloads,將elasticsearch,logstash,kibana這三個全部下載下來。
大部分的配置都使用默認的,只是為了好標識我修改了cluster.name以及node.name,詳細的參數可研究文檔。然後直接在bin目錄下運行elasticsearch.bat就可以啟動了。
打開http://127.0.0.1:9200/就可以,看到如下信息就說明啟動正常了。
還有很多插件可以安裝,用來幫助我們查看監控elasticsearch,這裡先安裝head,命令行進入elasticsearch的目錄,然後執行plugin install mobz/elasticsearch-head即可安裝。
安裝成功後打開http://127.0.0.1:9200/_plugin/head/
先看下logstash的架構設計以及與其它ELK的配合,本篇的data source就是redis,不涉及到filter,最終日志輸出到elasticsearch中。
這裡我們只配置input以及output,需要注意的是不同版本的logstash在配置上也會略有不同,大家有興趣可以進一步做下對比。
input { redis { data_type => "list" key => "logstash" host => "127.0.0.1" port => 6379 threads => 5 codec => "json" } } filter { } output { elasticsearch { hosts => ["127.0.0.1:9200"] index => "logstash-%{type}-%{+YYYY.MM.dd}" document_type => "%{type}" workers => 1 flush_size => 20 idle_flush_time => 1 template_overwrite => true } stdout{} }
然後在logstash目錄下執行logstash -f etc/logstash.d/即可啟動
需要有一個記錄日志的入口,將logback-classic引入進來,為了將日志傳遞給redis,需要配置一個logback-redis-appender,依賴如下:
<!-- Logging --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>${org.slf4j-version}</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>${logback.version}</version> </dependency> <!--logstash begin --> <dependency> <groupId>com.cwbase</groupId> <artifactId>logback-redis-appender</artifactId> <version>1.1.3</version> <exclusions> <exclusion> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> </exclusion> </exclusions> </dependency>
配置logback.xml,key需要與logstash配置文件中配置的key相匹配。
<appender name="LOGSTASH" class="com.cwbase.logback.RedisAppender"> <source>logstashdemo</source> <type>dev</type> <host>127.0.0.1</host> <key>logstash</key> <tags>dev</tags> <mdc>true</mdc> <location>true</location> <callerStackIndex>0</callerStackIndex> </appender>
在homecontroller中記錄日志,slf4j由於完成了與logback完美集成,所以我們也不需要做任何轉換類的配置即可實現日志記錄。
前文中曾經提到在配置redis時,設置了bind屬性,讓其指定到一個固定的IP。如果不指定,在logstash連接redis會有問題,其中的原因有待後續進一步確認。
4:運行網站,查看日志
當redis,elasticsearch,logstash服務運行正常後,啟動spring mvc,通過logger記錄的日志就可以在kibana中方便的查看了。
測試logback是否已經將日志發送到redis,可以通過redis的命令來查看是否包含了配置的logstash這個key,還可以通過llen來判斷日志是否在正常的遞增。
如果上面都正常,再找開kibana的頁面,第一次打開會提示創建索引規則,創建好之後就可以看到日志已經被采集到elasticsearch中了。
經過接近兩天的研究,終於從0開始搭建成功了spring mvc+ELK的分布式日志管理平台,java平台的優勢就是開源的產品多,可利用優秀插件也多,擅於去發倔還是可以很省事的做些比較優秀的項目的。雖然本篇只是一個練手入門文章,但有了開始就會有收獲。
本文參考: