ELK中logstash下的grok正则表达式总结

首先,我的web项目打印的日志是这样的:

2016-11-30 11:10:44,568 INFO [org.springframework.web.servlet.DispatcherServlet] -

这样的格式是由于我使用的是log4j.properties配置的是

# Pattern to output: date priority [category] - message
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] -<%m>%n

这里怎么配置格式,可以查看:

--------------=====================================-----------------------------------

#Log4J采用类似C语言中的printf函数的打印格式格式化日志信息,打印参数如下: 
#%m 
输出代码中指定的消息 
#%p 
输出优先级,即DEBUG,INFO,WARN,ERROR,FATAL 
#%r 
输出自应用启动到输出该log信息耗费的毫秒数 
#%c 
输出所属的类目,通常就是所在类的全名 
#%t 
输出产生该日志事件的线程名 
#%n 
输出一个回车换行符,Windows平台为“\r\n”,Unix平台为“\n 
#%d 
输出日志时间点的日期或时间,默认格式为ISO8601,也可以在其后指定格式 
#    
如:%d{yyyy年MM月dd日HH:mm:ss,SSS},输出类似:20120105 22:10:28,921 
#%l 
输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数 
#    
如:Testlog.main(TestLog.java:10) 
#%F 
输出日志消息产生时所在的文件名称 
#%L 
输出代码中的行号 
#%x 
输出和当前线程相关联的NDC(嵌套诊断环境),javaservlets多客户多线程的应用中 
#%% 
输出一个"%"字符 
# 
可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如: 
#  %5c: 
输出category名称,最小宽度是5category<5,默认的情况下右对齐 
#  %-5c:
输出category名称,最小宽度是5category<5"-"号指定左对齐,会有空格 
#  %.5c:
输出category名称,最大宽度是5category>5,就会将左边多出的字符截掉,<5不会有空格 
#  %20.30c:category
名称<20补空格,并且右对齐,>30字符,就从左边交远销出的字符截掉

-----------------=======================================------------------------------------

这个是基本的,自己配置好,注意其中的%m才是我们的重点,因为这个m代表的日志是我们自己打印出来的想要

获取的信息,我在上一篇中讲了怎么配,需要的盆友可以看

http://blog.csdn.net/shunzi1046/article/details/53379779

然后这里我再次修改,我的log4j.properties中是这样的:

log4j.appender.stdout.layout.ConversionPattern=%d %p %m%n

并且,我的日志输出类中拼凑的格式是这样的:

logger.info(ip+"/"+username +"/" + method +"/" + requestUrl)

所以最后打印出来的日志是这样的:

2016-12-01 11:18:05,550 INFO 127.0.0.1/zhangsan/GET/http://127.0.0.1:8080/xxxx/xxxx.html?xxxx

这里的信息都是我需要的 ,时间-日志级别-IP-用户名-method-请求url,

然后我就要配置我的logstash/conf/下面的test.conf文件:

input {
    log4j{ 
        type => "log4j-json"
        port => 4567
    } 
}
filter {
    grok{
        match => { "message" => "%{IP:client}/%{USER:auth}/%{WORD:method}/%{NOTSPACE:request}"}
    }                    
}
output {    
    elasticsearch { 
        hosts => ["172.00.00.25:9200"]
        index => "logstash-%{+yyyy.MM.dd}"
    }    
}

这样要注意了,对于grok的匹配,一定要先在http://grokdebug.herokuapp.com/ 上面匹配成功了再拿来用,否则麻烦

到泪崩,然后要注意的是,我这里是从IP先开始匹配的,因为IP是我的%m中的第一项,明白了吧,不是从%d开始匹配的!都是血和泪啊,

不过这里还是说明一下全部parse的grok语句:

%{TIMESTAMP_ISO8601:date}\s%{LOGLEVEL:loglevel}\s%{IP:client}/%{USER:auth}/%{WORD:method}/%{NOTSPACE:request}

-----------------------------

然后依次运行Elasticsearch ,logstash ,kibana,进入http://服务器Ip:5601下面,可以看到我自己拼凑的字段(filed)已经能看到了,但是上面有黄色小三角警告,进入Setting刷新filed就导入进来了,然后就可以正常使用了,我就是摔倒在

grok里啊,现在正在研究unique field的使用,一个人琢磨出来的经验,好痛苦,有盆友需要可以给我留言,知无不言言无不尽!


======================================================================

最后留点参照的grok格式:

2016-05-21T09:53:25.687134+08:00 localhost [audit root/13558 as root/13558 on pts/0/172.16.100.99:50897->10.10.10.6:22]


%{TIMESTAMP_ISO8601:timestamp} %{IPORHOST:login_host} \[\S+ %{USER:login_user}/%{NUMBER:pid} as %{USER:sudouser}/%{NUMBER:sudouser_pid} on %{WORD:tty}/%{NUMBER:tty_id}/%{IPORHOST:host_ip}:%{NUMBER:source_port}-\>%{IPORHOST:local_ip}:%{NUMBER:dest_port}\]

-----------------------------------------------------------------------------

10.2.21.130 - - [08/Apr/2013:11:13:40 +0800] "GET /mediawiki/load.php HTTP/1.1" 304 - "http://som.d.xiaonei.com/mediawiki/index.php" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_3) AppleWebKit/536.28.10 (KHTML, like Gecko) Version/6.0.3 Safari/536.28.10" 


grok{
    match => { "message" => "%{IPORHOST:clientip}

    %{USER:ident}
    %{USER:auth}

     \[%{HTTPDATE:timestamp}\]

    \"(?:%{WORD:verb} %{URIPATHPARAM:request}(?: HTTP/%{NUMBER:httpversion})?|-)\"

     %{NUMBER:response} (?:%{NUMBER:bytes}|-) %{NUMBER:responsetime}

     \"(?:%{URI:referrer}|-)\"  "   }

}

------------------------------------------------------------------------

55.3.244.1  GET   /index.html    15824    0.043(耗时s)


%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}

------------------------------------------------------------------

如下 Grok 常用的表达式解析日志:

%{IPORHOST:clientip} %{NOTSPACE:identd} %{NOTSPACE:auth} \[%{HTTPDATE:timestamp}\] %{WORD:http_method} %{NOTSPACE:request} %{NOTSPACE:request_query|-} %{NUMBER:port} %{NUMBER:statusCode} (%{NOTSPACE:bytes}|-) %{NUMBER:reqTime} %{QS:referer} %{QS:userAgent}








你可能感兴趣的:(ELK中logstash下的grok正则表达式总结)