開始博客以前,首先看個問題:
做爲一隻程序猿,寫的代碼的過程須要加入一些日誌信息,這些日誌信息包括debug調試信息,異常記錄日誌等。 Java猿通常都是使用log4j,logback等第三方庫記錄日誌。 那麼問題來了,挖掘機到底哪家強?…… 扯個淡,那麼問題來了,若是咱們想看日誌信息,怎麼辦, ssh到服務器上,vim而後查詢。每次都這樣,是否是很蛋疼 = =; 還有另一個問題,若是咱們想分析、追蹤日誌,或者找關鍵字(分詞後的關鍵字),這樣簡簡單單看日誌文件是不可能的。 所以,咱們就須要開源力量了!html
摘自官網上的一句話:logstash is a tool for managing events and logs. You can use it to collect logs, parse them, and store them for later use (like, for searching)。logstash是一個用來管理事件和日誌的工具,它的做用是收集日誌,解析日誌,存儲日誌爲之後使用。java
官網上有tutorials。 本文也就是對tutorials作一個總結。git
要搭建logstash日誌追蹤系統須要如下幾個環境:github
沒有JDK的小夥伴首先先去下載吧。 logstash和elasticsearch都先下載過來吧~。redis
首先先進入logstash的bin目錄創建一個logstash.conf配置文件:apache
input { stdin { } } output { stdout { codec => rubydebug } }
而後執行:json
./logstash -f logstash.conf
這時控制檯等待輸入內容,咱們輸入hello world,這個時候控制檯會打印出:vim
{ "message" => "hello world", "@version" => "1", "@timestamp" => "2014-11-01T12:38:17.217Z", "host" => "format-2.local" }
這個說明咱們的logstash本地配置成功了。瀏覽器
配置文件有2個內容組成,input和output,其實還有2個配置:filter和codec。
這就是logstash內部的一個叫作事件處理管道(pipeline)的核心概念的3大組成部分:
input:
生成事件(logstash中的事件是由隊列實現的,這個隊列由ruby的SizedQueue實現)的數據來源,常見的有file(文件)、syslog(系統日誌)、redis(緩存系統)、lumberjack(lumberjack協議)。緩存
filter:
修改事件內容,常見的filter有grok(經常使用,解析文本並結構化地存儲下來,用來處理沒有結構的文本)、mutate、drop、clone、geoip
output:
展示結果,常見的有elasticsearch(搜索引擎)、file、graphite、statsd
codec:
能夠做爲input或output的一部分,主要用來處理日誌過程當中產生的消息,常見的codec有json、rubydebug
如今咱們回過頭看來咱們的logstash.conf配置文件,只配置了input和output,其中input由一個stdin組成,這個stdin沒有任何參數,output由stdout組成,這個stdout由codec參數,且使用了rebydebug,所以控制檯打印出的信息是reby的對象格式。 咱們把codec改爲json的話,將會打印出如下內容:
{"message":"hello world","@version":"1","@timestamp":"2014-11-01T13:16:38.221Z","host":"format-2.local"}
elasticsearch的環境搭建比較簡單,download elasticsearch以後進入bin目錄,執行:
./elasticsearch
以後打開瀏覽器進入http://localhost:9200/,發現有一串json文本就表示elasticsearch服務器已啓。 可是貌似沒有發現什麼界面,是否是很不友好= =。
elasticsearch支持插件功能,咱們使用kibana插件,下載以後修改config.js文件,把elasticsearch對應的地址改爲elasticsearch服務器地址,而後把kibana解壓出來的全部文件放到$elasticsearchhome/plugins/kibana/_site/目錄中。
以後打開http://localhost:9200/_plugin/kibana
配置完logstash和elasticsearch以後,整合一下這兩個框架。
logstash配置文件(input、output能夠配置多個):
input { stdin { } } output { stdout { codec => json } elasticsearch { host => localhost } }
而後從新啓動logstash,控制檯輸入hello elasticsearch,刷新kibana頁面:
logstash日誌追蹤系統搭建完畢。
以log4j爲例。
logstash配置:
input { stdin { } log4j { mode => "server" host => "127.0.0.1" port => 56789 type => "log4j" } } output { stdout { codec => rubydebug } elasticsearch { host => localhost } }
測試類:
public class LogTest { private Logger logger = Logger.getLogger(DebugLogger.class); @Before public void setUp() { PropertyConfigurator.configure(LogTest.class.getClassLoader().getResourceAsStream("log4j.properties")); } @Test public void testLog() { logger.debug("hello logstash, this is a message from log4j"); } @Test public void testException() { logger.error("error", new TestException("sorry, error")); }
}
log4j配置:
log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p %t %c : %m%n log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.file=/Users/fangjian/Develop/log_file/test_log.log log4j.appender.file.maxFileSize=1024 log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=%d %p %t %c : %m%n # logstash配置 log4j.appender.logstash=org.apache.log4j.net.SocketAppender log4j.appender.logstash.port=56789 log4j.appender.logstash.remoteHost=127.0.0.1 log4j.rootLogger=debug,stdout,file,logstash
本文僅僅只是對logstash的搭建作一個總結,包括logstash內部的結構,還有一些配置語言的介紹都沒有很是詳細的解釋,若是讀者有興趣,能夠自行查閱相關資料。
參考資料:
http://logstash.net/
http://blog.yeradis.com/2013/10/logstash-and-apache-log4j-or-how-to.html
http://www.cnblogs.com/buzzlight/p/logstash_elasticsearch_kibana_log.html