首先,我的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},输出类似:2012年01月05日 22:10:28,921
#%l 输出日志事件的发生位置,包括类目名、发生的线程,以及在代码中的行数
# 如:Testlog.main(TestLog.java:10)
#%F 输出日志消息产生时所在的文件名称
#%L 输出代码中的行号
#%x 输出和当前线程相关联的NDC(嵌套诊断环境),像javaservlets多客户多线程的应用中
#%% 输出一个"%"字符
#
# 可以在%与模式字符之间加上修饰符来控制其最小宽度、最大宽度、和文本的对齐方式。如:
# %5c: 输出category名称,最小宽度是5,category<5,默认的情况下右对齐
# %-5c:输出category名称,最小宽度是5,category<5,"-"号指定左对齐,会有空格
# %.5c:输出category名称,最大宽度是5,category>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}"
}
}
到泪崩,然后要注意的是,我这里是从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}