1. 程式人生 > >在CentOS上整合filebeat+ELK docker收集日誌

在CentOS上整合filebeat+ELK docker收集日誌

架構:

  1. Dcker 安裝
    1. docker 需要Linux Kernels 不低於 3.10 並且是 64-bit 機器。

    2. 更新yum(centos低版本更新,高版本可以不用更新),避免安裝失敗。

      更新完成

    3. 使用yum安裝docker

      安裝完成

    4. 檢查是否安裝成功

      Docker啟動成功

     

    5.設定開機啟動

                       

  1. 檢視docker的版本號

  2. 檢視系統(docker)層面資訊,包括管理的images, containers數等。

  1. 下載docker映象
    1. 拉取elk整合映象,不加版本號預設下載最新版本

    2. vm.max_map_count至少需要262144。

      新增vm.max_map_count=262144

      執行命令:sysctl -p 檢視

    3. 檢視本地docker 映象

    4. 建立容器,elk為容器名稱,唯一,容器名稱不能衝突。sebp/elk為映象名稱

      docker run -p 5601:5601 -p 9200:9200 -p 5044:5044 -it --name elk sebp/elk

    5. 檢視所有容器

    6. 執行容器,docker start 容器名稱/容器ID

    7. 檢視執行中的容器

    8. 訪問5601埠,出現下面介面表示kibana啟動成功

    9. 訪問9200埠,如下圖,則表示elasticsearch啟動成功

    10. 模擬一條日誌。

      進入elk docker容器內部

      輸入:/opt/logstash/bin/logstash --path.data /tmp/logstash/data \

            -e'input { stdin { } } output { elasticsearch { hosts => ["localhost"] } }'

       

      注意:如果看到這樣的報錯資訊 Logstash could not be started because there is already another instance using the configured data directory.  If you wish to run multiple instances, you must change the "path.data" setting. 請執行命令:service logstash stop 然後再執行就上面命令就可以了。

    

 輸入一條資訊

      

  1. 重新整理5601埠,建立logstash-*攔截

  2. 在Discover中可以看到輸入的資訊

    最後按Ctrl+C停止logstash執行。

   

    Elk dokcer安裝到此結束。

  1. Filebeat安裝
    1. 下載filebeat,地址:

      https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-5.6.3-linux-x86_64.tar.gz

    2. 解壓

      解壓完成後檢視

    3. 重新命名資料夾

    4. 修改filebeat.yml配置引數

      yml.log是我自己的模擬的日誌記錄,只讀取一個log檔案。假如想讀取某目錄下所有的log檔案則這樣配置:

      paths:

  • /var/log/*.log,表示讀取該目錄下所有的log檔案。

    注意:目前按照Go語言的glob函式處理。沒有對配置目錄做遞迴處理,比如配置的如果是:/var/log/* /*.log,則只會去/var/log目錄的所有子目錄中尋找以".log"結尾的檔案,而不會尋找/var/log目錄下以".log"結尾的檔案。

                             

   註釋掉elasticsearch,開啟logstash,localhost:docker在本機執行,且在前面已設定docker的5044埠對應本機的5044埠。假如elk docker在另外的IP上執行,則填寫那臺的IP地址,最好不要直接寫IP。可在hosts檔案進行IP對映。

  1. 這裡有個特別值得注意的地方。

    先進入已執行的elk docker

    進入/etc/logstash/conf.d目錄下,有四個配置檔案

    02-beats-input.conf:對5044埠進行證書驗證規則,前面filebeat.yml沒有配置證書,所以這裡刪除ssl驗證規則。

    10-syslog.conf:對資訊帶syslog字元的日誌進行了過濾。

    11-nginx.conf: 對資訊帶nginx-access字元的日誌進行了過濾。

    這兩個配置檔案即表示logstash收集帶syslog字元輸出某種日誌格式,滿足nginx-access字元資訊的日誌另一種輸出日誌格式。

  2. 測試

    退到centos系統,進入/opt/filebeat/目錄下

    記得先開放5044埠才執行:./filebeat -e -c filebeat.yml -d "Publish"

    瀏覽器開啟5601埠,記得新建立filebeat-*索引,而不是上面logstash索引。

    最後Filebeat啟動:

    nohup ./filebeat -e -c filebeat.yml >/dev/null 2>&1 &filebeat會轉入後臺執行

  1. Filebeat+Logstash自定義日誌欄位

Logstash配置

進入docker容器,刪除原來的logstash配置檔案

新建自己的配置檔案

filter:對傳送過來的每一條資訊進行攔截。

grok:匹配日誌規則。

mutate:remove_field移除日誌中不需要的欄位

patterns_dir: 正則表示式存放資料夾路徑

%{ MYTIME:create_time}:MYTIME在Patterns_dir資料夾下匹配的正則表示式,create_time:在kibana上顯示為create_time

(?<cause_by>(.*|\n\s+.*|\n\s+|\n.*)+):在這配置檔案上自定義的欄位,(.*|\n\s+.*|\n\s+|\n.*)+匹配的正則表示式,cause_by:匹配的日誌在kibana顯示為cause_by欄位。

input {

beats {

port => 5044

}

}

filter {

grok {

match => {

patterns_dir => ["/opt/logstash/patterns"]

"message" => "%{MYPID:pid}\s+%{MYTIME:create_time}\s+%{MYCLASS:class}\s+%{MYLEVEL:level}\s+(?<cause_by>(.*|\n\s+.*|\n\s+|\n.*)+)"

}

match => {

patterns_dir => ["/opt/logstash/patterns"]

"message" => "%{MYTIME:create_time}\s+%{MYCLASS:class}\s+%{MYLEVEL:level}\s+(?<cause_by>(.*|\n\s+.*|\n\s+|\n.*)+)"

}

}

mutate {

remove_field => ["tags", "beat"]

remove_field => ["tags", "host"]

remove_field => ["tags", "offset"]

remove_field => ["tags", "message"]

remove_field => ["tags", "@version"]

}

}

output {

elasticsearch {

hosts => ["localhost"]

}

}

去定義我們自己的grok規則:

上面patterns_dir的路徑/opt/logstash/patterns/(可自定義路徑)

MYPID:匹配588681026位置

MYTIME: 匹配2017-Oct-24 12:00:00.020位置

MYCLASS:匹配[schedulerFactoryBean_Worker-1]位置

MYLEVEL: 匹配ERROR位置

最後,退出容器,重啟容器。

FileBeat配置

#=========================== Filebeat prospectors =============================

filebeat.prospectors:

- input_type: log

#日誌路徑

paths:

- /var/log/admin-error.log

#可用來區分不同的專案日誌,在logstash對應type

document_type: huntingdog-admin

#排除包含DEBUG欄位資訊的日誌

exclude_lines: ["DEBUG"]

#包含輸入中符合正則表示式列表的那些行(預設包含所有行),include_lines執行完畢之後會執行exclude_lines

include_lines: ["ERR", "WARN"]

#匹配日誌直到下一行滿足作為一條日誌(前面,後面由下面match欄位決定)

multiline.pattern: ^\d+\s+[\d]{4}\-[A-Za-z]+\-[\d]{2}\s+[\d]{2}:[\d]{2}:[\d]{2}.[\d]+\s+\[

#是否轉換

multiline.negate: true

#pattern匹配後面的日誌作為一條日誌(before匹配前面的為一條日誌)

multiline.match: after

# 如果一個檔案在某個時間段內沒有發生過更新,則關閉監控的檔案handle。預設1h

#close_older: 1h

# 這個得意思就是會在es中多新增一個欄位,格式為 "filelds":{"level":"debug"}

#fields:

# level: debug

# review: 1

# 如果設定為0s,則Filebeat會盡可能快地感知更新(佔用的CPU會變高)。預設是10s

#scan_frequency: 10s

# Filebeat檢測到某個檔案到了EOF(檔案結尾)之後,每次等待多久再去檢測檔案是否有更新,預設為1s

backoff: 10s

- input_type: log

paths:

- /var/log/ygzj.log

document_type: ygzj

exclude_lines: ["DEBUG"]

include_lines: ["ERR", "WARN"]

multiline.pattern: ^[\d]{4}\-[A-Za-z]+\-[\d]{2}\s+[\d]{2}:[\d]{2}:[\d]{2}.[\d]+\s+\[

multiline.negate: true

multiline.match: after

backoff: 10s

#-------------------------- Elasticsearch output ------------------------------

#output.elasticsearch:

#hosts: ["192.168.0.187:9200"]

#protocol: "https"

#username: "elastic"

#password: "changeme"

#----------------------------- Logstash output --------------------------------

output.logstash:

hosts: ["localhost:5044"]

#ssl.certificate_authorities: ["/etc/pki/tls/certs/logstash-beats.crt"]

#ssl.certificate: "/etc/pki/tls/certs/logstash-beats.crt"

#ssl.key: "/etc/pki/tls/private/logstash-beats.key"

#================================ Logging =====================================

#logging.level: debug

# "publish", "service".

#logging.selectors: ["*"]

最後,kibana攔截的方式需修改成:logstash-*