配置日志解析规则 -凯发k8国际|首页

j

数据接收

配置日志解析规则

日志易内置了常用的日志解析规则,能够识别、解析常见的日志格式。对于日志易预置规则不支持的日志格式,用户可以在产品页面的“设置”标签下的“日志格式”标签里配置日志格式解析规则,抽取自定义字段。


一些重要概念

event(事件): 一条日志称为一个事件

timestamp(时间戳): 这里的timestamp指日志本身的时间戳而不是进入系统的时间戳

field(字段): 即通过日志易系统抽取出来的字段,由字母数字下划线组成,例如apache中clientip字段

appname:appname用来标识一个日志格式,由字母数字下划线组成,在上传日志的时候需要指定对应的appname

logtype:logtype可以认为是给您的日志格式起的一个别名,同样也由字母数字下划线组成(不能设置为security, appname, hostname, timestamp, tag, raw_message, index)您在左侧字段栏和搜索栏中可以通过logtype.field来引用


日志的解析

日志解析的主要作用是抽取您认为重要的字段,这就需要您熟悉解析规则的配置。例如这样一条日志:

192.168.1.103 - - [01/aug/2014:12:07:39  0800] "get / http/1.1\" 200 3228 "-" "mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0; .net clr 2.0.50727; .net clr 3.0.4506.2152; .net clr 3.5.30729; .net clr 1.1.4322; .net4.0c)"

要抽取出如下字段:

1 "ua" :  "mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0; .net clr 2.0.50727; .net clr 3.0.4506.2152; .net clr 3.5.30729; .net clr 1.1.4322; .net4.0c)" 
 1.1   "os" : "windows xp"
 1.2   "os_v" : "windows xp" 
 1.3   "browser" :  "ie"
 1.4   "browser_v" : "ie 8.0"
 1.5   "device" : "other" 
2 "clientip" :  "192.168.1.103" 
3 "status" : 200
4 "resp_len" : 3228
5 "method" : "get"
6 "version": "1.1" 

需要您在数据接入系统前即配置好解析规则,方便您后续根据日志字段来做相关的处理。 下面介绍一下如何配置您的解析规则。


进入“设置”-“字段提取”,可以看到当前的所有字段提取规则列表,自定义规则可以进行编辑、删除等操作。

新建规则流程

点击“新建”,默认“不使用已有规则”,点击“下一步”

进入空白“配置规则”页,页面最下方为已入库的日志列表,您可以按需选择过滤时间段,输入搜索字符串进行过滤。在搜索结果中,点击某条日志“选为日志样例”,该行日志显示在页面上端的“日志样例”文本框;

页面上“规则名称”和“logtype”必须填写。一般情况下,建议分别作为本次新建字段提取规则的中英文命名。logtype会作为后续解析字段的上层对象名存在。例如logtype:apache解析出来的clientip结果,字段名为apache.clientip。

添加配置规则

日志的格式是多样化的,为了解析这些多样的日志,通常需要多种方法来处理。日志易提供自定义日志格式配置功能,用户每次配置一项功能后,先解析,解析成功即可点击“继续”,再配置下一项功能。

配置规则

1. 正则解析
2. keyvalue分解
3. keyvalue正则匹配
4. 数值型字段转换
5. url解码
6. user agent解析
7. 时间戳识别
8. geo解析
9. json解析
10. 字段值拆分
11. xml解析
12. syslog_pri解析
13. 自定义字典
14. 格式转换
15. 内容替换


1.正则解析

简介

正则是处理文本解析的有力工具。需要您了解一些基本的正则表达式知识:

\, ?, , *, [], (?:) (?value)

请参考

例如有这样一条日志:

 2014-05-14 23:24:47 15752 [note] innodb: 128 rollback segment(s) are active

我们希望提取出以下字段:timestamp,pid,loglevel和message,可以配置如下的表达式:

(?\s  \s ) (?\s ) \[(?\s \] (?.*)

其中

\s表示匹配非空格字符,\s 表示匹配连续的非空格字符,(?value) 表示提取名字为key的字段,其值为value,会解析出如下字段:

1 timestamp:2014-05-14 23:24:47
2 pid:15752
3 loglevel:note
4 message:innodb: 128 rollback segment(s) are active

除了正常的正则表达式,我们还提供了一些常用的正则表达式,可以通过%{xxx}的方式来引用。比如可以使用%{notspace}来代替\s ,这样的正则表达式为:

(?%{notspace} %{notspace}) %{notspace:pid} \[%{notspace:loglevel}\] %{greedydata:message}

默认的字段值是string类型的,如果您想将其转换为number类型,可以在引用中加入type类型,目前仅支持int和float类型,例如:

%{xxx:int} 或者 %{xxx:float}
常用的正则表达式

1 基本:

 %{number}                (?:%{base10num})
 %{posint}                \b(?:[1-9][0-9]*)\b
 %{nonnegint}             \b(?:[0-9] )\b
 %{word}                  \b\w \b
 %{notspace}              \s 
 %{space}                 \s*
 %{morespace}             \s 
 %{data}                  .*?
 %{greedydata}            .*
 %{ip}                    略
 %{port}                  略

2 apache/nginx:

 %{apcclientip}         
 %{apcident}             
 %{apcuser}              
 %{apctimestamp}                  
 %{apcstatus}            
 %{apcresplen}            
 %{apcreferer} 
 %{apcua} 
 %{apcxforward} 
 %{apcrequest} 

例如原始日志:

 192.168.1.139 - - [24/jan/2015:17:03:49  0800] "get /api/v0/search/fields/?field=tag&filters=&order=desc&page=1&query=*&size=50&sourcegroup=all&sourcegroupcn=所有日志&time_range=-2d,now&type=fields http/1.1" 200 363 "http://alltest.rizhiyi.com/search/?query=*&time_range=-2d,now&order=desc&size=20&page=1&sourcegroup=all&type=timeline&_t=1422088066859&title=默认&index=0" "mozilla/5.0 (macintosh; intel mac os x 10.10; rv:35.0) gecko/20100101 firefox/35.0"

可以采用如下配置:

 %{apcclientip} %{apcident} %{apcuser} %{apctimestamp} %{apcrequest} %{apcstatus} %{apcresplen} %{apcreferer} %{apcua}        

抽取出如下字段:

注意事项

正则库使用的是完全匹配模式,即正则表达式需要消耗掉整条日志才可以匹配:

%{ip:ip}:%{port:port} 不会匹配2014-10-20 192.168.1.1:8080192.168.1.1:8080 2014-10-20,只会匹配192.168.1.1:8080

一个正则表达式中字段分组命名的字段不能重复,如果命名的字段有. @或空格,它们都会被替换成下划线_,因此不要使用这些符号。


以下解析规则需要配置source(哪个字段),指定这个配置对哪个字段有效,也可以选择raw_message。

2.keyvalue分解

kv主要用来解析明显的kv字符串,例如上面的例子中正则表达式解析后,request_query字段为:

field=tag&filters=&order=desc&page=1&query=*&size=50&sourcegroup=all&sourcegroupcn=所有日志&time_range=-2d,now&type=fields

这是一个按照”&”和”=”来分割的kv字段。添加解析规则:keyvalue分解,source字段选择request_query,定义字段间分隔符为&,定义k-v分隔符为=,点击解析,如图可看到解析结果:

如果多个key,您可以通过填写key名称做保留或者取舍,也可以填写丢弃前缀名简化日志内容。


3.keyvalue正则匹配

某些日志中kv字段可能比较复杂,用户往往希望查看解析后简单明了的字段格式,并丢弃某些无关紧要的字段,您可以使用keyvalue正则匹配的方式提取字段,例如一条日志为

<190>may 18 11:20:10 2016 hlj_s12508_1_fw %filter/6/zone_dp_flt_execution_tcp_log(l): -dev_type=secpath-pn=210231a0h6010c000002; srczonename(1034)=serveruntrust;destzonename(1035)=servertrust;rule_id(1070)=90;policyacttype(1071)=denied;prottype(1001)=tcp(6);srcipaddr(1017)=10.167.77.99;destipaddr(1019)=10.166.5.70;srcportnum(1018)=49362;destportnum(1020)=1521;begintime_e(1013)=05182016112009;endtime_e(1014)=05182016112009;

先对日志正则匹配

 <%{notspace:id}>(?%{notspace}\s %{notspace}\s %{notspace}\s %{notspace}\s )%{notspace:host} \%\%(?[^/]*)/(?[^/]*)/(?[^:]*): -dev_type=secpath-pn=210231a0h6010c000002; (?.*)

然后针对“message”字段,进行keyvalue正则匹配的解析配置:

点击解析,可以看到解析结果

所有以src开头的字段都被丢弃,字段名被提取

4.数值型字段转换

默认提取出来的字段都是字符串类型的。如果您希望将这个值转换成数值类型,以方便再后面做统计,则需要通过这个功能来做转换。转换时需要您配置数值的类型:int/float

例如: 您的日志经过解析得出如下字段:

k1: "123",
k2: "123.0"

经过转换可以转变为:

k1: 123,
k2: 123.0

如针对正则表达式的解析结果,选择resp_len字段,点选“int”,点击解析:


5.url解码

将编码过的url进行解码,这个操作只能针对已经解析出来的字段。 如针对正则表达式的解析结果,选择字段request_query.sourcegroup,点击解析:


6.user agent解析

分析http日志中user agent的用户操作系统和浏览器信息。如针对正则表达式解析后的结果,选择ua字段,点击解析:


7.时间戳识别

使用者通常关心日志发生的时间,比如检索最近几天的日志,需要转换日志中的timestamp字段的内容,日志易系统就可以识别这条日志的时间戳。这就需要您在之前抽取字段时就提取出timestamp字段。例如:

timestamp: "150120 16:00:30"

需要配置解析类型为:

yymmdd hh:mm:ss

具体的配置格式参考:

符号 含义 格式 举例
e 星期 数字 星期二:
e:2
ee:02
e 星期 文本星期二:
e:tue
eeee:tuesday
m 月份 七月:
m:7
mm:07
mmm:jul
mmmm:july
d 一月的第几天 数字第9天
d:9
dd:09
h 0-23小时 数字8点
h:8
hh: 08
m 0-59分钟 数字 8分
m:8
mm:08
s 0-59毫秒数字 8秒
s:8
ss:08
s 0-999毫秒数字 888毫秒
sss:888
z 时区文本 zzz:pst
zzzz:pacific standard time;
z 时区时区 z: 0800;
zz: 08:00;
zzzz: america/los_angeles

如果符合iso8601标准可以直接配置成”iso8601”,例如:fri jul 05 21:28:24 2013 iso8601,

如果是unix格式可以直接配置成”unix”,例如:1412899200.000,

如果解析失败或者没有配置,默认使用进入系统的时间作为这条日志发生的时间。

对上面例子中的日志时间戳进行配置,source字段选择timestamp,填入“dd/mmm/yyyy:hh:mm:ss z”,选择时区和时间戳语言,点击解析,弹出配置成功窗口如下图:

针对特殊格式的时间戳格式,您可以选择设定时间戳前缀和最大匹配长度,更好的解析日志。


8.geo解析

解析出日志中ip地址的地理位置,例如针对上面日志,添加“geo解析”解析规则,选择“clientip”字段:

可以看到clientip地址被解析出国家与城市等信息。

9.json解析

json解析用来解析json格式的日志, 例如原始日志为:

{"name": "john smith ", "age": 23, "employed": true, "address": {"street": "324 chrome st", "city": "portland, new york,los angeles ", "country": "united states"}}

json解析后如下图所示:


10.字段值拆分

将字符串切分,例如:

key:"1.2.3.4, 2.4.5.6" 

可以根据“,”来对其进行切分成两个value:

key:["1.2.3.4", "2.4.5.6"] 

在上面的json解析结果中,address.city字段内容为 “portland,new york,los angeles “,将其作为source字段,将分隔符设定为“,”,点击解析,即得到解析结果如图所示:


11.xml解析

针对xml格式的日志解析


12.syslog_pri解析

针对syslog_pri日志格式的解析


13.自定义字典

关于自定义字典部分,请参考字典管理部分


14.格式转换

针对ip地址的转换,用于将一个长整数地址转换成一个字符串(ipv4)网络标准点格式地址,例如3651919938 使用格式转换即会转变成 217.171.224.66


15.内容替换

用于对敏感信息的替换,例如日志原文为

123abc456

正则表达式为(\d )[a-z] ,替换内容为$1###。 则日志原文变成

123###456


完成所有解析规则配置后。点击“使用检索日志验证”,事件表格左侧出现对错图标,每行日志可以单独展开自己的解析结果;

点击“字段”标签,下拉框选择字段名,可以查看在最近100条日志中,该解析规则提取出来的字段效果统计排行。

可以通过“全部日志,解析成功,解析失败”下拉框过滤被验证的事件;

在解析失败的事件集上重新点击“选为日志样例”,替换之前的“日志样例”文本框;

完成规则配置,点击“下一步”,进入规则运用界面。在这里填写“appname”和“tag”,tag内容可选择填写,表示该appname里,带有这个tag的日志,在进入日志易系统时,会运用该解析规则进行日志解析:

可以添加多个appname。表示多个appname都使用这个解析规则。

页面下方显示该规则的概要。 点击“完成”。返回查看”字段提取”列表,出现新规则和对应的 appname/tag。

从已有规则快速新建

点击“新建”,选择“已有规则”,比如 apache,点击“下一步”:

进入“配置规则”页,页面展示 apache 解析规则,但是“规则名称”留空,必须自定义新的规则名称。logtype 则按需填写,可重复。

其余流程同上。

编辑已有规则

点击已有规则的“编辑”按钮,进入“配置规则”页。 修改“解析规则”,点击“下一步”,进入“运用”页。点击“完成”。

将已有规则运用到其他 appname/tag 上

点击已有规则的“编辑”按钮,进入“配置规则”页。 点击“下一步”,进入“运用”页。修改运用的 appname/tag。点击“完成”。