Logstash下载地址:https://www.elastic.co/downloads/logstash
Logstash官方文档:https://www.elastic.co/guide/en/logstash/current/index.html
1、下载安装
下载下来后,直接解压并进入logstash/bin目录下,执行如下命令:
./logstash -e ""
启动成功后,会有如下的回显:
Successfully started Logstash API endpoint {:port=>9600}
如果没有上面的回显,则会显示相应的错误。
2、Logstash初体验
上面启动成功后,输入hello,则会有如下回显:
{
"@timestamp" => 2017-09-29T12:38:12.529Z,
"@version" => "1",
"host" => "master",
"message" => "hello",
"type" => "stdin"
}
从上面的回显可以看到,Logstash给我们新增了几个字段,分别为@timestamp,@version,host,message,type,并以json的格式回显的,下面对此做下说明。
当我们以-e参数来运行时,Logstash默认会以标准输入的方式来运行,即stdin,这种方式就是以json的方式进行回显的。
3、Logstash的配置文件
Logstash还提供了-f的运行参数,通过指定Logstash的配置文件来运行。
3.1 配置文件格式
input{// 从文件输入
file{
path => ["/opt/applog/*"] // 文件路径
delimiter => "[#" // 文件的结束标志,用于多行的情况
type => "applog" // 说明,用于后面的判断
}
file{
path => ["/opt/log/*"]
type => "syslog"
}
}
output{// 输出到Redis,redis插件后面会做专门的介绍
if [type] == "applog" {// 当type为applog时,将日志输出到redis,并且key为chhliu
redis {
data_type => "list"
key => "chhliu"
host => "192.168.2.109"
port => 6379
}
}
if [type] == "syslog" {// 当type为syslog时,将日志输出到redis,并且key为xyh
redis {
data_type => "list"
key => "xyh"
host => "192.168.2.109"
port => 6379
}
}
stdout{}
}
Lagstash的配置文件由3部分组成,分别为input、filter、output,上面的示例中忽略了filter(非必须)
3.2 使用type个性化输出日志
3.3 多行日志处理
3.3.1 通过delimiter来进行多行的合并
比如下面的日志类型:
[#%&*^]2016-06-28 13:45:17:4517.172.1.4.28!chhliu-PC!:.13984,1#%&*^:INFO>TRR rescheduled Requset RTT :{}<TestData>
<version>1.2.0</version>
<POSIZE>
<channel>hello</channel>
</POSIZE></TestData>
如果上面的日志中,我们不进行控制的话,默认会产生5行日志事件,这显然不是我们想要的。默认情况下,每个事件被假定为一行,并且一行被视为换行符之前的文本。 通常,日志记录将在写入的每一行的末尾添加一个换行符。 如果要将多个日志行加入一个事件,我们可以通过设定日志的结束符为"[#",这样Logstash就会对日志进行多行的合并,直到遇到"[#"才认为一行结束了
3.3.2 通过multline codec处理
关于多行的合并,如果想要更加精细的控制,可以使用codec的multline插件,配置如下:
input{
file{
path => ["/opt/applog/*"]
codec => multiline {// 多行插件
pattern => "^\[\#" // 如果匹配到该正则,则认为是一行的开始
negate => "true" // 如果为true的话,当日志格式不匹配正则的时候,就会被multline过滤器匹配,从而根据what来决定该行日志合并到哪一行
what => "previous" // 如果为previous则合并到上一行,当为next则合并到下一行
}
type => "applog"
}
file{
path => ["/opt/log/*"]
type => "syslog"
}
}
output{
if [type] == "applog" {
redis {
data_type => "list"
key => "chhliu"
host => "192.168.2.109"
port => 6379
}
}
if [type] == "syslog" {
redis {
data_type => "list"
key => "xyh"
host => "192.168.2.109"
port => 6379
}
}
stdout{}
}
但是codec的multline插件有个缺点,就是最后一行日志的收集,可能会有延时。
4、Logstash的原理
在logstash中,包括了三个阶段:
输入input --> 处理filter(不是必须的) --> 输出output
每个阶段都由很多的插件配合工作,比如file、elasticsearch、redis等等。每个阶段也可以指定多种方式,比如输出既可以输出到elasticsearch中,也可以指定到stdout在控制台打印。由于这种插件式的组织方式,使得logstash变得易于扩展和定制。