日誌分析工具ELK配置詳解

日誌分析工具ELK配置詳解

1、ELK介紹
1.1 elasticsearch

1.1.1 elasticsearch介紹

ElasticSearch是一個基於Lucene的搜索服務器。它提供了一個分佈式多用戶能力的全文搜索引擎,基於RESTful web接口。Elasticsearch是用Java開發的,並做爲Apache許可條款下的開放源碼發佈,是第二流行的企業搜索引擎。設計用於雲計算中,可以達到實時搜索,穩定,可靠,快速,安裝使用方便。

1.1.2 elasticsearch幾個重要術語

NRT 
elasticsearch是一個近似實時的搜索平臺,從索引文檔到可搜索有些延遲,一般爲1秒。

集羣
集羣就是一個或多個節點存儲數據,其中一個節點爲主節點,這個主節點是能夠經過選舉產生的,並提供跨節點的聯合索引和搜索的功能。集羣有一個惟一性標示的名字,默認是elasticsearch,集羣名字很重要,每一個節點是基於集羣名字加入到其集羣中的。所以,確保在不一樣環境中使用不一樣的集羣名字。一個集羣能夠只有一個節點。強烈建議在配置elasticsearch時,配置成集羣模式。


節點
節點就是一臺單一的服務器,是集羣的一部分,存儲數據並參與集羣的索引和搜索功能。像集羣同樣,節點也是經過名字來標識,默認是在節點啓動時隨機分配的字符名。固然啦,你能夠本身定義。該名字也蠻重要的,在集羣中用於識別服務器對應的節點。
節點能夠經過指定集羣名字來加入到集羣中。默認狀況下,每一個節點被設置成加入到elasticsearch集羣。若是啓動了多個節點,假設能自動發現對方,他們將會自動組建一個名爲elasticsearch的集羣。

索引
索引是有幾分類似屬性的一系列文檔的集合。如nginx日誌索引、syslog索引等等。索引是由名字標識,名字必須所有小寫。這個名字用來進行索引、搜索、更新和刪除文檔的操做。
索引至關於關係型數據庫的庫。


類型
在一個索引中,能夠定義一個或多個類型。類型是一個邏輯類別仍是分區徹底取決於你。一般狀況下,一個類型被定於成具備一組共同字段的文檔。如chinasoft全部的數據存入在一個單一的名爲logstash-chinasoft的索引中,同時,定義了用戶數據類型,帖子數據類型和評論類型。
類型相對於關係型數據庫的表。

文檔
文檔是信息的基本單元,能夠被索引的。文檔是以JSON格式表現的。
在類型中,能夠根據需求存儲多個文檔。
雖然一個文檔在物理上位於一個索引,實際上一個文檔必須在一個索引內被索引和分配一個類型。
文檔相對於關係型數據庫的列。


分片和副本
在實際狀況下,索引存儲的數據可能超過單個節點的硬件限制。如一個十億文檔需1TB空間可能不適合存儲在單個節點的磁盤上,或者從單個節點搜索請求太慢了。爲了解決這個問題,elasticsearch提供將索引分紅多個分片的功能。當在建立索引時,能夠定義想要分片的數量。每個分片就是一個全功能的獨立的索引,能夠位於集羣中任何節點上。
分片的兩個最主要緣由:
a、水平分割擴展,增大存儲量
b、分佈式並行跨分片操做,提升性能和吞吐量
分佈式分片的機制和搜索請求的文檔如何彙總徹底是有elasticsearch控制的,這些對用戶而言是透明的。
網絡問題等等其它問題能夠在任什麼時候候不期而至,爲了健壯性,強烈建議要有一個故障切換機制,不管何種故障以防止分片或者節點不可用。
爲此,elasticsearch讓咱們將索引分片複製一份或多份,稱之爲分片副本或副本。


副本也有兩個最主要緣由:
高可用性,以應對分片或者節點故障。出於這個緣由,分片副本要在不一樣的節點上。
提供性能,增大吞吐量,搜索能夠並行在全部副本上執行。
總之,每個索引能夠被分紅多個分片。索引也能夠有0個或多個副本。複製後,每一個索引都有主分片(母分片)和複製分片(複製於母分片)。分片和副本數量能夠在每一個索引被建立時定義。索引建立後,能夠在任什麼時候候動態的更改副本數量,可是,不能改變分片數。
默認狀況下,elasticsearch爲每一個索引分片5個主分片和1個副本,這就意味着集羣至少須要2個節點。索引將會有5個主分片和5個副本(1個完整副本),每一個索引總共有10個分片。


每一個elasticsearch分片是一個Lucene索引。一個單個Lucene索引有最大的文檔數LUCENE-5843, 文檔數限制爲2147483519(MAX_VALUE – 128)。 可經過_cat/shards來監控分片大小。
1.2 logstash


1.2.1 logstash 介紹

LogStash由JRuby語言編寫,基於消息(message-based)的簡單架構,並運行在Java虛擬機(JVM)上。不一樣於分離的代理端(agent)或主機端(server),LogStash可配置單一的代理端(agent)與其它開源軟件結合,以實現不一樣的功能。

1.2.2 logStash的四大組件

Shipper:發送事件(events)至LogStash;一般,遠程代理端(agent)只須要運行這個組件便可;
Broker and Indexer:接收並索引化事件;
Search and Storage:容許對事件進行搜索和存儲;
Web Interface:基於Web的展現界面
正是因爲以上組件在LogStash架構中可獨立部署,才提供了更好的集羣擴展性。
1.2.2 LogStash主機分類

代理主機(agent host):做爲事件的傳遞者(shipper),將各類日誌數據發送至中心主機;只需運行Logstash 代理(agent)程序;
中心主機(central host):可運行包括中間轉發器(Broker)、索引器(Indexer)、搜索和存儲器(Search and Storage)、Web界面端(Web Interface)在內的各個組件,以實現對日誌數據的接收、處理和存儲。
1.3 kibana

Kibana 也是一個開源和免費的工具,他能夠幫助您彙總、分析和搜索重要數據日誌並提供友好的web界面。他能夠爲 Logstash 和 ElasticSearch 提供的日誌分析的 Web 界面

2、使用ELK必要性(解決運維痛點)
開發人員不能登陸線上服務器查看詳細日誌
各個系統都有日誌,日至數據分散難以查找
日誌數據量大,查詢速度慢,或者數據不夠實時

3、elk部署之環境準備
3.1 機器準備

兩臺虛擬機:
192.168.3.17 node1.chinasoft.com
192.168.3.16 node2.chinasoft.com

關閉防火牆、selinux,時間設置成同樣

3.2 系統環境(兩臺徹底一致)

cat /etc/redhat-release 
CentOS release 6.5 (Final)

這裏採用rpm包安裝
rpm -ivh elasticsearch-2.3.3.rpm

rpm -ivh logstash-2.3.2-1.noarch.rpm 
安裝kibana
cd /usr/local/src
wget https://download.elastic.co/kibana/kibana/kibana-4.3.1-linux-x64.tar.gz
tar zxf kibana-4.3.1-linux-x64.tar.gz
mv kibana-4.3.1-linux-x64 /usr/local/
ln -s /usr/local/kibana-4.3.1-linux-x64/ /usr/local/kibana
安裝Redis,nginx和java

rpm -ivh jdk-8u102-linux-x64.rpm

yum install -y redis nginx

4、管理配置elasticsearch
4.1 管理node1.cinasoft.com的elasticsearch


修改elasticsearch配置文件,並受權


grep -n '^[a-Z]' /etc/elasticsearch/elasticsearch.yml


cluster.name: chinasoft_elk_cluster 判別節點是不是統一集羣


node.name: node1.chinasoft.com 節點的hostname


node.master: true 是否爲主節點


path.data: /data/es-data 數據存放路徑


path.logs: /var/log/elasticsearch/ 日誌路徑


bootstrap.mlockall: true 鎖住內存,使內存不會再swap中使用


network.host: 0.0.0.0 容許訪問的ip


http.port: 9200 端口

mkdir -p /data/es-data
chown elasticsearch.elasticsearch /data/es-data/
啓動elasticsearch


service elasticsearch start
Starting elasticsearch:                                    [  OK  ]


chkconfig elasticsearch on

/etc/init.d/elasticsearch status
elasticsearch (pid  3545) is running...


ss -tunlp|grep 9200
tcp    LISTEN     0      50                    :::9200                 :::*      users:(("java",3545,108))


訪問9200端口,會把信息顯示出來
http://192.168.3.17:9200/

{
  "name" : "node1.chinasoft.com",
  "cluster_name" : "chinasoft_elk_cluster",
  "version" : {
    "number" : "2.3.3",
    "build_hash" : "218bdf10790eef486ff2c41a3df5cfa32dadcfde",
    "build_timestamp" : "2016-05-17T15:40:04Z",
    "build_snapshot" : false,
    "lucene_version" : "5.5.0"
  },
  "tagline" : "You Know, for Search"
}


4.2 elasticsearch進行交互


4.2.1 交互的兩種方法


Java API :
node client
Transport client
RESTful API
Javascript
.NET
php
Perl
Python
Ruby


4.2.2使用RESTful API進行交互


查看當前索引和分片狀況,稍後會有插件展現


curl -i -XGET 'http://192.168.3.17:9200/_count?pretty' -d '{
"query" {
"match_all": {}
}
}'


HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 95
{
"count" : 0, 索引0個
"_shards" : { 分區0個
"total" : 0,
"successful" : 0, 成功0個
"failed" : 0 失敗0個
}
}

使用head插件顯示索引和分片狀況

[root@linux-node1 src]# /usr/share/elasticsearch/bin/plugin install mobz/elasticsearch-head


報錯:ERROR: failed to download out of all possible locations..., use --verbose to get detailed information

緣由:DNS配置有誤,從新配置便可

在插件中添加一個index-demo/test的索引,提交請求
http://192.168.3.17:9200/_plugin/head/

{
"_index": "index-demo",
"_type": "test",
"_id": "AVgAU8a2aw-Ww-rZC4yF",
"_version": 1,
"_shards": {
"total": 2,
"successful": 1,
"failed": 0
},
"created": true
}

發送一個GET(固然可使用其餘類型請求)請求,查詢上述索引id

在基本查詢中查看所建索引

4.2管理node2.chinasoft.com的elasticsearch

將node1的配置文件拷貝到node2中,並修改配置文件並受權
配置文件中cluster.name的名字必定要一致,當集羣內節點啓動的時候,默認使用組播(多播),尋找集羣中的節點

scp /etc/elasticsearch/elasticsearch.yml 192.168.3.16:/etc/elasticsearch/

node2: 
sed -i 's#node.name: node1.chinasoft.com#node.name: node2.chinasoft.com#g' /etc/elasticsearch/elasticsearch.yml
刪除這行:
node.master: true

驗證:
[root@node2 network-scripts]# egrep -v '#|^$' /etc/elasticsearch/elasticsearch.yml 
cluster.name: chinasoft_elk_cluster
node.name: node2.chinasoft.com
path.logs: /var/log/elasticsearch/
bootstrap.mlockall: true
network.host: 0.0.0.0
http.port: 9200

mkdir -p /data/es-data
chown elasticsearch.elasticsearch /data/es-data/
啓動elasticsearch

service elasticsearch start
chkconfig elasticsearch on

在node2配置中添加以下內容,使用單播模式(嘗試了使用組播,可是不生效)


grep -n "^discovery" /etc/elasticsearch/elasticsearch.yml
discovery.zen.ping.unicast.hosts: ["node1.chinasoft.com", "node2.chinasoft.com"]
service elasticsearch restart

在瀏覽器中查看分片信息,一個索引默認被分紅了5個分片,每份數據被分紅了五個分片(能夠調節分片數量),下圖中外圍帶綠色框的爲主分片,不帶框的爲副本分片,主分片丟失,副本分片會複製一份成爲主分片,起到了高可用的做用,主副分片也可使用負載均衡加快查詢速度,可是若是主副本分片都丟失,則索引就是完全丟失。


4.3使用kopf插件監控elasticsearch


/usr/share/elasticsearch/bin/plugin install lmenezes/elasticsearch-kopf


訪問:http://192.168.3.17:9200/_plugin/kopf/#!/cluster


點擊菜單欄的nodes 能夠看出節點的負載,cpu適應狀況,java對內存的使用(heap usage),磁盤使用,啓動時間


除此以外,kopf插件還提供了REST API 等,相似kopf插件的還有bigdesk,可是bigdesk目前還不支持2.1!安裝bigdesk的方法以下


/usr/share/elasticsearch/bin/plugin install lukas-vlcek/bigdesk


4.4node間組播通訊和分片


當第一個節點啓動,它會組播發現其餘節點,發現集羣名字同樣的時候,就會自動加入集羣。隨便一個節點都是能夠鏈接的,並非主節點才能夠鏈接,鏈接的節點起到的做用只是彙總信息展現


最初能夠自定義設置分片的個數,分片一旦設置好,就不能夠改變。主分片和副本分片都丟失,數據即丟失,沒法恢復,能夠將無用索引刪除。有些老索引或者不經常使用的索引須要按期刪除,不然會致使es資源剩餘有限,佔用磁盤大,搜索慢等。若是暫時不想刪除有些索引,能夠在插件中關閉索引,就不會佔用內存了。


5、配置logstash
5.1按部就班學習logstash


啓動一個logstash,-e:在命令行執行;input輸入,stdin標準輸入,是一個插件;output輸出,stdout:標準輸出


# /opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{} }' Settings: Debault filter worker: 1


Settings: Default pipeline workers: 2
Pipeline main started
chuck ==>輸入
2016-10-28T03:10:52.276Z node1.chinasoft.com chuck ==>輸出
www.chinasoft.com ==>輸入
2016-10-28T03:11:03.169Z node1.chinasoft.com www.chinasoft.com ==>輸出


使用rubudebug顯示詳細輸出,codec爲一種編解碼器
# /opt/logstash/bin/logstash -e 'input { stdin{} } output { stdout{ codec => rubydebug} }'
Settings: Default pipeline workers: 2
Pipeline main started
chunck ==>輸入
{
       "message" => "chunck",
      "@version" => "1",
    "@timestamp" => "2016-10-28T03:15:02.824Z",
          "host" => "node1.chinasoft.com"
} ==>使用rubydebug輸出


上述每一條輸出的內容稱爲一個事件,多個相同的輸出的內容合併到一塊兒稱爲一個事件(舉例:日誌中連續相同的日誌輸出稱爲一個事件)
使用logstash將信息寫入到elasticsearch


# /opt/logstash/bin/logstash -e 'input { stdin{} } output { elasticsearch { hosts => ["192.168.3.17:9200"] } }'
Settings: Default pipeline workers: 2
Pipeline main started
jack
chunck
www.chinasoft.com


在elasticsearch中寫一份,同時在本地輸出一份,也就是在本地保留一份文本文件,也就不用在elasticsearch中再定時備份到遠端一份了。此處使用的保留文本文件三大優點:1)文本最簡單 2)文本能夠二次加工 3)文本的壓縮比最高


# /opt/logstash/bin/logstash -e 'input { stdin{} } output {elasticsearch {hosts => ["192.168.3.17:9200"] } stdout{ codec => rubydebug } }'
Settings: Default pipeline workers: 2
Pipeline main started
www.baidu.com
{
       "message" => "www.baidu.com",
      "@version" => "1",
    "@timestamp" => "2016-10-28T03:26:18.736Z",
          "host" => "node1.chinasoft.com"
}
www.elastic.co
{
       "message" => "www.elastic.co",
      "@version" => "1",
    "@timestamp" => "2016-10-28T03:26:32.609Z",
          "host" => "node1.chinasoft.com"
}


使用logstash啓動一個配置文件,會在elasticsearch中寫一份


# vim normal.conf


input { stdin { } }
output {
elasticsearch { hosts => ["192.168.3.17:9200"] }
stdout { codec => rubydebug }
}


# /opt/logstash/bin/logstash -f normal.conf 
Settings: Default pipeline workers: 2
Pipeline main started
123
{
       "message" => "123",
      "@version" => "1",
    "@timestamp" => "2016-10-28T03:33:35.899Z",
          "host" => "node1.chinasoft.com"
}
chinasoft
{
       "message" => "chinasoft",
      "@version" => "1",
    "@timestamp" => "2016-10-28T03:33:44.641Z",
          "host" => "node1.chinasoft.com"
}


5.2學習編寫conf格式


輸入插件配置,此處以file爲例,能夠設置多個


input {
file {
path => "/var/log/messages"
type => "syslog"
}
file {
path => "/var/log/nginx/access.log"
type => "nginx"
}
}


介紹幾種收集文件的方式,可使用數組方式或者用*匹配,也能夠寫多個path
path => ["/var/log/messages","/var/log/*.log"]
path => ["/data/mysql/mysql.log"]


設置boolean值
ssl_enable => true


文件大小單位
my_bytes => "1113" # 1113 bytes
my_bytes => "10MiB" # 10485760 bytes
my_bytes => "100kib" # 102400 bytes
my_bytes => "180 mb" # 180000000 bytes


jason收集
codec => 「json」
hash收集


match => {
"field1" => "value1"
"field2" => "value2"
...
}


端口
port => 21
密碼
my_password => "password"


5.3 學習編寫input的file插件


5.3.1 input插件之input


sincedb_path:記錄logstash讀取位置的路徑
start_postion :包括beginning和end,指定收集的位置,默認是end,從尾部開始
add_field 加一個域
discover_internal 發現間隔,每隔多久收集一次,默認15秒


5.4 學習編寫output的file插件


5.5 經過input和output插件編寫conf文件


5.5.1 收集系統日誌的conf
------------------------------------------------
# vim nginx.conf
input {
file {
path => "/var/log/nginx/access.log"
type => "nginx"
start_position => "beginning"
}
}
output {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "nginx-%{+YYYY.MM.dd}"
}
}
# /opt/logstash/bin/logstash -f nginx.conf
------------------------------------------------



5.5.2 收集elasticsearch的error日誌


此處把上個system日誌和這個error(java程序日誌)日誌,放在一塊兒。使用if判斷,兩種日誌分別寫到不一樣索引中.此處的type(固定的就是type,不可更改)不能夠和日誌格式的任何一個域(能夠理解爲字段)的名稱重複,也就是說日誌的域不能夠有type這個名稱。


vim all.conf


input {
file {
path => "/var/log/nginx/access.log"
type => "nginx"
start_position => "beginning"
}
file {
path => "/var/log/elasticsearch/chinasoft_elk_cluster.log"
type => "es-error"
start_position => "beginning"
}
}
output {
if [type] == "nginx" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "nginx-%{+YYYY.MM.dd}"
}
}
if [type] == "es-error" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "es-error-%{+YYYY.MM.dd}"
}
}
}


5.6 把多行整個報錯收集到一個事件中


5.6.1舉例說明
以at.org開頭的內容都屬於同一個事件,可是顯示在不一樣行,這樣的日誌格式看起來很不方便,因此須要把他們合併到一個事件中


5.6.2引入codec的multiline插件


官方文檔提供


input {
stdin {
codec => multiline {
` pattern => "pattern, a regexp"
negate => "true" or "false"
what => "previous" or "next"`
}
}
}


regrxp:使用正則,什麼狀況下把多行合併起來
negate:正向匹配和反向匹配
what:合併到當前行仍是下一行
在標準輸入和標準輸出中測試以證實多行收集到一個日誌成功


vim muliline.conf


input {
stdin {
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
output {
stdout {
codec => "rubydebug"
}
}


# /opt/logstash/bin/logstash -f muliline.conf 
Settings: Default pipeline workers: 2
Pipeline main started
[1     
Received an event that has a different character encoding than you configured. {:text=>"\\xE3[1\\n", :expected_charset=>"UTF-8", :level=>:warn}
[2    
{
    "@timestamp" => "2016-10-28T06:19:59.275Z",
       "message" => "\\xE3[1\\n",
      "@version" => "1",
          "host" => "node1.chinasoft.com"
}
{
chinasoft            
chinasoft.com
123456
[3
{
    "@timestamp" => "2016-10-28T06:21:13.812Z",
       "message" => "[2\n{\nchinasoft\nchinasoft.com\n123456",
      "@version" => "1",
          "tags" => [
        [0] "multiline"
    ],
          "host" => "node1.chinasoft.com"
}


繼續將上述實驗結果放到all.conf的es-error索引中


vim all.conf


input {
file {
path => "/var/log/nginx/access.log"
type => "nginx"
start_position => "beginning"
}
file {
path => "/var/log/elasticsearch/chuck-clueser.log"
type => "es-error"
start_position => "beginning"
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
output {
if [type] == "nginx" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "nginx-%{+YYYY.MM.dd}"
}
}
if [type] == "es-error" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "es-error-%{+YYYY.MM.dd}"
}
}
}


6、熟悉kibana
6.1 編輯kinaba配置文件使之生效


# grep '^[a-Z]' /usr/local/kibana/config/kibana.yml
server.port: 5601 # kibana端口
server.host: "0.0.0.0" 對外服務的主機
elasticsearch.url: "http://192.168.3.17:9200" # 和elasticsearch聯繫
kibana.index: " .kibana # 在elasticsearch中添加.kibana索引




開啓一個screen,並啓動kibana
yum install -y screen
# screen
# /usr/local/kibana/bin/kibana
使用crtl +a+d退出screen
使用瀏覽器打開192.168.3.17:5601


6.2 驗證error的muliline插件生效


在kibana中添加一個es-error索引


能夠看到默認的字段
選擇discover查看
驗證error的muliline插件生效(即過濾條件,將多行錯誤轉爲一行)


7、logstash收集nginx、syslog和tcp日誌
7.1收集nginx的訪問日誌


在這裏使用codec的json插件將日誌的域進行分段,使用key-value的方式,使日誌格式更清晰,易於搜索,還能夠下降cpu的負載
更改nginx的配置文件的日誌格式,使用json


vim /etc/nginx/nginx.conf


log_format json '{ "@timestamp": "$time_local", '
'"@fields": { '
'"remote_addr": "$remote_addr", '
'"remote_user": "$remote_user", '
'"body_bytes_sent": "$body_bytes_sent", '
'"request_time": "$request_time", '
'"status": "$status", '
'"request": "$request", '
'"request_method": "$request_method", '
'"http_referrer": "$http_referer", '
'"body_bytes_sent":"$body_bytes_sent", '
'"http_x_forwarded_for": "$http_x_forwarded_for", '
'"http_user_agent": "$http_user_agent" } }';


# access_log /var/log/nginx/access_json.log main;
access_log /var/log/nginx/access.log json;


從新啓動nginx


# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful


# ss -tunlp|grep nginx
tcp    LISTEN     0      128                    *:80                    *:*      users:(("nginx",13590,6),("nginx",13591,6))


日誌格式顯示以下


使用logstash將nginx訪問日誌收集起來,繼續寫到all.conf中


將nginx-log加入kibana中並顯示


7.2 收集系統syslog日誌


前文中已經使用文件file的形式收集了系統日誌/var/log/messages,可是實際生產環境是須要使用syslog插件直接收集
修改syslog的配置文件,把日誌信息發送到514端口上
# vim /etc/rsyslog.conf

90 *.* @@192.168.3.17

# service rsyslog restart
將system-syslog放到all.conf中,啓動all.conf

input {
syslog {
type => "system-syslog"
host => "192.168.3.17"
port => "514"
}
file {
path => "/var/log/nginx/access.log"
type => "nginx"
start_position => "beginning"
}
file {
path => "/var/log/elasticsearch/chuck-clueser.log"
type => "es-error"
start_position => "beginning"
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
output {
if [type] == "nginx" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "nginx-%{+YYYY.MM.dd}"
}
}
if [type] == "es-error" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "es-error-%{+YYYY.MM.dd}"
}
}
if [type] == "system-syslog" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "system-syslog-%{+YYYY.MM.dd}"
}
}
}
在elasticsearch插件中就可見到增長的system-syslog索引

7.3 收集tcp日誌

編寫tcp.conf

# vim tcp.conf
input {
tcp {
host => "192.168.3.17"
port => "6666"
}
}
output {
stdout {
codec => "rubydebug"
}
}
使用nc對6666端口寫入數據


# nc 192.168.3.17 6666 </var/log/yum.log
將信息輸入到tcp的僞設備中


將信息輸入到tcp的僞設備中
# echo "chinasoft" >/dev/tcp/192.168.3.17/6666


8、logstash解耦之消息隊列
8.1 圖解使用消息隊列架構


數據源Datasource把數據寫到input插件中,output插件使用消息隊列把消息寫入到消息隊列Message Queue中,Logstash indexing Instance啓動logstash使用input插件讀取消息隊列中的信息,Fliter插件過濾後在使用output寫入到elasticsearch中。
若是生產環境中不適用正則grok匹配,能夠寫Python腳本從消息隊列中讀取信息,輸出到elasticsearch中


8.2 上圖架構的優勢


解耦,鬆耦合
解除了因爲網絡緣由不能直接連elasticsearch的狀況
方便架構演變,增長新內容
消息隊列可使用rabbitmq,zeromq等,也可使用redis,kafka(消息不刪除,可是比較重量級)等


9、引入redis到架構中
9.1 使用redis收集logstash的信息


修改redis的配置文件並啓動redis


vim /etc/redis.conf


daemonize yes
bind 192.168.3.17


service redis restart
# ss -tunlp|grep 6379
tcp    LISTEN     0      128         192.168.3.17:6379                  *:*      users:(("redis-server",17337,4))


編寫redis.conf


# vim redis-out.conf
input{
stdin{
}
}
output{
redis{
host => "192.168.3.17"
port => "6379"
db => "6"
data_type => "list" # 數據類型爲list
key => "demo"
}
}


啓動配置文件輸入信息


# /opt/logstash/bin/logstash -f redis-out.conf
Settings: Default pipeline workers: 2
Pipeline main started
chinasoft
chinasoft.com


使用redis-cli鏈接到redis並查看輸入的信息


# redis-cli -h 192.168.3.17


redis 192.168.3.17:6379> info


redis_version:2.4.10
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:64
multiplexing_api:epoll
gcc_version:4.4.6
process_id:17337
uptime_in_seconds:563
uptime_in_days:0
lru_clock:988645
used_cpu_sys:0.13
used_cpu_user:0.11
used_cpu_sys_children:0.00
used_cpu_user_children:0.00
connected_clients:2
connected_slaves:0
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
used_memory:735488
used_memory_human:718.25K
used_memory_rss:1454080
used_memory_peak:735416
used_memory_peak_human:718.18K
mem_fragmentation_ratio:1.98
mem_allocator:jemalloc-2.2.5
loading:0
aof_enabled:0
changes_since_last_save:2
bgsave_in_progress:0
last_save_time:1477892296
bgrewriteaof_in_progress:0
total_connections_received:2
total_commands_processed:3
expired_keys:0
evicted_keys:0
keyspace_hits:0
keyspace_misses:0
pubsub_channels:0
pubsub_patterns:0
latest_fork_usec:0
vm_enabled:0
role:master
db6:keys=1,expires=0


redis 192.168.3.17:6379> select 6 #選擇db6
OK
redis 192.168.3.17:6379[6]> keys * #選擇demo這個key
1) "demo"
redis 192.168.3.17:6379[6]> LINDEX demo -2 #查看消息
"{\"message\":\"chinasoft\",\"@version\":\"1\",\"@timestamp\":\"2016-10-31T05:44:02.823Z\",\"host\":\"node1.chinasoft.com\"}"
redis 192.168.3.17:6379[6]> LINDEX demo -1 #查看消息
"{\"message\":\"chinasoft.com\",\"@version\":\"1\",\"@timestamp\":\"2016-10-31T05:44:15.855Z\",\"host\":\"node1.chinasoft.com\"}"


爲了下一步寫input插件到把消息發送到elasticsearch中,多在redis中寫入寫數據
# /opt/logstash/bin/logstash -f redis-out.conf
Settings: Default pipeline workers: 2
Pipeline main started
chinasoft
chinasoft.com
a
b
c
d
....


查看redis中名字爲demo的key長度


redis 192.168.3.17:6379[6]> llen demo
(integer) 37


9.3 將all.conf的內容改成經由redis


編寫shipper.conf做爲redis收集logstash配置文件


# cp all.conf shipper.conf
# vim shipper.conf
-------------------------------------
input {
syslog {
type => "system-syslog"
host => "192.168.3.17"
port => "514"
}
file {
path => "/var/log/nginx/access.log"
type => "nginx"
start_position => "beginning"
}
file {
path => "/var/log/elasticsearch/chuck-clueser.log"
type => "es-error"
start_position => "beginning"
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
output {
if [type] == "nginx" {
redis{
host => "192.168.3.17"
port => "6379"
db => "6"
data_type => "list"
key => "nginx"
}
}
if [type] == "es-error" {
redis {
host => "192.168.3.17"
port => "6379"
db => "6"
data_type => "list"
key => "es-error"
}
}
if [type] == "system-syslog" {
redis{
host => "192.168.3.17"
port => "6379"
db => "6"
data_type => "list"
key => "system-syslog"
}
}
}
-------------------------------------


# /opt/logstash/bin/logstash -f shipper.conf 
Settings: Default pipeline workers: 2
Pipeline main started




在redis中查看keys


192.168.56.11:6379[6]> select 6
OK
192.168.56.11:6379[6]> keys *
1) "demo"
2) "nginx"


在別的機器上用ab進行對3.17的nginx進行壓力測試,能夠看到redis的變化
# ab -c 10 -n 100000 http://192.168.3.17/


redis 192.168.3.17:6379[6]> llen nginx
(integer) 10002
redis 192.168.3.17:6379[6]> llen nginx
(integer) 11989
redis 192.168.3.17:6379[6]> llen nginx
(integer) 12878
redis 192.168.3.17:6379[6]> llen nginx
(integer) 13757


編寫indexer.conf做爲redis發送elasticsearch配置文件(配置文件報錯:Redis connection problem {:exception=>#<Redis::CommandError: ERR unknown command 'script'>, :level=>:warn}
)測試不成功
# cat indexer.conf


input {
redis {
type => "system-syslog"
host => "192.168.3.17"
port => "6379"
db => "6"
data_type => "list"
key => "system-syslog"
}
redis {
type => "nginx"
host => "192.168.3.17"
port => "6379"
db => "6"
data_type => "list"
key => "nginx"
}
redis {
type => "es-error"
host => "192.168.3.17"
port => "6379"
db => "6"
data_type => "list"
key => "nginx"
}
}
output {
if [type] == "system-syslog" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "system-syslog-%{+YYYY.MM.dd}"
}
}
if [type] == "nginx" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "nginx-%{+YYYY.MM.dd}"
}
}
if [type] == "es-error" {
elasticsearch {
hosts => ["192.168.3.17:9200"]
index => "es-error-%{+YYYY.MM.dd}"
}
}
}


啓動indexer.conf


# /opt/logstash/bin/logstash -f indexer.conf
Settings: Default filter workers: 1


因爲日誌量小,很快就會所有被髮送到elasticsearch,key也就沒了,因此多寫寫數據到日誌中


# for n in `seq 10000` ;do echo $n >>/var/log/nginx/access.log;done
# for n in `seq 10000` ;do echo $n >>/var/log/messages;done


10、生產如何上線ELK。
10.1日誌分類


系統日誌  rsyslog   logstash syslog插件
訪問日誌  nginx     logstash  codec json
錯誤日誌  file      logstash file+ mulitline
運行日誌  file      logstash codec json
設備日誌  syslog    logstash syslog插件
debug日誌 file      logstash json or mulitline
10.2 日誌標準化


 1)路徑固定標準化
 2)格式儘可能使用json
10.3日誌收集步驟


系統日誌開始->錯誤日誌->運行日誌->訪問日誌


前文學習了input和output插件,在這裏學習fliter插件




kibana中搜索狀態碼爲200或者302的訪問記錄:
status 302 or status 200


在客戶端安裝

1.安裝客戶端程序 # rpm -ivh logstash-2.3.2-1.noarch.rpm chkconfig logstash on 2.編輯文件,重啓logstash,服務端添加索引 # vim /etc/logstash/conf.d/flowsdk.conf input { file { path => "/data/yunva/access/logs/all.log" type => "ck_access" start_position => "beginning" } } output { if [type] == "ck_access" { elasticsearch { hosts => ["u04elk.yaya.corp:9200"] index => "ck_access-%{+YYYY.MM.dd}" } } } 調試(logstash客戶端) service logstash start沒法抓取 # /opt/logstash/bin/logstash -f changke03.conf &
相關文章
相關標籤/搜索