如何使用Logstash
雪山飞猪 人气:3
[toc]
# 一、什么是Logstash
Logstash是一个日志收集器,可以理解为一个管道,或者中间件。
功能是从定义的输入源inputs读取信息,经过filters过滤器处理,输入到定义好的outputs输出源。
输入源可以是stdin、日志文件、数据库等,输出源可以是stdout、elesticsearch、HDFS等。
![](https://img2020.cnblogs.com/blog/662544/202003/662544-20200318225735684-152581427.png)
另外,Logstash不只是一个input | filter | output 的数据流,而是一个 input | decode | filter | encode | output 的数据流!有一个codec插件就是用来 decode、encode 事件的,可以解析我们经常用的json格式,非常的强大,接下来给大家演示一下Logstash的使用,一学就会。
# 二、如何安装
最简单方式是直接[下载](https://www.elastic.co/cnhttps://img.qb5200.com/download-x/downloads/logstash)安装,另外也可以通过[docker安装](https://www.elastic.co/guide/en/logstash/currenthttps://img.qb5200.com/download-x/docker.html),
我是直接下载的zip包,解压后如下
![](https://img2020.cnblogs.com/blog/662544/202003/662544-20200318225740925-1116536827.png)
# 三、快速使用
* 直接启动
```
./bin/logstash -e 'input { stdin { } } output { stdout {} }'
```
![](https://img2020.cnblogs.com/blog/662544/202003/662544-20200318225748989-2019347732.png)
-e 代表可以从命令行读取配置,`input { stdin { } } output { stdout {} }'`代表从标准stdin读取,从stdout输出,我们输入
```
chenqionghe
no pain, no gain.
```
显示如下,logstash把时间等一些信息打印出来了
![](https://img2020.cnblogs.com/blog/662544/202003/662544-20200318225826906-986983807.png)
logstash会给事件添加一些额外的信息,最重要的就是 `@timestamp`,用来标记事件的发生时间。此外,大多数时候还可以见到host、type、tags 等属性
* 使用配置启动
例如我们可以将上面的-e定义成一个`chenqionghe.yml`
```yaml
input {
stdin { }
}
output {
stdout { }
}
```
运行
```
./bin/logstash -f chenqionghe.yml
```
更多配置查看 :[configuration](https://www.elastic.co/guide/en/logstash/current/configuration.html)
# 四、Input输入插件
用来指定数据来源,可以是标准输入、文件、TCP数据、Syslog、Redis等
* 读取文件
例如,我要收集nginx的访问文件和错误文件,可以这样写
```
input {
file {
path => ["/Users/chenqionghe/web/log/nginx-access.log","/Users/chenqionghe/web/log/nginx-error.log"]
type => "nginx"
}
}
output {
stdout { codec => rubydebug }
}
```
output指定了一个rubydebug,简单的理解就是一个调试输出的插件,后面会对output进行说明
结果运行,可以看到收集到了nignx日志
![](https://img2020.cnblogs.com/blog/662544/202003/662544-20200318225912684-1618147731.png)
常用配置项
```
* discover_interval
logstash 每隔多久去检查一次被监听的 path 下是否有新文件。默认值是 15 秒。
* exclude
不想被监听的文件可以排除出去,这里跟 path 一样支持 glob 展开。
* sincedb_path
如果你不想用默认的 $HOME/.sincedb(Windows 平台上在 C:\Windows\System32\config\systemprofile\.sincedb),可以通过这个配置定义 sincedb 文件到其他位置。
* sincedb_write_interval
logstash 每隔多久写一次 sincedb 文件,默认是 15 秒。
* stat_interval
logstash 每隔多久检查一次被监听文件状态(是否有更新),默认是 1 秒。
* start_position
logstash 从什么位置开始读取文件数据,默认是结束位置,也就是说 logstash 进程会以类似 tail -F 的形式运行。如果你是要导入原有数据,把这个设定改成 "beginning",logstash 进程就从头开始读取,有点类似 cat,但是读到最后一行不会终止,而是继续变成 tail -F。
```
* 生成测试数据
例如可以使用generator来生成测试输入数据,下面的例子相当于循环了100次
```
input {
generator {
count => 100
message => '{"name":"chenqionghe","hello":["light","weight","baby"]}'
codec => json
}
}
output {
stdout {}
}
```
运行如下
![](https://img2020.cnblogs.com/blog/662544/202003/662544-20200318225918321-1953460792.png)
更多input查看:[input-plugins](https://www.elastic.co/guide/en/logstash/current/input-plugins.html)
# 五、codec编码插件
事实上,我们在上面已经用过 codec 了 ,rubydebug 就是一种 codec,虽然它一般只会用在 stdout 插件中,作为配置测试或者调试的工具。
codec 使得 logstash 可以更好更方便的与其他有自定义数据格式的运维产品共存,比如 graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用数据格式的其他产品等。
* JSON编码
直接输入预定义好的 JSON 数据,以nginx的配置为例,添加如下配置,让nginx输出json
```
log_format json '{"@timestamp":"$time_iso8601",'
'"@version":"1",'
'"host":"$server_addr",'
'"client":"$remote_addr",'
'"size":$body_bytes_sent,'
'"responsetime":$request_time,'
'"domain":"$host",'
'"url":"$uri",'
'"status":"$status"}';
access_log /Users/chenqionghe/web/log/nginx-access.log json;
```
在logstash中配置
```
input {
file {
path => "/Users/chenqionghe/web/log/nginx-access.log"
codec => "json"
}
}
output {
stdout { codec => rubydebug }
}
```
启动请求如下
![](https://img2020.cnblogs.com/blog/662544/202003/662544-20200318225958399-473433344.png)
* 合并多行数据
multiline 插件可以收集多行数据,用于用于其他类似的堆栈式信息
示例如下
```
input {
stdin {
codec => multiline {
pattern => "^\["
negate => true
what => "previous"
}
}
}
```
输入
```
[2020-03-18 14:54:03] hello chenqionghe
[2020-03-18 14:54:03]hello gym
light weight baby
let's do it !
[2020-03-18 14:54:03] finished
```
效果如下
![](https://img2020.cnblogs.com/blog/662544/202003/662544-20200318230003650-1490515023.png)
另外,codec还可以编解码protobuf、fluent、nmap等,可以参考:[codec-plugins](https://www.elastic.co/guide/en/logstash/current/codec-plugins.html)
# 六、filter过滤器插件
logstash 威力强大的最重要的就是因为有丰富的过滤器插件。
* Grok 正则捕获
Grok 是 Logstash 最重要的插件,可以在 grok 里预定义好命名正则表达式,在之后(grok参数或者其他正则表达式里)引用它,示例
```
input {stdin{}}
filter {
grok {
match => {
"message" => "\s+(?
加载全部内容