ELK-使用nxlog+filebeat采集不同类型的日志输出到logstash
ELK-使用nxlog+filebeat采集不同類(lèi)型的日志輸出到logstash
文章目錄
- ELK-使用nxlog+filebeat采集不同類(lèi)型的日志輸出到logstash
- 前言
- 正常的采集配置
- 開(kāi)啟多個(gè)端口監(jiān)聽(tīng)
- 優(yōu)化nxlog(關(guān)鍵字放在開(kāi)頭)
- 再優(yōu)化nxlog(關(guān)鍵字放在結(jié)尾)
- 使用filebeat
前言
網(wǎng)絡(luò)上有很例子給出一示例是采集一種類(lèi)型的日志輸出到logstash,但一個(gè)系統(tǒng)上日志種類(lèi)很多,同一個(gè)采集端能區(qū)分不同日志類(lèi)型嗎?
下面的結(jié)構(gòu)是nxlog做客戶端采集,通過(guò)tcp協(xié)議發(fā)送到logstash,然后logstash傳輸?shù)絜lasticsearch。
前提條件必需:
正常的采集配置
nxlog配置nxlog.conf:
<Input in_donglilog>Module im_fileFile "D:\\jar\\dongli\\logs\\spring-boot.log"SavePos TRUE </Input><Output out_donglitcp>Module om_tcpHost 192.168.1.238Port 514 </Output><Route 1>Path in_donglilog => out_donglitcp </Route>采集D:\jar\dongli\logs\spring-boot.log日志,輸出到192.168.1.238:514上
logstash配置:
input {tcp {port => 514type=>"plm"} } output{if [type] == "plm"{elasticsearch {hosts => ["127.0.0.1:9200"]index => "kelian-%{+YYYY.MM.dd}"}} }通過(guò)tcp協(xié)議監(jiān)控514端口,這時(shí)候logstash工作mode是server(另一個(gè)工作mode是client,用于采集并發(fā)送數(shù)據(jù)),是監(jiān)控514端口數(shù)據(jù)的。
網(wǎng)上例子多數(shù)止步于些,監(jiān)聽(tīng)一個(gè)端口,然后接收數(shù)據(jù),發(fā)送到elasticsearch。
假設(shè),我們不僅僅監(jiān)控dongli的日志D:\jar\dongli\logs\spring-boot.log日志,我還監(jiān)聽(tīng)另一個(gè)系統(tǒng)日志,假設(shè)應(yīng)用為kelian。這2個(gè)日志格式不一樣。nxlog配置相對(duì)簡(jiǎn)單,主要是logstash怎么能區(qū)分接收的不同日志,在elasticsearch創(chuàng)建不同的index。總不能把2個(gè)應(yīng)用日志輸出到同一個(gè)index吧。
開(kāi)啟多個(gè)端口監(jiān)聽(tīng)
這個(gè)方法最簡(jiǎn)單,不同應(yīng)用開(kāi)啟不同端口監(jiān)控
nxlog配置
logstash配置:
input {tcp {port => 514type=>"dongli"}tcp {port => 515type=>"kelian"} } output{if [type] == "dongli"{elasticsearch {hosts => ["127.0.0.1:9200"]index => "dongli-%{+YYYY.MM.dd}"}}if [type] == "kelian"{elasticsearch {hosts => ["127.0.0.1:9200"]index => "kelian-%{+YYYY.MM.dd}"}} }最簡(jiǎn)單,但我不希望這么做,因?yàn)槊吭黾右粋€(gè)應(yīng)用就會(huì)增加一個(gè)端口,而增加一個(gè)端口就要增加這個(gè)端口對(duì)外開(kāi)放,如果是阿里云ECS,還要修改安全組規(guī)則。個(gè)人覺(jué)得麻煩,但是這也不失為一種可選方式
優(yōu)化nxlog(關(guān)鍵字放在開(kāi)頭)
要是能攜帶一個(gè)數(shù)據(jù)區(qū)分發(fā)送日志類(lèi)型就好了。遺憾的是,nxlog并沒(méi)有提供這種選項(xiàng),怎么辦?
修改傳輸?shù)臄?shù)據(jù)。
nxlog每讀一行發(fā)送到logstash,在每行日志前加個(gè)特殊的字符串,然后logstash截取這個(gè)字符串,根據(jù)這個(gè)特殊的字符串創(chuàng)建不同的index。
nxlog配置:
<Input in_donglilog>Module im_fileFile "D:\\jar\\dongli\\logs\\spring-boot.log"SavePos TRUE </Input> <Input in_kelianlog>Module im_fileFile "D:\\jar\\kelaien\\logs\\spring-boot.log"SavePos TRUE </Input><Processor proc_donglilog>Module pm_transformerExec $raw_event = "dongli " + $raw_event; </Processor> <Processor proc_kelianlog>Module pm_transformerExec $raw_event = "kelian " + $raw_event; </Processor><Output out_donglitcp>Module om_tcpHost 192.168.1.238Port 514 </Output><Output out_keliantcp>Module om_tcpHost 192.168.1.238Port 514 </Output><Route 1>Path in_donglilog => proc_donglilog => out_donglitcp </Route><Route 2>Path in_kelianlog => proc_kelianlog => out_keliantcp </Route>通過(guò)Processor模塊,在每行日志行都添加了應(yīng)用名。
logstash配置:
處理的關(guān)鍵在過(guò)濾器代碼中
grok{match=>{#拿到應(yīng)用名"message" => "%{WORD:key} %{WORD}"}}mutate{#將message里應(yīng)用名替換為空gsub=>["message","%{key}",""]}在output里就可以使用字段引用功能做判斷了
if [type] == "plm"{if [key] == "dongli" { }if [key] == "kelian" { }}缺點(diǎn)
有個(gè)缺點(diǎn),只對(duì)單行日志有作用,如果有多行合并為一行的異常日志就不適合,因?yàn)閷㈥P(guān)鍵字添加到行頭,破壞了數(shù)據(jù)完。
當(dāng)使用multiline插件過(guò)濾輸入數(shù)據(jù)時(shí),行頭沒(méi)辦法區(qū)分,當(dāng)使用multiline插件,合并多行時(shí)會(huì)出問(wèn)題。
再優(yōu)化nxlog(關(guān)鍵字放在結(jié)尾)
如果把關(guān)鍵字放在每行的結(jié)尾呢
nxlog配置:
注意代碼
<Processor proc_donglilog>Module pm_transformerExec $raw_event = $raw_event + "(dongli)"; </Processor> <Processor proc_kelianlog>Module pm_transformerExec $raw_event = $raw_event + "(kelian)"; </Processor>關(guān)鍵放在行尾并用小括號(hào)括起來(lái)。
logstash配置:
主要的處理在過(guò)濾器里
if [type] == "plm" {grok{match=>{"message" => "(?<ckey>[(]\w+[)\\r])"}}mutate{gsub=>["message","[(]%{ckey}[)]",""]}}拿到關(guān)鍵字,然后把message字段里關(guān)鍵刪除。
這種方式也不失為一種解決方案,但不絕不是優(yōu)雅的方案
使用filebeat
它天生可多攜帶關(guān)鍵字,而且在windows運(yùn)行也很穩(wěn)定,所以我推薦使用filebeat替代nxlog。
filebeat.yml配置:
logstash配置
input{beats {port => 515type=>"beatss"} }output{if [fields][appname] == "dongli"{elasticsearch {hosts => ["127.0.0.1:9200"]index => "dongli-%{+YYYY.MM.dd}"}}if [fields][appname] == "kelaien"{elasticsearch {hosts => ["127.0.0.1:9200"]index => "kelaien-%{+YYYY.MM.dd}"}} }上面對(duì)應(yīng)的是單行日志,如果是多行日志,它的配置放在filebeats而不是logstash
filebeat.yml配置:
多行的關(guān)鍵代碼是
multiline:pattern: '^\d{4}-\d{1,2}-\d{1,2}'negate: truematch: after總結(jié)
以上是生活随笔為你收集整理的ELK-使用nxlog+filebeat采集不同类型的日志输出到logstash的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 平板计算机触摸屏失灵修复小技巧,触摸屏失
- 下一篇: [生产力]在线免费的EDA工具,可编辑A