丰富的过滤器插件是logstash 如此强大的一个很重要的因素。这篇主要来说说我常用的一些插件。
- 过滤屏蔽不需要的日志 :
先来看一下日志吧。下面是tomcat 报的一些日志:
2016-06-17 13:54:24,148 INFO (com.yudao.framework.db.connection.LocalDataSourceFactory:35) - loadJDBCConfig...
2016-06-17 13:54:24,148 WARN (com.yudao.framework.util.SystemConfigUtil:61) - INITIALIZING THE CONFIGMANAGER
2016-06-17 14:17:25,499 ERROR (org.apache.struts2.dispatcher.Dispatcher:38) - Exception occurred during processing request: null
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
...
上面日志文件可以看到有三类: INFO 、WARN 、ERROR 。通常我们只需要解析 ERROR 类型的,也就是说需要过滤掉 INFO 、WARN 类型。
filter{
#如果日志不包含 "ERROR" ,就过滤掉
if [message] !~ "ERROR"{
drop {}
}
}
当然,上面的配置并不能过滤掉全部不需要的日志,比如说下面这种
2016-07-11 14:35:30,985 INFO (com.yudao.test.testAction:1008) - verifyEirUser webservice result:
<USER_VALIDATE_RESULT>
<TEXT_MSG />
<ERROR_MSG>验证不通过ERROR_MSG>
<RESULT>-1RESULT>
...
因为 ERROR_MSG 的存在,就不能过滤。这种情况还得加一层过滤。这个跟日志正则配置有关。这里先不说了。
- Grok 正则捕获
grok 是logstash 最重要的插件。我们可以在 grok 预定义好命名正则表达式,然后(grok 参数或其它正则表达式)引用它。
filter{
grok{
patterns_dir => ["d:/java/logstash-2.3.4/bin/patterns"]
match =>{"message"=> "TEST-LOG"}
}
}
解释:
patterns_dir : 对应的是个绝对路径, d:/java/logstash-2.3.4/bin/patterns 目录下有一个文件,我命名为 j2ee , 里面是一些配置文件,举个栗子 :
JAVALOGMESSAGE (.*)
COMMA_TIME %{NUMBER:year}-%{MONTHNUM:month}-%{MONTHDAY:day} %{HOUR:hour}:%{MINUTE:minute}:%{SECOND:second},%{NUMBER:millisecond}
TEST-LOG %{COMMA_TIME}( | )%{LOGLEVEL:level} %{LINE:class} - %{JAVALOGMESSAGE:logmessage}
match : 作用是日志文件是否能匹配上TEST-LOG 正则格式。
篇幅问题,下一章说配置。
- GeoIP 地址归属类查询: 下面的IP 是参数,不是固定值。
filter {
geoip {
source => "IP"
}
}
- Mutate 数据修改 :
1、类型转换 : 可以设置的转换类型包括 “integer”,”float” 和 “string” 。
filter{
mutate{
convert{"COMMA_TIME" , "float"}
}
}
2、字符串处理
2.1 gsub : 仅对字符串字段有效
filter{
mutate{
# protocol 字段中的 "-" 换为""
gsub => [ "protocol", "-", "" ]
}
}
2.2 split 拆分字段 。
filter {
mutate {
split => ["message", "|"]
}
}
如果message 的内容为: "test|1|as|zx*=123",运行结果为:
"message" => [
[0] "test",
[1] "1",
[2] "as",
[3] "zx*=123"
],
2.3 、join 仅对数组类型字段有效
filter{
mutate {
split => ["message", "|"]
}
mutate {
json=> ["message", ","]
}
}
filter 区间是按 顺序执行的,所以,运行后的结果:
{"message" : "test,1,as,zx*=123"}
2.4 rename 种命名某个字段,如果字段已经,会背覆盖掉。
filter{
mutate{
rename =>["prjName","prjN"]
}
}
2.5 update 更新某个字段的内容,如果字段不存在,不会创建。
2.6 replace 作用与update 类似,只是如果如果字段不存在,会自动创建新的字段。