歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

ELK 初探

ELK實時日志分析平台 初次嘗試。

平台

CentOS 7
Oracle JDK 8
Kibana 4.5.2
Elaticsearch 2.3.4
logstash 2.3.4
filebeat 1.2.3
查看version command: filebeat --version

系統架構圖

這裡寫圖片描述

軟件的安裝

采用yum的安裝模式。首先需要添加對應的repo文件。 對應的詳細的安裝方法可以參考在線文檔, 這裡以logstash為例。

logstash 安裝

Download and install the public signing key
rpm --import https://packages.elastic.co/GPG-KEY-elasticsearch
添加Repo到目錄/etc/yum.repos.d/, 比如:logstash.repo
[logstash-2.3]
name=Logstash repository for 2.3.x packages
baseurl=https://packages.elastic.co/logstash/2.3/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1
安裝
yum install logstash
隨系統自動啟動
sudo chkconfig --add filebeat

其他軟件的repositories

filebeat

[beats]
name=Elastic Beats Repository
baseurl=https://packages.elastic.co/beats/yum/el/$basearch
enabled=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
gpgcheck=1

elasticsearch 官方介紹

[elasticsearch-2.x]
name=Elasticsearch repository for 2.x packages
baseurl=https://packages.elastic.co/elasticsearch/2.x/centos
gpgcheck=1
gpgkey=https://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

kibana 在線文檔

[kibana-4.5]
name=Kibana repository for 4.5.x packages
baseurl=http://packages.elastic.co/kibana/4.5/centos
gpgcheck=1
gpgkey=http://packages.elastic.co/GPG-KEY-elasticsearch
enabled=1

查看服務狀態

servie logstash status

查看服務文件路徑

rpm -ql logstash

FileBeat 使用

filebeat 安裝後的配置文件存放於:/etc/filebeat/下
修改配置文件filebeat.yml
1, 修改文件的路徑:比如:/home/osboxes/app.log

filebeat:
  prospectors:
    -
      paths:
        - "/home/osboxes/app.log"

2, 修改輸出, 默認是直接輸出到Elasticsearch,我們修改輸出到logstash
只需要打開對應的注釋即可,將elasticsearch相關注釋掉, 打開logstash的注釋。

output:
  logstash:
    hosts: ["127.0.0.1:5044"]

    # Optional load balance the events between the Logstash hosts
    #loadbalance: true

filebeat.yml 已經配置了多個output選項,我們只需要打開注解。 這裡可以做個小的測試。 修改配置後可運行命令驗證:filebeat -configtest -e. filebeat只能配置一個output項,修改配置後需要重啟
1,找到Console output,打開注解

##Console output
   console:
    # Pretty print json event
    pretty: true

2, 停止filebeat服務 sudo service filebeat stop,手動啟動filebeat來方便我們觀察console輸出sudo filebeat -e -c /etc/filebeat/filebeat.yml
3, 新開窗口輸出信息至文件/var/log/app.log

echo "2016-06-29 17:14:13.802  INFO 6244 --- [main] org.hibernate.Version                    : HHH000412: Hibernate Core {4.3.11.Final}" >> app.log

4,切換至filebeat的啟動窗口可以看到如下的輸出。

[osboxes@osboxes logstash]$ sudo filebeat -e -c /etc/filebeat/filebeat.yml
{
  "@timestamp": "2016-07-11T13:44:43.926Z",
  "beat": {
    "hostname": "osboxes",
    "name": "osboxes"
  },
  "count": 1,
  "fields": null,
  "input_type": "log",
  "message": "2016-06-29 17:14:13.802  INFO 6244 --- [main] org.hibernate.Version                    : HHH000412: Hibernate Core {4.3.11.Final}",
  "offset": 130,
  "source": "/home/osboxes/app.log",
  "type": "log"
}

LogStash 配置

上面的小測做完後,將filebeat的配置改回輸出到logstash。

連通filebeat和logstash

1, 添加logstash.conf 文件在/etc/logstash/conf.d/logstash.conf

input {
  beats {
    port => 5044
  }
}

output {
  stdout{}
}

修改後可以通過命令驗證配置是否正確:

sudo ./logstash -f /etc/logstash/conf.d/logstash.conf --configtest

2, 啟動logstash
進入/opt/logstash/bin 采用命令啟動方便從console觀察輸出。sudo ./logstash -f /etc/logstash/conf.d/logstash.conf如果采用service的啟動方式,需要去/var/log/logstash/logstash.stdout 查看log
3,啟動filebeat 然後向文件app.log 寫入log

echo "2016-06-29 17:14:13.802  INFO 6244 --- [main] org.hibernate.Version                    : HHH000412: Hibernate Core {4.3.11.Final}" >> app.log

4,切換至logstash窗口, 可以觀察到一下輸出,證明filebeat已經可以成功輸出到logstash

[osboxes@osboxes bin]$ sudo ./logstash -f /etc/logstash/conf.d/logstash.conf 
Settings: Default pipeline workers: 1
Pipeline main started
2016-07-12T05:57:46.877Z osboxes 2016-06-29 17:14:13.802  INFO 6244 --- [main] org.hibernate.Version                    : HHH000412: Hibernate Core {4.3.11.Final}

使用Grok Filter Plugin解析日志 (spring boot 的默認日志格式)

1, 修改logstash.conf 添加filter,重啟logstash

input {
  beats {
    port => 5044
  }
}
filter {
  #If log line contains tab character followed by 'at' then we will tag that entry as stacktrace
  if [message] =~ "\tat" {
    grok {
      match => ["message", "^(\tat)"]
      add_tag => ["stacktrace"]
    }
  }

  #Grokking Spring Boot's default log format
  grok {
    match => [ "message",
               "(?%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} --- \[(?[A-Za-z0-9-]+)\] (?[A-Za-z0-9.#_]+)\s*:\s+(?.*)",
               "message",
               "(?%{YEAR}-%{MONTHNUM}-%{MONTHDAY} %{TIME})  %{LOGLEVEL:level} %{NUMBER:pid} --- .+? :\s+(?.*)"
             ]
  }

  #Parsing out timestamps which are in timestamp field thanks to previous grok section
  date {
    match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]
  }
}
output {
  stdout{
   codec => rubydebug
  }

2,寫入log到文件app.log

echo "2016-06-29 17:14:09.477  INFO 6244 --- [main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created." >> app.log

3, 切換logstash查看輸出

{
       "message" => "2016-06-29 17:14:09.477  INFO 6244 --- [main] faultConfiguringBeanFactoryPostProcessor : No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created.",
      "@version" => "1",
    "@timestamp" => "2016-06-29T16:14:09.477Z",
         "count" => 1,
        "fields" => nil,
        "source" => "/home/osboxes/app.log",
        "offset" => 987,
          "type" => "log",
    "input_type" => "log",
          "beat" => {
        "hostname" => "osboxes",
            "name" => "osboxes"
    },
          "host" => "osboxes",
          "tags" => [
        [0] "beats_input_codec_plain_applied"
    ],
     "timestamp" => "2016-06-29 17:14:09.477",
         "level" => "INFO",
           "pid" => "6244",
        "thread" => "main",
         "class" => "faultConfiguringBeanFactoryPostProcessor",
    "logmessage" => "No bean named 'errorChannel' has been explicitly defined. Therefore, a default PublishSubscribeChannel will be created."
}

至此,完成了初步的日志的解析,日志別解析至對應的fields中。 接下來將這些數據推送至Elasticsearch進行索引。

修改logstash配置,輸出到elasticsearch

修改配置文件的output。

output {
    elasticsearch {
    }
}

用這樣的結構,Logstash使用http協議連接到Elasticsearch。上面的例子假設Logstash和Elasticsearch運行在同一個機器上。您可以使用主機配置hosts => "es-machine:9092指定遠程Elasticsearch實例。

查看結果

一次啟動elasticsearch,kibana,logstash,filebeat。 (filebeat已啟動的話,無需重啟)

安裝Sense

進入/opt/kibana/ 運行:$sudo ./bin/kibana plugin --install elastic/sense
You should now be able to access Sense with a web browser on http://localhost:5601/app/sense

spring boot 日志配置

盡量采用統一的日志輸出格式
1, JPA 的sql輸出

#spring.jpa.show-sql = true #不推薦這種方式
logging.level.org.hibernate.SQL=DEBUG

常見的部署方式

由於logstash比較消耗系統資源, 采用filebeat 來采集數據, 然後推送到logstash。 簡單的case可以將logstash elasticsearch kibana 放在一個虛擬機。 filebeat可以分別安裝在各個對應的微服務上。 注意:當這些部署在不同的機器上的時候,需要打開對應的端口。 對應的配置也需要相對修改下。
打開logstash的端口:

$ sudo firewall-cmd --zone=public --add-port=5044/tcp --permanent
$ sudo firewall-cmd --reload

filebeat的配置修改

logstash:
    # The Logstash hosts
    hosts: ["192.168.1.186:5044"]

修改hostName
如果微服務部署在不同的虛擬機中, 可以通過修改hostname,然後在ES的index中通過hostname 來區分日志的來源

$ hostnamectl status
# hostnamectl set-hostname Your-New-Host-Name-Here

關於日志采集的策略

(網上未提及此topic)
配置logstash是件麻煩事情。 一下兩種策略互相沖突
1, 保證所有的log都index到ES
這中策略方便用戶查找問題, 因為所有的log都可以搜索到
2, 嚴格過濾, 只提取我們需要的log信息
這種很方便做統計, 但是其他很多log會被過濾掉, 用來找問題不方便。


快捷鍵

加粗 Ctrl + B 斜體 Ctrl + I 引用 Ctrl + Q 插入鏈接 Ctrl + L 插入代碼 Ctrl + K 插入圖片 Ctrl + G 提升標題 Ctrl + H 有序列表 Ctrl + O 無序列表 Ctrl + U 橫線 Ctrl + R 撤銷 Ctrl + Z 重做 Ctrl + Y

Markdown及擴展

Markdown 是一種輕量級標記語言,它允許人們使用易讀易寫的純文本格式編寫文檔,然後轉換成格式豐富的HTML頁面。 —— [ 維基百科 ]

使用簡單的符號標識不同的標題,將某些文字標記為粗體或者斜體,創建一個鏈接等,詳細語法參考幫助?。

本編輯器支持 Markdown Extra ,  擴展了很多好用的功能。具體請參考Github.

表格

Markdown Extra 表格語法:

項目 價格 Computer $1600 Phone $12 Pipe $1

可以使用冒號來定義對齊方式:

項目 價格 數量 Computer 1600 元 5 Phone 12 元 12 Pipe 1 元 234

定義列表

Markdown Extra 定義列表語法: 項目1 項目2 定義 A 定義 B 項目3 定義 C

定義 D

定義D內容

代碼塊

代碼塊語法遵循標准markdown代碼,例如:

@requires_authorization
def somefunc(param1='', param2=0):
    '''A docstring'''
    if param1 > param2: # interesting
        print 'Greater'
    return (param2 - param1 + 1) or None
class SomeClass:
    pass
>>> message = '''interpreter
... prompt'''

數學公式

使用MathJax渲染LaTex 數學公式,詳見math.stackexchange.com.

行內公式,數學公式為:Γ(n)=(n?1)!?n∈N。 塊級公式:

x=?b±b2?4ac???????√2a

更多LaTex語法請參考 這兒.

UML 圖:

可以渲染序列圖:

Created with Rapha?l 2.1.0張三張三李四李四嘿,小四兒, 寫博客了沒?李四愣了一下,說:忙得吐血,哪有時間寫。

或者流程圖:

Created with Rapha?l 2.1.0開始我的操作確認?結束yesno 關於 序列圖 語法,參考 這兒, 關於 流程圖 語法,參考 這兒.

離線寫博客

即使用戶在沒有網絡的情況下,也可以通過本編輯器離線寫博客(直接在曾經使用過的浏覽器中輸入write.blog.csdn.net/mdeditor即可。Markdown編輯器使用浏覽器離線存儲將內容保存在本地。

用戶寫博客的過程中,內容實時保存在浏覽器緩存中,在用戶關閉浏覽器或者其它異常情況下,內容不會丟失。用戶再次打開浏覽器時,會顯示上次用戶正在編輯的沒有發表的內容。

博客發表後,本地緩存將被刪除。 

用戶可以選擇 把正在寫的博客保存到服務器草稿箱,即使換浏覽器或者清除緩存,內容也不會丟失。

注意:雖然浏覽器存儲大部分時候都比較可靠,但為了您的數據安全,在聯網後,請務必及時發表或者保存到服務器草稿箱

浏覽器兼容

目前,本編輯器對Chrome浏覽器支持最為完整。建議大家使用較新版本的Chrome。 IE9以下不支持 IE9,10,11存在以下問題
不支持離線功能 IE9不支持文件導入導出 IE10不支持拖拽文件導入
Copyright © Linux教程網 All Rights Reserved