logstash對埋點日誌進行整理並傳輸到ES---以及在linux下安裝

Logstash埋點日誌整理:

上一篇文章,我們將埋點日誌自動生成,後來我把代碼稍作修改,將服務器和用戶的日誌進行分別輸出到各自的文件中。
然後我們需要使用logstash將從各種地方得到的不同的文件格式進行整理建表,最後輸送到ElasticSearch中進行存儲。
PS:logstash一般與部署tomcat的服務器裝在一起,ElasticSearch由於索引較大,需要專門裝載一個服務器.
logstash處理數據的流程:一般是在本地獲取抓取格式文件,然後過濾器進行整理數據格式,遠程連接輸出到ElasticSearch服務器上。

一:Logstash安裝:

Logstash需要與ElasticSearch保持版本配合,之前的ElasticSearch用的是6.2.2版本,所以我們的Logstash也下載此版本6.2.2,以下是tar包鏈接,分享出來請自行下載。

第一步:
將安裝包放在opt目錄下,並將它解壓

tar -zxvf logstash-6.2.2.tar.gz

第二步:
將解壓後的文件的轉到/opt/soft/logstash622目錄下

mv logstash-6.2.2 /opt/soft/logstash622

第三步:
走到logstash622/bin目錄下,輸入基本命令開啓logstash

# 標準控制檯輸入和輸出 , -e使用給定的字符串
./logstash -e 'input { stdin {} } output { stdout {codec => rubydebug}}'

二:處理埋點日誌信息數據格式

第一步:
將idea的java程序打成胖包,傳給linux,在Linux執行命令運行jar包,生成100300條數據

java -jar +(輸入對應的jar包)

我們需要將命令封裝,寫到配置文件裏,然後我們運行對應的配置文件mylog.conf即可,將命令寫進去。

 ./logstash -f /opt/config/mylog.conf

./logstash -e ‘input { stdin {} } output { stdout {codec => rubydebug}}’// 使用給定的字符串

# 將其寫在配置文件config裏
input {
        file {
                path => "/opt/aa.txt"
                start_position => "beginning" # 從文件開始讀
                sincedb_path => "/dev/null"  # 不管對文件修不修改,每次讀取此文件時,都會讀取一遍,不加的話只有文件修改過後纔會被全量讀取。
        }
}
output {
        stdout {
                codec => rubydebug # 輸入時用code代碼的新格式
        }
}
1.JSON字符串過濾:

對收到的服務器日誌的本身是json,但是存在嵌套json,我們將其做成二維表需要將json扁平化

- mutate過濾器:
  - 能夠幫助你修改指定字段的內容。
# 將嵌套JSON扁平化
input {
        file {
                path => "/opt/aa.txt"
                start_position => "beginning"
                sincedb_path => "/dev/null" 
                codec => json
        }
}
filter {
        mutate {
                add_field => { '@adv' => '%{cm}' } # 先新建一個新的字段,並將friends賦值給它
        }
        json {
                source => "@adv" # 對字段再進行json格式解析
                remove_field => [ "@adv" , "cm" ] # 刪除不必要的字段,也可以不用這語句
        }
}
output {
        stdout {
                codec => rubydebug
        }
}

輸入命令運行:

 ./logstash -f /opt/config/mylog.conf

PS-1: add_field 新建表名

PS-2: source 再次對其解析成json


PS-3: remove_field 對多餘的cm和@adv字段進行刪除

2.正則匹配過濾:

收到的服務器的日誌信息是用 | 分割的字符串。

  • grok語法
    • 正則匹配:
(?<字段名>正則表達式)

在這裏插入圖片描述

# IP和NUMBER是預先定好的正則表達式 
# | 是指分割以|爲符號的字符串
%{IP:字段名}\|%{NUMBER:字段名}

輸入命令運行:

 ./logstash -f /opt/config/mylog.conf

3.多文件和多過濾:

將服務器和用戶的日誌一次性全部處理:

需要加入多個file並對其進行type打標籤和if邏輯判斷完成多過濾

input {
        file {
                path => "/opt/bb.txt"
                start_position => "beginning"
                sincedb_path => "/dev/null"
                type => "action"
                codec => json
        }
        file {
                path => "/opt/aa.txt"
                start_position => "beginning"
                sincedb_path => "/dev/null"
                type => "system"
        }
}
filter {
        if [type] == "system" {
                grok {
                        match => { "message" => "(?<userid>[0-9]+)\|(?<event_name>[a-zA-Z_]+)\|(?<times>[0-9]+)\|(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})" }
                remove_field => [ "message" ]
                }
        } else {
                mutate {
                        add_field => { "nice" => "%{cm}" }
                }
                json {
                        source => "nice"
                        remove_field => [ "nice" , "cm" ]
                }
        }
}
output {
        stdout {
                codec => rubydebug
        }
}

輸入命令運行:

 ./logstash -f /opt/config/mylog.conf

分割後的效果
在這裏插入圖片描述
4.輸出到Elasticsearch

input {
        file {
                path => "/opt/bb.txt"
                start_position => "beginning"
                sincedb_path => "/dev/null"
                type => "action"
                codec => json
        }
        file {
                path => "/opt/aa.txt"
                start_position => "beginning"
                sincedb_path => "/dev/null"
                type => "system"
        }
}
filter {
        if [type] == "system" {
                grok {
                        match => { "message" => "(?<userid>[0-9]+)\|(?<event_name>[a-zA-Z_]+)\|(?<times>[0-9]+)\|(?<clientip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})" }
                remove_field => [ "message" ]
                }
        } else {
                mutate {
                        add_field => { "nice" => "%{cm}" }
                }
                json {
                        source => "nice"
                        remove_field => [ "nice" , "cm" ]
                }
        }
}
output {
        if [type] == "system" {
                elasticsearch {
                        hosts => "http://192.168.56.101:9200" #ip位置
                        index => "systems" # es的索引--庫
                        document_type => "sys" # es的type--表
                }
        } else {
                elasticsearch {
                        hosts => "http://192.168.56.101:9200"
                        index => "customs"
                        document_type => "actions"
                }
        }
}

啓動ElasticSearch和ElasticSearch-head查看效果:
在這裏插入圖片描述
ElasticSearch拿到了100300條數據
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章