简介:Logstash是一款轻量级的日志搜集处理框架,它支持动态的从各种数据源搜集数据,并对数据进行过滤、分析、丰富、统一格式等操作,并按照开发者制定的规范传输到指定的位置。
下载、安装
小贴士:Logstash 依赖 JDK1.8 ,因此在安装之前请确保机器已经安装和配置好 JDK1.8。
这款工具是开箱即用的软件,下载地址戳这里,下载自己对应的系统版本即可。
下载后直接解压,就可以了。
基本概念
Logstash 通过管道进行运作,管道有两个必需的元素,输入和输出,还有可选的元素,过滤器、编解码器。架构图如下:
- 原始数据在input被转换为Event,在output event被转换为目标格式数据。
- 在配置文件中可以对Event中的属性进行增删改查。
小贴士:Batcher负责批量的从queue中取数据
下面通过导图,对logstash的组成结构进行全局了解。
- pipeline:一条数据处理流程的逻辑抽象,类似于一条管道,数据从一端流入,经过处理后,从另一端流出;一个pipeline包括输入、过滤、输出3个部分,其中输入和输出部分是必选组件,过滤是可选组件;
- instance:一个logstash实例,可以包含多条数据处理流程,即多个pipeline;
inputs:数据输入组件,用于对接各种数据源,接入数据,支持解码器,允许对数据进行编码解码操作;必选组件; - filters和codecs:负责解析数据,对输入数据进行加工处理过滤、分析、丰富、统一格式等操作。
- outputs:数据输出组件,用于对接下游组件,发送处理后的数据,支持解码器,允许对数据进行编码解码操作;必选组件;
- event:pipeline中的数据都是基于事件的,一个event可以看作是数据流中的一条数据或者一条消息;
简单使用示例
通过命令行,进入到logstash/bin目录,执行下面的命令:
bin/logstash -e 'input{stdin{}}output{stdout{codec=>rubydebug}}'
然后你会发现终端在等待你的输入。没问题,敲入 Hello World,回车:
{
"message" => "Hello World",
"@version" => "1",
"@timestamp" => "2017-08-07T10:30:59.937Z",
"host" => "raochenlindeMacBook-Air.local",
}
解释:数据在线程之间以"事件"的形式流传。不叫行,因为 logstash 可以处理多行事件。
Logstash 会给事件添加一些额外信息。最重要的就是 @timestamp,用来标记事件的发生时间。因为这个字段涉及到 Logstash 的内部流转。
你可以随意给事件添加字段或者从事件里删除字段。
- host 标记事件发生在哪里。
- type 标记事件的唯一类型。
- tags 标记事件的某方面属性。这是一个数组,一个事件可以有多个标签。
小贴士:每个 logstash 过滤插件,都会有四个方法叫 add_tag, remove_tag, add_field 和 remove_field。它们在插件过滤匹配成功时生效。
常用命令行参数
logstash 后可以加:
-f:指定配置文件或目录,根据配置文件配置logstash。
-e:字符串,配置,默认“”stdin输入、stdout输出(在控制台输入、输出),可通过命令行接受设置。
-l:输出地址,默认控制台输出。
-t:测试 Logstash 读取到的配置文件语法是否能正常解析。
配置文件
在生产环境中,Logstash 的管道要复杂很多,可能需要配置多个输入、过滤器和输出插件。
因此,需要一个配置文件管理输入、过滤器和输出相关的配置。配置文件内容格式如下:
# 输入
input {
...
}
# 过滤器
filter {
...
}
# 输出
output {
...
}
这篇博客,之前应该看过,也挺不错的 ,可以借鉴下
结合着大佬的博客,总结了一个配置文件出来
input {
# 从文件读取日志信息
file {
path => "/var/log/httpd/access_log" # 要导入的文件的位置,可以使用*,例如/var/log/nginx/*.log
Excude =>”*.gz” # 要排除的文件
start_position => "beginning" # 从文件开始的位置开始读,默认是end
ignore_older => 0 # 多久之内没修改过的文件不读取,0为无限制,单位为秒
sincedb_path => "/dev/null" # 记录文件上次读取位置;输出到null表示每次都从文件首行开始解析
add_field=>{"test"="test"} # 增加一个字段
type => "apache-log" # type字段,可表明导入的日志类型
# 使用 multiline 插件,传说中的多行合并
codec => multiline {
# 通过正则表达式匹配,具体配置根据自身实际情况而定
pattern => "^\d"
negate => true
what => "previous"
}
}
file {
type => "tms_inbound.log"
path => "/JavaWeb/tms2.wltest.com/logs/tms_inbound.es.*.log"
codec => json {
charset => "UTF-8"
}
}
#可配置多种处理规则,他是有顺序,所以通用的配置写下面
filter {
#首先要说明的是,所有文本数据都是在Logstash的message字段中的,我们要在过滤器里操作的数据就是message。
#只说一个match属性,他的作用是从message 字段中把时间给抠出来,并且赋值给另个一个字段logdate。
#第二点需要明白的是grok插件是一个十分耗费资源的插件。
#第三点需要明白的是,grok有超级多的预装正则表达式,这里是没办法完全搞定的,也许你可以从这个大神的文章中找到你需要的表达式
#http://blog.csdn.net/liukuan73/article/details/52318243
#但是,我还是不建议使用它,因为他完全可以用别的插件代替,当然,对于时间这个属性来说,grok是非常便利的。
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
# 输出到 elasticsearch
elasticsearch{
hosts=>["10.0.0.11:9200"] # elasticsearch 地址 端口
action=>"index" # 索引
index=>"indextemplate-logstash" # 索引名称
#document_type=>"%{@type}"
document_id=>"ignore"
template=>"/opt/logstash-conf/es-template.json" # 模板文件的路径
template_name=>"es-template.json" # 在es内部模板的名字
template_overwrite=>true #
protocol => "http" #目前支持三种协议 node、http 和tranaport
}
}
读取多个配置文件
bin/logstash -f /path_to_config_directory 即-f后面加上配置文件目录
语法配置
Logstash 设计了自己的 dsl, 包括有区域,注释,数据类型(布尔值,字符串,数值,数组,哈希),条件判断,字段引用等。
字段引用(field reference)
如果你想在 Logstash 配置中使用字段的值,只需要把字段的名字写在中括号 [] 里就行了,这就叫字段引用。
小贴士:logstash 的数组也支持倒序下标,即 [geoip][location][-1] 可以获取数组最后一个元素的值。
Logstash 还支持变量内插,在字符串里使用字段引用的方法是这样:
"the longitude is %{[geoip][location][0]}"