logstash配置详解
#logstash pipeline 包含两个必须的元素:input和output,和一个可选元素:filter。从input读取事件源,(经过filter解析和处理之后),从output输出到目标存储库(elasticsearch或其他)
###命令
bin/logstash [OPTIONS]
-n #logstash实例的名称,如果不设置默认为当前的主机名(比如我的主机名为sqczm)。
-f #配置文件,我们可以指定一个特定的文件,也可以指定一个特定的目录,如果指定的是特定的目录,则logstash会读取该目录下的所有文本文件,将其在内存中拼接成完整的大配置文件,再去执行。
-e #给定的可直接执行的配置内容,也就是说我们可以不指定-f参数,直接把配置文件中的内容作为字符串放到-e参数后面。
-w #指定工作线程的个数
-p #logstash用来加载插件的目录
-l #日志输出文件,如果不设置,logstash将会把日志发送至标准的output
-t #检查配置的语法是否正确并退出
-r #监视配置文件的变化,并且自动重新加载修改后的配置文件
-config.reload.interval RELOAD_INTERVAL #为了检查配置文件是否改变,而去拉取配置文件的频率
-http.host HTTP_HOST #Web API绑定的主机,默认为“127.0.0.1”
-http.port HTTP_PORT #Web API绑定的端口,默认为9600-9700之间
-log.format FORMAT #logstash写它自身日志的时候使用json还是文本格式,默认是“plain”
-path.settings SETTINGS_DIR #设置包含logstash.yml配置文件的目录,比如log4j日志配置。也可以设置LS_SETTINGS_DIR环境变量
### stdin 标准输入
### file 从文件读取数据
file{
path => ['/var/log/nginx/access.log'] #要输入的文件路径
type => 'nginx_access_log'
start_position => "beginning"
}
# path 可以用/var/log/*.log,/var/log/**/*.log,如果是/var/log则是/var/log/*.log
# type 通用选项. 用于激活过滤器
# start_position 选择logstash开始读取文件的位置,beginning或者end。
#还有一些常用的例如:discover_interval,exclude,sincedb_path,sincedb_write_interval等可以参考官网
### syslog 通过网络将系统日志消息读取为事件
syslog{
port =>"514"
type => "syslog"
}
# port 指定监听端口(同时建立TCP/UDP的514端口的监听)
#从syslogs读取需要实现配置rsyslog:
# cat /etc/rsyslog.conf 加入一行
*.* @172.17.128.200:514 #指定日志输入到这个端口,然后logstash监听这个端口,如果有新日志输入则读取
# service rsyslog restart #重启日志服务
### beats 从Elastic beats接收事件
beats {
port => 5044 #要监听的端口
}
# 还有host等选项
# 从beat读取需要先配置beat端,从beat输出到logstash。
# vim /etc/filebeat/filebeat.yml
..........
output.logstash:
hosts: ["localhost:5044"]
### kafka 将 kafka topic 中的数据读取为事件
kafka{
bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092"
topics => ["access_log"]
group_id => "logstash-file"
codec => "json"
}
kafka{
bootstrap_servers=> "kafka01:9092,kafka02:9092,kafka03:9092"
topics => ["weixin_log","user_log"]
codec => "json"
}
# bootstrap_servers 用于建立群集初始连接的Kafka实例的URL列表。# topics 要订阅的主题列表,kafka topics# group_id 消费者所属组的标识符,默认为logstash。kafka中一个主题的消息将通过相同的方式分发到Logstash的group_id
# codec 通用选项,用于输入数据的编解码器。
#filter plugin 过滤器插件,对事件执行中间处理
### grok 解析文本并构造 。把非结构化日志数据通过正则解析成结构化和可查询化 .
#grok 语法:%{SYNTAX:SEMANTIC} 即 %{正则:自定义字段名}
#多个match匹配规则,如果前面的匹配失败可以使用后面的继续匹配
grok {
match => ["message", "%{IP:clientip} - %{USER:user} \[%{HTTPDATE:raw_datetime}\] \"(?:%{WORD:verb} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion})\" (?:\"%{DATA:body}\" )?(?:\"%{DATA:cookie}\" )?%{NUMBER:response} (?:%{NUMBER:bytes:int}|-) \"%{DATA:referrer}\" \"%{DATA:agent}\" (?:(%{IP:proxy},? ?)*|-|unknown) (?:%{DATA:upstream_addr} |)%{NUMBER:request_time:float} (?:%{NUMBER:upstream_time:float}|-)"]
match => ["message", "%{IP:clientip} - %{USER:user} \[%{HTTPDATE:raw_datetime}\] \"(?:%{WORD:verb} %{URI:request} HTTP/%{NUMBER:httpversion})\" (?:\"%{DATA:body}\" )?(?:\"%{DATA:cookie}\" )?%{NUMBER:response} (?:%{NUMBER:bytes:int}|-) \"%{DATA:referrer}\" \"%{DATA:agent}\" (?:(%{IP:proxy},? ?)*|-|unknown) (?:%{DATA:upstream_addr} |)%{NUMBER:request_time:float} (?:%{NUMBER:upstream_time:float}|-)"]
}
### date 日期解析 解析字段中的日期,然后转存
date{
match => ["raw_datetime","YYYY-MM-dd HH:mm:ss,SSS"]
remove_field =>["raw_datetime"]
}
### mutate 对字段做处理 重命名、删除、替换和修改字段。
#covert 类型转换。类型包括:integer,float,integer_eu,float_eu,string和boolean
filter{
mutate{
covert => ["response","integer","bytes","float"] #数组的类型转换
convert => {"message"=>"integer"}
}
}
#split 使用分隔符把字符串分割成数组
#merge 合并字段 。数组和字符串 ,字符串和字符串
#rename 对字段重命名
#remove_field 移除字段
#join 用分隔符连接数组,如果不是数组则不做处理
#gsub 用正则或者字符串替换字段值。仅对字符串有效
#update 更新字段。如果字段不存在,则不做处理
#replace 更新字段。如果字段不存在,则创建
### geoip 根据来自Maxmind GeoLite2数据库的数据添加有关IP地址的地理位置的信息
### ruby ruby插件可以执行任意Ruby代码
### urldecode 用于解码被编码的字段,可以解决URL中 中文乱码的问题
### kv 通过指定分隔符将字符串分割成key/value
### useragent 添加有关用户代理(如系列,操作系统,版本和设备)的信息
### logstash 比较运算符
等于: ==, !=, <, >, <=, >=
正则: =~, !~
包含关系: in, not in
支持的布尔运算符:and, or, nand, xor
支持的一元运算符: !
### output plugin 输出插件,将事件发送到特定目标。
#stdout标准输出。将事件输出到屏幕上
output{
stdout{
codec => "rubydebug"
}
}
#file将事件写入文件
file {
path => "/data/logstash/%{host}/{application}
codec => line { format => "%{message}"}
}
#kafka 将事件发送到kafka
kafka{
bootstrap_servers => "localhost:9092"
topic_id => "test_topic" #必需的设置。生成消息的主题
}
#elasticseach 在es中存储日志
elasticsearch {
hosts => "localhost:9200"
index => "nginx-access-log-%{+YYYY.MM.dd}"
}
#index 事件写入的索引。可以按照日志来创建索引,以便于删旧数据和按时间来搜索日志