Logstash(日志收集)

  • ELK Stack
  • Logstash简介
  • 安装Logstash
  • Logstash如何工作
  • Logstash配置语法(一)
  • Logstash配置语法(二)
  • 输入插件
  • 编解码器
  • 过滤器(一)
  • 过滤器(二)
  • 输出插件
  • 条件判断(一)
  • 条件判断(二)


ELK Stack

Elasticsearch(存储+检索+分析),简称ES

Logstash(日志收集)

Kibana(可视化)

logstash日志入库到mysql具体操作 logstash日志采集_大数据

Logstash简介

具备实时数据传输能力的管道

  • 支持多种数据源输入
  • 支持多种过滤器
  • 支持多种数据输出目的地

logstash日志入库到mysql具体操作 logstash日志采集_elasticsearch_02

在ELK中作为日志收集器

logstash日志入库到mysql具体操作 logstash日志采集_ruby_03

安装Logstash

ELK安装

验证安装

$ /opt/logstash/bin/logstash --version

初体验Logstash

  • Hello Logstash!
$ /opt/logstash/bin/logstash -e 'input { stdin { } } output { stdout {} }'

Hello Logstash! #输入
2019-03-15T05:59:18.012Z master Hello Logstash! #输出

Logstash如何工作

Logstash对任何事件处理分为三个阶段

  • 输入(input):必须,如stdin、file、http、exec…
  • 过滤器(filter):可选,如grok、mutate…
  • 输出(output):必须,如stdout、elasticsearch、file…

编解码器

  • 作为输入或输出插件的一部分,分离传输与序列化过程

运行Logstash的两种方式

logstash -e CONFIG_STRING	//使用给定的配置字符串,其格式同配置文件
logstash -f  CONFIG_PATH	//读取配置文件

Logstash配置语法(一)

配置文件结构

# 输入
input {
  ...   
}
# 过滤器
filter {
  ...
}
# 输出
output {
  ...
}
# 验证文件
logstash -f CONFIG_PATH -t

Logstash配置语法(二)

Logstash数据类型

数据类型

说明

示例

array

数组,可以是单个或多个字符串值

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

path => “/data/mysql/mysql.log”

boolean

布尔值

ssl_enable => true

bytes

字节单位

my_bytes => “1113” # 1113 bytes

my_bytes => “180 mb” # 180000000 bytes

codes

表示编码名称

codec => “json”

hash

表示键值对,注意多个键值对用空格分隔,而不是逗号

match => {“field1” => “value1” “field2” => “value2” … }

number

必须是有效的数值,浮点数或者整数

port => 33

string

字符串

name => "Hello world"

name => ‘It’s a beautiful day’

path

一个代表有效的操作系统路径

my_path => “/tmp/logstash”

输入插件

file:从文件中获得事件流

input {
    file {
        path =>"/var/log/message" #path必须
        start_position =>"beginning"
        sincedb_path => "/dev/null"
    }
}
filter {}
output {
    stdout {}
}
input {
    file {
        path =>["/var/log/messages","/var/log/messages-2019*"] #多文件输入
    }
}

编解码器

json

[root#master date]# cat stu.json
{"id":1,"studentNo":"TH-CHEM-2016-C001","interest":"basketball"},{"id":2,"studentNo":"TH-PHY-2016-C001","interest":"talking"},
{"id":3,"studentNo":"BU-POLI-2016-C001","interest":"music"}

rubydebug

"classof" => 2016,
        "path" =>"/data/stu.json",
          "id" =>3,
        "name" =>"Da Vinci",
   "studnetNo" =>"BU-POLI-2016-C001",
    "interest" =>"music",
        "host" =>"master"
  "@timestamp" =>2020-09-20T08:59:07.251Z,
    "@version" =>"1"
input {
    file {
        path =>"/data/stu.json"
        start_position =>"beginning"
        sincedb_path => "/dev/null"
        codec => "json"
    }
}
filter {}
output {
    stdout { codec => "rubydebug"}
}

过滤器(一)

grok:使用正则表达式解析任意文本和结构

100 10.10.0.1 ——>%{NUMBER:duration} %{IP:client}
#NUMBER:内置匹配规则 
#duration 字段名
input{stdin{}}
filter{
        grok{
                match=>{"message"=>"%{NUMBER:duration} %{IP:client}"}
        }
}
output{ stdout{codec=>rubydebug}}

过滤器(二)

grok自定义模式

(?<field_name>the pattern here)
2019-01-01 0:0:0 100 10.10.0.1  ————————>
(?<date>\d*[./-]\d*[./-]\d* \d*:\d*:\d*) %{NUMBER:duration} %{IP:client}
"message" =>"2019-01-01 0:0:0 100 10.10.0.1",
    "@timestamp" =>2019-03-18T01:50:44.409Z,
        "client" =>"10.10.0.1",
      "@version" =>"1",
          "host" =>"master",
          "date" =>"2019-01-01 0:0:0",
      "duration" =>"100"

输出插件

stout
file
elasticsearch

output { #可以同时使用多个输出插件
    stdout{codec=>rubydebug} 
    file {
       path =>"/root/message.out"  #file默认以JSON格式输出每行
    } 
    elasticsearch{
       hosts=>["localhost:9200"]
       index=>"syslog" #默认为索引名称为“logstash-%{+YYYY.MM>DD}”
    }
}

条件判断(一)

控制filter和output处理特定事件

if EXPRESSION {
  ...
} else if EXPRESSION {
  ...
} else {
  ...
}

比较操作

  • 相等:==,!=,<,>,<=,>=
  • 正则:=~(匹配正则),!~(不匹配正则)
  • 包含:in(包含),not in(不包含)
  • 布尔:and(与),or(或),nand(与非),xor(异或)
  • 取反:!(表达式)

条件判断(二)

控制duration<100的行输出至stdout

input{stdin{}}
filter{
        grok{
                match=>{"message"=>"%{NUMBER:duration} %{IP:client}"}
        }
        mutate{convert=>["duration","integer"]} #mutate过滤器可以重命名、删除、替换和修改字段
}
output{ 
       if [duration]<100{ #[字段名]表示字段引用
               stdout{codec=>rubydebug}
       }
}