首先,日志能做什么?
系統(tǒng)健康狀況監(jiān)控
查找故障根源
系統(tǒng)瓶頸診斷和調(diào)優(yōu)
追蹤安全相關(guān)問題
現(xiàn)在,如何采集日志?
互聯(lián)網(wǎng)大規(guī)模、分布式的特性決定了日志的源頭越來越分散,產(chǎn)生的速度越來越快,傳統(tǒng)的手段和工具(主要是linux grep、awk、wc等命令)顯得日益力不從心。市場(chǎng)對(duì)新工具的需求已然催生出Splunk這樣近百億美元市值的專業(yè)日志分析解決方案供應(yīng)商。然而,開源才是王道。以下是羅列的一些主流開源日志框架。(本文先整理了ELK的部分,其他開源日志框架介紹后續(xù)不定時(shí)間更新)
- ELk(elasticsearch+logstash+kibana)
1.官方主頁:https://www.elastic.co/products
2.開源簡(jiǎn)介:
顧名思義,ELK是三個(gè)開源工具ElasticSearch,Logstash,Kibana組合而成的軟件棧,其中的核心是開源的分布式搜索引擎Elasticsearch,輔以Logstash靈活多樣的日志收集,過濾,傳送功能以及Kibana炫酷的前端展示面板,組合成一套可以媲美商業(yè)應(yīng)用的解決方案。
Elasticsearch 是個(gè)開源分布式搜索引擎,它的特點(diǎn)有:分布式,零配置,自動(dòng)發(fā)現(xiàn),索引自動(dòng)分片,索引副本機(jī)制, restful 風(fēng)格接口,多數(shù)據(jù)源,自動(dòng)搜索負(fù)載等。
Logstash 是一個(gè)完全開源的工具,他可以對(duì)你的日志進(jìn)行收集、分析,并將其存儲(chǔ)供以后使用(如,搜索)。
kibana 也是一個(gè)開源和免費(fèi)的工具,他 Kibana 可以為 Logstash 和ElasticSearch 提供的日志分析友好的 Web 界面,可以幫助您匯總、分析和搜索重要數(shù)據(jù)日志。
3.架構(gòu)原理
在需要收集日志的所有服務(wù)上部署 logstash ,作為 logstash agent ( logstash shipper )用于監(jiān)控并過濾收集日志,將過濾后的內(nèi)容發(fā)送到 logstash indexer ,logstash indexer 將日志收集在一起交給全文搜索服務(wù) ElasticSearch ,可以用ElasticSearch 進(jìn)行自定義搜索通過 Kibana 來結(jié)合自定義搜索進(jìn)行頁面展示。架構(gòu)圖如Fig1.1所示:

4.安裝部署
JDK安裝和配置(略)
Logstash安裝
下載并安裝 Logstash ,安裝 logstash 只需將它解壓的對(duì)應(yīng)目錄即可,例如:/usr/local 下:
<pre># tar -zxf logstash-2.2.2.tar.gz -C /usr/local/ </pre>
安裝后運(yùn)行如下命令:
<pre># cd /usr/local/logstash-2.2.2/bin
logstash -e 'input { stdin { } } output { stdout {} }'
Hello World!
2016-03-07T12:46:12.095Z XiaoMeng-MacMini.local HelloWorld!
</pre>
我們可以看到,我們輸入什么內(nèi)容logstash按照某種格式輸出,其中-e參數(shù)參數(shù)允許Logstash直接通過命令行接受設(shè)置。這點(diǎn)尤其快速的幫助我們反復(fù)的測(cè)試配置是否正確而不用寫配置文件。使用CTRL-C命令可以退出之前運(yùn)行的Logstash。
使用-e參數(shù)在命令行中指定配置是很常用的方式,不過如果需要配置更多設(shè)置則需要很長(zhǎng)的內(nèi)容。這種情況,我們首先創(chuàng)建一個(gè)簡(jiǎn)單的配置文件,并且指定logstash使用這個(gè)配置文件。 例如:在 logstash 安裝目錄下創(chuàng)建一個(gè)“基本配置”測(cè)試文件 logstash-test.conf, 文件內(nèi)容如下:
<pre># cat logstash-simple.conf
input { stdin { } }
output {
stdout { codec=> rubydebug }
}</pre>
Logstash 使用 input 和 output 定義收集日志時(shí)的輸入和輸出的相關(guān)配置,本例中input 定義了一個(gè)叫 "stdin" 的 input , output 定義一個(gè)叫 "stdout" 的 output 。無論我們輸入什么字符, Logstash 都會(huì)按照某種格式來返回我們輸入的字符,其中 output被定義為 "stdout" 并使用了 codec 參數(shù)來指定 logstash 輸出格式。
使用logstash的-f參數(shù)來讀取配置文件,執(zhí)行如下開始進(jìn)行測(cè)試:
<pre># logstash agent -f logstash_simple.conf Settings: Default pipeline workers: 4
Logstash startup completed
echo "date hello world" //命令行輸入
//測(cè)試結(jié)果
{
"message" => "echo "date hello world"",
"@version" => "1",
"@timestamp" => "2016-03-09T00:47:41.172Z",
"host" => "XiaoMeng-MacMini.local"
}
</pre>
- Elasticsearch安裝和配置
下載 Elasticsearch 后,解壓到對(duì)應(yīng)的目錄就完成 Elasticsearch 的安裝。
<pre># tar -zxf elasticsearch-2.2.0.tar.gz -C /usr/local/</pre>
啟動(dòng)Elasticsearch
<pre># cd /usr/local/elasticsearch-2.2.0/bin
# elasticsearch</pre>
如果使用遠(yuǎn)程連接的 Linux 的方式并想后臺(tái)運(yùn)行 elasticsearch ,可以使用nohup:
<pre># nohup /usr/local/elasticsearch-2.2.0/bin/elasticsearch > nohup &</pre>
查看 elasticsearch 的 9200 端口是否已監(jiān)聽,是則說明 elasticsearch 已成功運(yùn)行:
<pre># netstat -anp |grep 9200</pre>
接下來我們?cè)?logstash 安裝目錄下創(chuàng)建一個(gè)用于測(cè)試 logstash 使用 elasticsearch作為 logstash 的后端的測(cè)試文件 logstash_es_simple.conf,該文件中定義了stdout和elasticsearch作為output,這樣的“多重輸出”即保證輸出結(jié)果顯示到屏幕上,同時(shí)也輸出到elastisearch中。
<pre># cat logstash_es_simple.conf
input { stdin { } }
output {
elasticsearch {hosts => "localhost" }
stdout { codec=> rubydebug }
}</pre>
執(zhí)行如下命令:
<pre># logstash agent -f logstash-es-simple.conf
hello logstash//命令行輸入
//測(cè)試結(jié)果
{
"message" => "hello logstash",
"@version" => "1",
"@timestamp" => "2016-03-09T01:15:44.766Z",
"host" => "XiaoMeng-MacMini.local"
}
</pre>
接下來使用 curl 命令發(fā)送請(qǐng)求來查看 ES 是否接收到了數(shù)據(jù):
<pre># curl 'http://localhost:9200/_search?pretty'
//測(cè)試結(jié)果
{
"took" : 19,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 1.0,
"hits" : [ {
"_index" : "logstash-2016.03.09",
"_type" : "logs",
"_id" : "AVNY8afVDB1d7fLqdOmL",
"_score" : 1.0,
"_source" : {
"message" : "hello logstash",
"@version" : "1",
"@timestamp" : "2016-03-09T01:15:44.766Z",
"host" : "XiaoMeng-MacMini.local"
}
} ]
}
}
</pre>
至此,已經(jīng)成功利用 Elasticsearch 和 Logstash 來收集日志數(shù)據(jù)了。
- elasticsearch 插件
Elasticsearch-kopf 插件可以查詢 Elasticsearch 中的數(shù)據(jù),安裝 elasticsearch-kopf,只要在你安裝 Elasticsearch 的目錄中執(zhí)行以下命令即可:
<pre># cd /usr/local/elasticsearch-2.2.0/bin/
# plugin install lmenezes/elasticsearch-kopf</pre>
安裝完成后在 plugins 目錄下可以看到 kopf.在瀏覽器訪問 http://localhost:9200/_plugin/kopf 瀏覽保存在 Elasticsearch 中的數(shù)據(jù),如圖Fig1.2所示:

- Kibana安裝
下載 kibana 后,解壓到對(duì)應(yīng)的目錄就完成 kibana 的安裝
<pre>tar -zxf kibana-4.4.1-linux-x64.tar.gz -C /usr/local/</pre>
啟動(dòng)kibana
<pre># cd /usr/local/kibana-4.4.1-linux-x64/bin
# kibana</pre>
使用 http://localhost :5601 訪問 Kibana ,登錄后,首先,配置一個(gè)索引,默認(rèn), Kibana 的數(shù)據(jù)被指向 Elasticsearch ,使用默認(rèn)的 logstash-* 的索引名稱,并且是基于時(shí)間的,點(diǎn)擊“ Create ”即可。如圖Fig1.3所示。

看到如下界面說明索引創(chuàng)建完成,如圖Fig1.4所示。

點(diǎn)擊“ Discover ”,可以搜索和瀏覽 Elasticsearch 中的數(shù)據(jù),默認(rèn)搜索的是最近 15分鐘的數(shù)據(jù)??梢宰远x選擇時(shí)間。
到此,說明簡(jiǎn)易的 ELK 平臺(tái)安裝部署已經(jīng)完成。
- 配置 logstash 作為 Indexer
將 logstash 配置為索引器,并將 logstash 的日志數(shù)據(jù)存儲(chǔ)到 Elasticsearch ,本范例主要是索引本地系統(tǒng)日志。
<pre># cat /usr/local/logstash-2.2.2/bin/logstash_indexer.conf
input {
file {
type =>"syslog"
path => ["/var/log/messages", "/var/log/syslog" ]
}
syslog {
type =>"syslog"
port =>"5544"
}
}
output {
stdout { codec=> rubydebug }
elasticsearch {hosts => "localhost" }
}
# cd /usr/local/logstash-2.2.2/bin/
# logstash -f logstash_indexer.conf</pre>
使用 echo 命令模擬寫入日志,命令執(zhí)行后看到如圖Fig1.5所示的信息:
<pre># echo " 'date' Jay" >> /var/log/messages</pre>
刷新 kibana ,發(fā)現(xiàn)最新的測(cè)試數(shù)據(jù)顯示到瀏覽器中,如圖Fig1.6所示:

到此, ELK 平臺(tái)部署和基本的測(cè)試已完成。
---(to be continued)
說明
1.本文搭建平臺(tái)為OSX10.10.6;
2.elasticsearch,需要新建普通用戶單獨(dú)執(zhí)行,不要用root執(zhí)行;
3.在logstash-2.2.2中配置elasticsearch output時(shí),host參數(shù)改為hosts參數(shù)。具體可使用--configtest 檢測(cè)配置文件是否兼容舊版的參數(shù)配置;
4.本文所有軟件配置均為官方最新版本,版本號(hào)對(duì)應(yīng)文件名;