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條數據