logstash配置文件包含三个配置部分:

分别为:input{}、filter{}、output{}。{} 定义区域,区域内可以定义一个或多个插件,通过插件对数据进行收集,加工处理,输出。

在{}配置中可以使用表达式完成要采集数据的逻辑,表达式中的数据类型和运算符如下:

1、数据类型:

布尔值类型: ssl_enable => true
  字节类型: bytes => "1MiB"
  字符串类型: name => "xkops"
  数值类型: port => 22
  数组: match => ["datetime","UNIX"]
  哈希: options => {key1 => "value1",key2 => "value2"}
  编码解码: codec => "json"
  路径: file_path => "/tmp/filename"
  注释: #

2、条件判断:

等于: ==
  不等于: !=
  小于: <
  大于: >
  小于等于: <=
  大于等于: >=
  匹配正则: =~
  不匹配正则: !~
  包含: in
  不包含: not in 
  与: and
  或: or
  非与: nand
  非或: xor
  复合表达式: ()
  取反符合: !()

3、配置语法讲解

logstash使用{ }来定义配置区域,区域内又可以包含其插件的区域配置。

# 最基本的配置文件定义,必须包含input 和 output。

input{
stdin{ }
} output{
stdout{
codec=>rubydebug
}
} # 如果需要对数据进操作,则需要加上filter段 input{
stdin{ }
} filter{
# 里面可以包含各种数据处理的插件,如文本格式处理 grok、键值定义 kv、字段添加、
# geoip 获取地理位置信息等等... } output{
stdout{
codec=>rubydebug
}
} # 可以定义多个输入源与多个输出位置 input{
stdin{ } file{
path => ["/var/log/message"]
type => "system"
start_position => "beginning"
}
} output{
stdout{
codec=>rubydebug
} file {
path => "/var/datalog/mysystem.log.gz"
gzip => true
} }

启动方式

# 通过手动指定配置文件启动

/bin/logstash -f /etc/logstash/conf.d/nginx_logstash.conf

# 以daemon方式运行,则在指令后面加一个 & 符号

/bin/logstash -f /etc/logstash/conf.d/nginx_logstash.conf &

# 如果是通过rpm包安装的logstash则可以使用自带的脚本启动

/etc/init.d/logstash start 

# 通过这种方式启动,logstash会自动加载 /etc/logstash/conf.d/ 下的配置文件

3、示例

在每个部分中,也可以指定多个访问方式,例如我想要指定两个日志来源文件,则可以这样写:

input {
file { path =>"/var/log/messages" type =>"syslog"}
file { path =>"/var/log/apache/access.log" type =>"apache"}
}

  类似的,如果在filter中添加了多种处理规则,则按照它的顺序一一处理,但是有一些插件并不是线程安全的。

  比如在filter中指定了两个一样的的插件,这两个任务并不能保证准确的按顺序执行,因此官方也推荐避免在filter中重复使用插件。

  说完这些,简单的创建一个配置文件的小例子看看:

input {
file {
     #指定监听的文件路径,注意必须是绝对路径
path => "E:/software/logstash-1.5.4/logstash-1.5.4/data/test.log"
start_position => beginning
}
}
filter { }
output {
stdout {}
}

  日志大致如下:

1 hello,this is first line in test.log!
2 hello,my name is xingoo!
3 goodbye.this is last line in test.log!
4

  注意最后有一个空行。

  执行命令得到如下信息:

  细心的会发现,这个日志输出与上面的logstash -e "" 并不相同,这是因为上面的命令默认指定了返回的格式是json形式。

二、logstash常用插件

类型:
  input类:也就是在input区域内定义使用的插件。
  codec类:定于处理数据格式,如plain,json,json_lines等格式。这个可以定义在input、output区域中。
  filter类:也就是在filter区域内定义使用的插件。
  output类:也就是在output区域内定义使用的插件。
各类插件地址:https://github.com/logstash-plugins

----------------------input类插件-------------------------------
input类插件,常用的插件:file、tcp、udp、syslog,beats等。
①.file插件:
file插件字段解释:
codec => #可选项,默认是plain,可设置其他编码方式。
discover_interval => #可选项,logstash多久检查一下path下有新文件,默认15s。
exclude => #可选项,排除path下不想监听的文件。
sincedb_path => #可选项,记录文件以及文件读取信息位置的数据文件。~/.sincedb_xxxx
sincedb_write_interval => #可选项,logstash多久写一次sincedb文件,默认15s.
stat_interval => #可选项,logstash多久检查一次被监听文件的变化,默认1s。
start_position => #可选项,logstash从哪个位置读取文件数据,默认从尾部,值为:end。初次导入,设置为:beginning。
path => #必选项,配置文件路径,可定义多个。
tags => #可选项,在数据处理过程中,由具体的插件来添加或者删除的标记。
type => #可选项,自定义处理时间类型。比如nginxlog。

实例:
[root@node1 conf.d]# cat /tmp/file{1,2}.log
This is test file-plugin in file1.log
This is test file-plugin in file2.log
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat file.conf

input{
file{
start_position => "beginning"
path => ["/tmp/file1.log","/tmp/file2.log"]
type => 'filelog'
}
}
output{
stdout{}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f file.conf -t
Configuration OK
[root@node1 conf.d]# /opt/logstash/bin/logstash -f file.conf 
Settings: Default pipeline workers: 1
Pipeline main started
2016-07-16T02:50:07.410Z node1 This is test file-plugin in file1.log
2016-07-16T02:50:07.428Z node1 This is test file-plugin in file2.log
*提示:能够输出内容则证明file插件正常工作。

②.tcp插件:
tcp插件字段解释:
add_field => #可选项,默认{}。
codec => #可选项,默认plain。
data_timeout => #可选项,默认-1。
host => #可选项,默认0.0.0.0。
mode => #可选项,值为["server","client"]之一,默认为server。
port => #必选,端口。
ssl_cacert => #可选项,定义相关路径。
ssl_cert => #可选项,定义相关路径。
ssl_enable => #可选项,默认为false。
ssl_key => #可选项,定义相关路径。
ssl_key_passphrase => #可选项,默认nil
ssl_verify => #可选项,默认false。
tags => #可选项
type => #可选项

实例:
[root@node1 conf.d]# cat /tmp/tcp.log 
this is test tcp-plugin in tcp.log
send tcplog data
output tcplog data
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat tcp.conf

input{
tcp{
host => "127.0.0.1"
port => 8888
type => "tcplog"
}
}
output{
stdout{}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f tcp.conf
此时开启另个终端,使用nc开启一个tcp端口8888,并将数据推送到8888端口。
[root@node1 conf.d]# nc 127.0.0.1 8888 < /tmp/tcp.log 
*提示:前一个终端如果出现数据,则证明tcp插件工作正常。

③udp插件:
udp插件字段解释:
add_field => #可选项,默认{}。
host => #可选项,默认0.0.0.0。
queue_size => #默认2000
tags => #可选项
type => #可选项
workers => #默认为2

实例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat udp.conf

input{
udp{
host => "127.0.0.1"
port => 9999
}
}
output{
stdout{}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f udp.conf
打开另一终端执行如下脚本,并输入内容:"hello,udplog"。
[root@node1 conf.d]# cat /tmp/udpclient.py

#/usr/bin/env python
import socket host = "127.0.0.1"
port = 9999
file_input = raw_input("Please input udp log: ")
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto(file_input,(host,port))

*提示:如果前一个终端收到日志,则证明udp插件工作正常。

④.syslog插件:
实例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat syslog.conf

input{
syslog{
host => "127.0.0.1"
port => 518
type => "syslog"
}
}
output{
stdout{}
}

[root@node1 conf.d]# echo '*.* @@127.0.0.1:518' >> /etc/rsyslog.conf
[root@node1 conf.d]# /etc/init.d/rsyslog restart
关闭系统日志记录器: [确定]
启动系统日志记录器: [确定]
[root@node1 conf.d]# /opt/logstash/bin/logstash -f syslog.conf 
使用logger命令向系统写入日志:
[root@node1 conf.d]# logger

*提示:此处随便输入内容,查看前一个终端是否会有内容输出,如果输出则证明syslog插件工作正常。

--------------------------codec类插件------------------------------------
codec类插件,常用的插件:plain、json、json_lines、rubydebug、multiline等。
①.plain插件:
实例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat plain.conf

input{
stdin{
codec => "plain"
}
}
output{
stdout{}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f plain.conf 
输入信息查看输出。

②.json插件:
实例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat json.conf

input{
stdin{}
}
output{
stdout{
codec => "json"
}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f json.conf 
输入信息查看输出。

③.json_lines插件:(json文本过长时使用)
实例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat jsonlines.conf

input{
tcp{
host => "127.0.0.1"
port => 8888
codec => "json_lines"
}
}
output{
stdout{}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f jsonlines.conf 
启动一个新的终端,执行如下命令。
[root@node1 conf.d]# cat /tmp/jsonlines.txt 
You run a price alerting platform which allows price-savvy customers to specify a rule like "I am interested in buying a specific electronic gadget and I want to be notified if the price of gadget falls below $X from any vendor within the next month". In this case you can scrape vendor prices, push them into Elasticsearch and use its reverse-search (Percolator) capability to match price movements against customer queries and eventually push the alerts out to the customer once matches are found.
[root@node1 conf.d]# nc 127.0.0.1 8888 < /tmp/jsonlines.txt 
*提示:观察前一个终端的输出,如果正常输出,则json_lines插件工作正常。

④.rubedebug插件:
实例:
[root@node1 conf.d]# cat rubydebug.conf

input{
stdin{
codec => "json"
}
}
output{
stdout{
codec => "rubydebug"
}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f rubydebug.conf
输入json串查看输出效果。
json串:{"name":"xkops","age":"25"}

⑤.multiline插件:(处理错误日志)
multiline插件字段:
charset => #字符编码,可选
max_bytes => #bytes类型,设置最大的字节数,可选
max_lines => #number类型,设置最大的行数,默认是500行,可选
multiline_tag => #string类型,设置一个事件标签,默认是"multiline" ,可选
pattern => #string 类型,设置匹配的正则表达式 ,必选 
patterns_dir => #array类型,可以设置多个正则表达式,可选
negate => #boolean类型,设置正向匹配还是反向匹配,默认是false,可选
what => #设置未匹配的内容是向前合并还是向后合并,previous, next 两个值选择,必选

错误日志:
[16-07-2016 22:54:01] PHP warning: unknown exception in /xxx/test/index.php:99
111111111111111111
222222222222222222
[16-07-2016 23:19:43] PHP warning: unknown exception in /xxx/test/index.php:93
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat codecmultilines.conf

input{
stdin{
codec => multiline{
pattern => "^\["
negate => true
what => "previous"
}
}
}
output{
stdout{}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f codecmultilines.conf 
*提示:输入上述错误日志查看输出。

---------------------filter类插件---------------------------------------------
filter插件,常用的filter插件:json、grok等。
①.json插件:
add_field => #hash(可选项),默认{}
add_tag => #array(可选项),默认[]
remove_field => #array(可选项),默认[]
remove_tag => #array(可选项),默认[]
source => #string(必选项)
target => #string(可选项)

实例:
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat filterjson.conf

input{
stdin{}
}
filter{
json{
source => "message"
#target => "content"
}
}
output{
stdout{
codec => "rubydebug"
}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f filterjson.conf 
输入两个串,查看输出。
{"name":"xkops","age":"25"}
name xkops

②.grok插件:解析各种非结构化的日志数据插件。
grok有丰富的patterns,查看方式:
cat /opt/logstash/vendor/bundle/jruby/1.9/gems/logstash-patterns-core-2.0.5/patterns/grok-patterns
https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns
实例:
输入的元数据内容:
20.3.1.3 GET /xkops/index.html 8838 1.323
[root@node1 conf.d]# pwd
/etc/logstash/conf.d
[root@node1 conf.d]# cat filtergrok.conf

input{
stdin{}
}
filter{
grok{
match => ["message","%{IP:ip} %{WORD:method} %{URIPATH:uri} %{NUMBER:bytes} %{NUMBER:duration}"]
}
}
output{
stdout{
codec => "rubydebug"
}
}

[root@node1 conf.d]# /opt/logstash/bin/logstash -f filtergrok.conf
*提示:输入上述元数据查看输出。
*提示:grok在线工具使用:https://grokdebug.herokuapp.com/

③.kv插件: 解析处理key-value键值对数据

--------------------output类插件-----------------------------
output插件:
①.file插件
②.tcp/udp插件
③.redis/kfaka
④.elasticsearch

附录:
redis配置:

input{
redis{
host => 'redis-server'
port => '6379'
data_type => 'list'
key => 'lb'
codec => 'json'
}
}

 

最新文章

  1. 使用canvas绘制一个时钟
  2. 如何在ASP.NET MVC和EF中使用AngularJS
  3. LINUX下NFS系统的安装配置
  4. java 28 - 4 JDK5的新特性 之 枚举的概述和自定义枚举类
  5. BZOJ 1969 树链剖分+Tarjan缩点
  6. 【solr】java整合solr5.0之solrj的使用
  7. oracle视图如何使用
  8. Linux Tcpdump 使用举例 ---持续更新
  9. .NET环境配置(二)
  10. ASP读取RSS
  11. Eclipse下Tomcat常用设置
  12. hdu 5071 Chat(模拟)
  13. reincarnation server
  14. 类A是公共的,应在名为A.java的文件中声明错误
  15. gradle 入门介绍
  16. 产品打包工具的制作,ant,编译源码,打jar包,打tag,打war包,备份release版本等
  17. typescript和coffeescript简介
  18. 《全栈性能Jmeter》-5JMeter负载与监听
  19. javascript中的分支判断与循环
  20. WinRAR打包时不包含文件夹本身,只打包文件夹里的文件和目录

热门文章

  1. 编译EXE文件的时候pcap编译不进去。 pyinstaller pcap pypcap 报错
  2. pywin32 的安装
  3. linux上定时运行scrapy
  4. [编程题] N阶楼梯上楼问题
  5. 利用Fierce2查询子域名
  6. 各种CTF的WP
  7. LeetCode-Microsoft-Remove K Digits
  8. 实习第二天-java参数传递-精华在文章最后2句话
  9. 类名.fromObject(obj)静态方法
  10. .gitignore忽略git版本库中的文件(夹)