创建好后可以根据情况对自动创建的日志主题进行重命名,方便后续检索时找到日志所在的日志主题:
如何配置日志格式解析 ?有了日志的原始数据,我们还需要告诉日志服务如何去解析日志,以方便后续对其进行检索。在创建日志采集规则时,需要配置日志的解析格式,下面针对各项配置给出分析与建议。
使用哪种抓取模式 ?首先,我们需要确定日志的抓取模式,支持 5 种:单行文本、JSON、分隔符、多行文本和完全正则。
推荐使用 JSON,因为 JSON 格式本身就将日志给结构化了,日志服务可以提取 JSON 的 key 作为字段名,value 作为对应的字段值,不再需要根据业务日志输出格式配置复杂的匹配规则,日志示例:
{"remote_ip":"10.135.46.111","time_local":"22/Jan/2019:19:19:34 +0800","body_sent":23,"responsetime":0.232,"upstreamtime":"0.232","upstreamhost":"unix:/tmp/php-cgi.sock","http_host":"127.0.0.1","method":"POST","url":"/event/dispatch","request":"POST /event/dispatch HTTP/1.1","xff":"-","referer":"http://127.0.0.1/my/course/4","agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0","response_code":"200"}使用 JSON 抓取模式的前提是业务的日志本身是以 JSON 格式输出的,如果不是 JSON 格式,但切换到使用 JSON 格式输出成本不大,就建议进行切换,如果实在不好切换,再考虑其它抓取模式。
如果日志内容是以固定格式输出的单行文本,考虑使用 "分隔符" 或 "完全正则" 抓取模式。"分隔符" 适用简单格式,日志中每个字段值都以固定的字符串分隔开,比如用 ":::" 隔开,某一条日志内容是:
10.20.20.10 ::: [Tue Jan 22 14:49:45 CST 2019 +0800] ::: GET /online/sample HTTP/1.1 ::: 127.0.0.1 ::: 200 ::: 647 ::: 35 :::可以配置 ":::" 自定义分隔符,并且为每个字段按顺序配置字段名,示例:
"完全正则" 适用复杂格式,使用正则表达式来匹配日志的格式。如日志内容为:
10.135.46.111 - - [22/Jan/2019:19:19:30 +0800] "GET /my/course/1 HTTP/1.1" 127.0.0.1 200 782 9703 "http://127.0.0.1/course/explore?filter%5Btype%5D=all&filter%5Bprice%5D=all&filter%5BcurrentLevelId%5D=all&orderBy=studentNum" "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0" 0.354 0.354正则表达式就可以设置为:
(\S+)[^\[]+(\[[^:]+:\d+:\d+:\d+\s\S+)\s"(\w+)\s(\S+)\s([^"]+)"\s(\S+)\s(\d+)\s(\d+)\s(\d+)\s"([^"]+)"\s"([^"]+)"\s+(\S+)\s(\S+).*日志服务会使用 () 捕获组来区分每个字段,我们还需要为每个字段设置字段名,配置示例:
如果日志没有固定的输出格式,则考虑使用 "单行文本" 或 "多行文本" 的抓取模式。使用这两种模式,不会对日志内容本身进行结构化处理,不会提取日志字段,每条日志的时间戳也固定由日志采集的时间决定,检索的时候也只能进行简单的模糊查询。这两种模式的区别在于日志内容是单行还是多行,如果是单行最简单,不需要设置任何匹配条件,每行都是一条单独的日志;如果是多行则需要设置首行正则表达式,也就是匹配每条日志第一行的正则,当某行日志匹配上预先设置的首行正则表达式,就认为是一条日志的开头,而下一个行首出现作为该条日志的结束标识符。假如多行日志内容是:
10.20.20.10 - - [Tue Jan 22 14:24:03 CST 2019 +0800] GET /online/sample HTTP/1.1 127.0.0.1 200 628 35 Mozilla/5.0 (Windows NT 10.0; WOW64; rv:64.0) Gecko/20100101 Firefox/64.0 0.310 0.310那么首行正则表达式就可以设置为: \d+\.\d+\.\d+\.\d+\s-\s.*