ELK - logstash 多個配置文件及模板的使用


目錄
  - 前言
  - 多配置文件的實現方式
  - 為logstash 增加模板
  - 將 logstash 作為服務啟動


1. 前言

在使用 logstash 編寫多個配置文件,寫入到 elasticsearch 時,會出現數據寫入混亂的問題,舉例來說:

多個配置文件中規則如下:

A -> es-logstash-A
B -> es-logstash-B

A 寫入到 es-logstash-A 索引中
B 寫入到 es-logstash-B 索引中

 

然而當 logstash 服務運行起來的時候並不是這樣的,可能出現如下想象:

A-> es-logstash-A
B-> es-logstash-A

 

究其原因,是因為 logstash 運行起來的時候,會將所有的配置文件合並執行。因此,每個 input 的數據都必須有一個唯一的標識,在 filter 和 output 時,通過這個唯一標識來實現過濾或者存儲到不同的索引。

2. 多配置文件的實現方式

如上所說,寫入需要唯一標識,在logstash 中唯一標識推薦使用 type 或 tags 字段,然后通過 if 條件判斷來實現。

首先來看下面一個示例:

在 /etc/logstash/conf.d 目錄下有這樣兩個配置文件 [1.conf   a.conf ]

[root@192.168.118.14 /etc/logstash/conf.d]#ls
1.conf  a.conf


1.conf
input {
    file {
        path => "/data/log/1.log"    
        start_position => "beginning"
        sincedb_path => "/tmp/1_progress"
    }
}

output {
    elasticsearch {
        hosts => ["192.168.118.14"]    
        index => "1-log-%{+YYYY.MM.dd}"
    }
}


a.conf
input {
    file {
        path => "/data/log/a.log"    
        start_position => "beginning"
        sincedb_path => "/tmp/a_progress"
    }
}

output {
    elasticsearch {
        hosts => ["192.168.118.14"]    
        index => "a-log-%{+YYYY.MM.dd}"
    }
}

/data/log/a.log
[root@192.168.118.14 ~]#cat /data/log/a.log 
a

/data/log/1.log
[root@192.168.118.14 ~]#cat /data/log/1.log 
1

 

這兩個配置很簡單,規則:

  • 1.conf  讀取 /data/log/1.log 寫入到 1-log-[date] 索引
  • a.conf 讀取 /data/log/a.log 寫入到 a-log-[date] 索引

兩個日志文件,都只有 1 行日志記錄。

 

正確的結果是 生成兩個索引,每個索引里只有一條記錄。

 

接下來啟動服務查看,多配置文件 命令啟動方式如下:

正確的啟動方式:

[root@192.168.118.14 ~]#logstash -f /etc/logstash/conf.d/

 

錯誤的啟動方式:

[root@192.168.118.14 ~]#logstash -f /etc/logstash/conf.d/*

 

啟動成功后,通過 elasticsearch-head 查看 索引及數據

 

發現每個 索引里卻有 2 條記錄,這不符合正常的邏輯,查看數據發現,每個索引里都是 1.log 和 a.log  的數據總和。

這也證明了 logstash 在寫入數據的時候,是將所有的配置文件合並在一起的,運行起來數據寫入就會混亂。要解決這種混亂就需要通過唯一標識和if 判斷,logstash配置文件調整如下:

1.conf
input {
    file {
        path => "/data/log/1.log"    
        start_position => "beginning"
        sincedb_path => "/tmp/1_progress"
        type => "1-log"
    }
}

output {
    if [type] == "1-log" {
        elasticsearch {
            hosts => ["192.168.118.14"]    
            index => "1-log-%{+YYYY.MM.dd}"
        }
    }
}

a.conf
input {
    file {
        path => "/data/log/a.log"    
        start_position => "beginning"
        sincedb_path => "/tmp/a_progress"
        type => "a-log"
    }
}

output {
    if [type] == "a-log" {
        elasticsearch {
            hosts => ["192.168.118.14"]    
            index => "a-log-%{+YYYY.MM.dd}"
        }
    }
}

上面修改的部分, input 里 增加了 type 字段,定義了唯一標識而在 output 中 通過if判斷唯一標識來做響應的寫入操作。

啟動服務:

[root@192.168.118.14 ~]#logstash -f /etc/logstash/conf.d/

通過 elasticsearch-head 查看:

 

 這次就完全符合預期的標准了。

 

3. 為logstash 增加模板

 

通過 elasticsearch-head 查看到 elasticsearch 默認是通過分片入庫的,而且默認是 5 個主分片,5 個備份分片。 當作為日志存儲時,數據可能沒那么重要,不需要做 elasticsearch 的集群,但是也不想看到這些告警信息,這時候就需要 模板 了。

這里直接提供一個模板樣本,可以直接使用。

{
    "template" : "*", "version" : 60001, 
    "settings" : {
        "index.refresh_interval" : "5s",
        "number_of_shards": 3,
        "number_of_replicas": 0
    }, 
    "mappings" : {
        "_default_" : {
            "dynamic_templates" : [{
                "message_field" : {
                    "path_match" : "message", "match_mapping_type" : "string", "mapping" : {
                        "type" : "text", "norms" : false
                    }
                }
            }, {
                "string_fields" : {
                    "match" : "*", "match_mapping_type" : "string", "mapping" : {
                        "type" : "text", "norms" : false, "fields" : {
                            "keyword" : {
                                "type" : "keyword", "ignore_above" : 256
                            }
                        }
                    }
                }
            }], 
            "properties" : {
                "@timestamp" : {
                    "type" : "date"
                }, "@version" : {
                    "type" : "keyword"
                }, "geoip" : {
                    "dynamic" : true, "properties" : {
                        "ip" : {
                            "type" : "ip"
                        }, "location" : {
                            "type" : "geo_point"
                        }, "latitude" : {
                            "type" : "half_float"
                        }, "longitude" : {
                            "type" : "half_float"
                        }
                    }
                }
            }
        }
    }
}
template.json

 

放置在這里目錄里:

[root@192.168.118.14 ~]#ls /etc/logstash/template/template.json

 

        "number_of_shards": 3,
        "number_of_replicas": 0

這一部分就是定義 主分片 和  復制分片的,可以適當的調整。

 

            "properties" : {
                "@timestamp" : {
                    "type" : "date"
                }, "@version" : {
                    "type" : "keyword"
                }, "geoip" : {
                    "dynamic" : true, "properties" : {
                        "ip" : {
                            "type" : "ip"
                        }, "location" : {
                            "type" : "geo_point"
                        }, "latitude" : {
                            "type" : "half_float"
                        }, "longitude" : {
                            "type" : "half_float"
                        }
                    }
                }
            }

當要使用地圖定位客戶端位置的時候,這一段就必須加上, location 的type 的必須是 geo_point

 

為 logstash 配置文件添加模板配置,如下:

a.conf
input {
    file {
        path => "/data/log/a.log"    
        start_position => "beginning"
        sincedb_path => "/tmp/a_progress"
        type => "a-log"
    }
}

output {
    if [type] == "a-log" {
        elasticsearch {
            hosts => ["192.168.118.14"]    
            index => "a-log-%{+YYYY.MM.dd}"
            template => "/etc/logstash/template/template.json"
            template_overwrite => "true"
        }
    }
}


1.conf
input {
    file {
        path => "/data/log/1.log"    
        start_position => "beginning"
        sincedb_path => "/tmp/1_progress"
        type => "1-log"
    }
}

output {
    if [type] == "1-log" {
        elasticsearch {
            hosts => ["192.168.118.14"]    
            index => "1-log-%{+YYYY.MM.dd}"
            template => "/etc/logstash/template/template.json"
            template_overwrite => "true"
        }
    }
}

 

啟動服務

[root@192.168.118.14 ~]#logstash -f /etc/logstash/conf.d/

通過 elasticsearch-head 查看集群狀態及索引分片:

 

ok,新增的模板已經生效。嘗試為不同的索引添加不同的模板結果出現各種問題,因此創建一個通用的模板。

 

4. 將 logstash 作為服務啟動

在上面的啟動中,都是直接通過命令 logstash 來啟動的,其實可以通過修改 logstash.service 啟動腳本來啟動服務。

修改如下:

[root@192.168.118.14 ~]#vim /etc/systemd/system/logstash.service
…
ExecStart=/usr/share/logstash/bin/logstash "--path.settings" "/etc/logstash" "-f" "/etc/logstash/conf.d"
…

 

啟動服務:

[root@192.168.118.14 ~]#systemctl daemon-reload 
[root@192.168.118.14 ~]#systemctl start logstash

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM