查看日志一直都是一個很困擾的問題,登錄到服務器上查看幾百兆的txt文件,從中找到某個問題可能會留下的日志記錄...... 尤其是現在,在集群式部署的服務器原來越多的時候,找到一個異常記錄幾乎要翻遍每一台服務器,想想就崩潰了!這個時候就特別希望能有一個集中查看日志的方案來拯救我。
曾經找到一個名為log4Grid的項目,試用了一下。日志數據都保存到mssql數據庫中,通過一個web項目來查詢顯示日志記錄。只是實現了基本的日志數據收集和顯示,項目沒有持續更新,使用起來也不夠穩定。不是一個成熟的日志收集項目。
log4net項目里有一個SimpleSocketServer的小應用,可以把多個服務器上的log4net日志集中到一個服務器上,然后再選擇log4net的某種記錄方式寫下來。但是不能滿足方便查看的要求。
一. jdk安裝
ELK是運行在JVM上的所以也要安裝jdk,jdk安裝在Windows系統上后需要配置系統環境變量。詳細配置可以看成是另外一件事,請自行搜索網上文章。
二. elasticsearch
elasticsearch 是ELK的核心負責存儲和檢索。
將elasticsearch 解壓到一個目錄下,在\bin目錄下找到服務的安裝、啟動文件 service.bat:
三. kibana
kibana 是ELK中負責顯示檢索結果的。
將kibana 解壓到一個目錄下,將nssm復制到kibana的\bin目錄下(為了簡單所以直接復制nssm):
四. logstash
logstash在ELK中負責收集轉化數據的,從日志中獲取的數據由它傳給elasticsearch。
將logstash解壓到一個目錄下,在\bin的同級目錄下新建\conf目錄,在該目錄下存放配置文件。
啟動服務時使用 logstash.bat -f ..\conf\xx.conf 的命令。
在logstash進入工作狀態前,為了測試其能否正常工作,做了一個從日志文件獲取數據的配置 example.conf:
input { file { path => "C:\logs\log.log" } } filter {} output { stdout { codec => rubydebug } }
當日志文件有新增時就會在控制台上輸出。
input { log4j{ mode => "server" type=>"log4j-json" port=>4712 } } filter {} output { stdout { codec => rubydebug } elasticsearch { hosts => ["127.0.0.1"] } }
這就是在單機上配置ELK的關鍵點,跨服務器還沒試過。
logstash的配置文件很容易出錯誤,最后我只放基本的配置,用ANSI不用中文不用注釋。
對應的在系統內log4j要配置SocketAppender輸出,log4j的properties配置:
log4j.rootLogger=info,logstash # Socket,logstash log4j.appender.logstash=org.apache.log4j.net.SocketAppender log4j.appender.logstash.Port=4712 log4j.appender.logstash.RemoteHost=localhost log4j.appender.logstash.ReconnectionDelay=60000 log4j.appender.logstash.LocationInfo=true
把新的輸出配置logstash加到log4j.rootLogger= 后就能獲得全部的日志輸出。
log4j:WARN No appenders could be found for logger (org.apache.http.client.protoc ol.RequestAuthCache). log4j:WARN Please initialize the log4j system properly.