1. 程式人生 > >Logstash語法常用案例解析(一)

Logstash語法常用案例解析(一)

logstash

摘要

簡述logstash的常用插件,以及簡單的使用案例

一:基礎運行

建議使用supervisor來管理ELK中的各個組件,方便同一管理

安裝 https://www.aolens.cn/?p=809 有講解

提供一個常用的配置:

[program:logstash]
command=/opt/logstash/bin/logstash -f /opt/logstash/conf/index.conf
numprocs=1 ;開幾個進程
dirrectory=/opt/logstash
user=root ;用戶
stdout_logfile=/opt/logstash/logs/logstash.log
stdout_logfile_maxbytes=1MB ;每個日誌大小
stdout_logfile_backups=10 ;保留10個日誌文件
stderr_logfile=/opt/logstash/logs/logstash_err.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10

運行參數:

技術分享

啟動logstash服務(常用supervisor守護進程)

./bin/logstash -f /etc/logstash/conf.d/* -t #檢查配置文件是否ok

./bin/logstash -f conf.d/nginx.conf -w 5 -l /var/log/logstash/

二:配置語法

1,區域:(section)

Logstash用{}來定義區域。可以在區域中定義多個插件區域,插件區域內可以定義鍵值對

eg:

input {             # 輸入數據
       file {
        path=["/var/log/messages","/var/log/*.log"]
          type="system"
          start_position="beginning"
       }
    }
filter{      # 數據過濾處理
    if[type]=="system"{
    grok{
        match=["message",%{COMBINEDAPACHELOG}]
    }
    }
}
output{      # 數據處理輸出
  stdout{
    codec=rubydebug
  }
}

2,數據類型:

string——普通字符串

name => "Hello world"

name => ‘It\‘s a beautiful day‘

array——數組可以是單個或者多個字符串值。

path => [ "/var/log/messages", "/var/log/*.log" ]

path => "/data/mysql/mysql.log"

hash——鍵值對,註意多個鍵值對用空格分隔,而不是逗號。

match => {

"field1" => "value1"

"field2" => "value2"

... }

Codec——用來表示數據編碼。用於input和output段。便於數據的處理。

codec => "json"

number——必須是有效的數值,浮點數或者整數。

port => 33

boolean——布爾值必須是TRUE或者false。

ssl_enable => true

bytes——指定字節單位。默認是byte。

my_bytes => "1113" # 1113 bytes

my_bytes => "10MiB" # 10485760 bytes

my_bytes => "100kib" # 102400 bytes Binary (Ki,Mi,Gi,Ti,Pi,Ei,Zi,Yi) 單位1024

my_bytes => "180 mb" # 180000000 bytes SI (k,M,G,T,P,E,Z,Y) 單位基於1000

password——一個單獨的字符串。

my_password => "password"

path——代表有效的操作系統路徑。

my_path => "/tmp/logstash"

3:字段引用

Logstash配置中要使用字段的值,只需要把字段的名字寫在中括號[]裏。只要是input輸入的值,都可以引用

eg:

[geoip][location][-1]

4,條件判斷

表達式支持的操作符

==(等於),!=(不等),<(小於),>(大於),<=(小等),>=(大等)

=~(匹配正則),!~(不匹配正則)

in(包含),not in(不包含)

and(與),or(或),nand(與非),xor(非或)

()(復合表達式),!()(取反復合表達式結果)


三:常用插件

1,插件管理

./bin/plugin -h

install

uninstall

update

list

eg:

bin/plugin install logstash-output-webhdfs

bin/plugin update logstash-input-tcp

2,常用插件 input,output,filter,codec

2.1 Input插件

stdin:標準輸入,常用於測試,

input {
    stdin {
        type = "string"
        tags = ["add"]
        codec="plain"
    }
}

file:從文件系統中讀取文件,類似linux下的tail -f。 最常用

input {
    file {
        path = ["/var/log/*.log","/var/log/message"]     # logstash只支持文件的絕對路徑
        type = "system"       # type記錄文件類型,定義的變量為全局變量,其他插件都可以調用
        start_position = "beginning"
    }
}

redis:從redis服務器讀取,同時使用redis channel和redis list。

input{
    redis{    
        data_type="list"    
        key="logstash-nginx"    
        host="192.168.1.250"    
        port=6379    
        db=1    
        threads=5
        }} 將源數據寫入redis
output{
    redis{    
        host="192.168.1.250"
        port=6379    
        db=1    
        data_type="list"    
        key="logstash-nginx"
        }}

TCP/UDP: 輸入

#nc127.0.0.18888 /var/log/nginx/access.json       # 可以是json文件直接傳值
 
#echo‘{"name":"liuziping","age":"18"}‘ |nc127.0.0.18888
 
input {
    tcp {
        port = 8888               # 定義tcp監聽端口
        codec="json"               # 規定傳入的數據為json格式,k/v結構方便分析
        mode = "server"
    }
}

技術分享

syslog:監聽在514端口的系統日誌信息,並解析成RFC3164格式。

input {
    syslog {
        port = "514"
    }
}

技術分享

beats: 通過Filebeat發送事件。

2.2:Output 插件

stdout:標準輸出

output {
    stdout {
        codec = rubydebug
        workers = 2
    }
}

file :保存成文件

output {
    file {
        path = "/path/to/%{+yyyy/MM/dd/HH}/%{host}.log.gz"
        message_format = "%{message}"
        gzip = true
    }
}

elasticsearch:保存進elasticsearch ,也是最為重要的

output {
    elasticsearch {
        hosts => ["192.168.0.2:9200"]      # 或者cluster => “ClusterName“
        index => "logstash-%{type}-%{+YYYY.MM.dd}"     #索引名,統一格式,方便kibana導入,會講統一類型的日誌,全部導入 這裏的type=input中的type值
        document_type => "nginx"
        workers => 1                          #啟動一個進程
        flush_size => 20000              # 攢夠20000 條數據一次性發給ES,默認500條
        idle_flush_time => 10          # 如果10s內沒攢夠 20000 條也發一次給ES,默認1s
        template_overwrite => true
    }
}

redis:保存到redis中在input插件中已講解

TCP:輸出TCP

output { 
    tcp {
     host = "192.168.0.2"
      port = 8888
      codec = json_lines
      } 
    }

Email:發送郵件

技術分享

exec:調用命令執行

技術分享

本文出自 “aolens·程超” 博客,請務必保留此出處http://aolens.blog.51cto.com/7021142/1929463

Logstash語法常用案例解析(一)