前言
上一节中我们介绍了如何使用正则表达式的方式来解析日志,将非结构化的日志转化为半结构的数据。除正则表达式方式外,日志服务还支持分隔符模式的日志,分隔符支持单字符和多字符两种方式。本文通过Nginx分隔符访问日志为大家介绍如何使用Logtail采集分隔符类型的日志。
分隔符日志介绍
分隔符日志使用分隔符(Separator)将一条日志切分成多个字段,一般会分为支持单字符和多字符两种模式。其中单字符分隔符较难理解和掌握,配置方式也更加复杂,建议大家使用简单易用的多字符分隔符。
单字符模式
单字符模式通过匹配单字符进行日志切分,例如制表符(\t)、空格、竖线(|)、逗号(,)、分号(;)等单字符。
单字符分隔符容易出现日志字段中包含分隔符的场景,为避免日志字段被误分割,需要使用Quote(${Quote}
)对日志字段进行包裹隔离。如果内容中在非Quote情况下出现双引号,则需要进行转义,处理成两个Quote,即${Quote}${Quote}
。Quote必须在字段的边界单次出现,要么作为字段内数据成对出现(
{Quote}`),其它情况不符合分隔符日志的格式定义,解析会出错。
正常情况下${Quote}
一般设置为"
,但很多用户并不理解,在使用中容易出现各种问题。因此在日志服务中,默认的${Quote}
设置成\u0001
(不可见字符)。
例如,逗号,
作为分隔符,双引号"
作为Quote。双引号和逗号作为日志字段中的一部分,需要将包含逗号的日志字段用Quote包裹,同时将日志字段中的双引号转义为成对的双引号""
。处理后的日志格式为:1999,Chevy,"Venture ""Extended Edition, Very Large""","",5000.00
。该日志可以被解析为五个字段: 1999
、Chevy
、Venture "Extended Edition
, Very Large
"、空字段和5000.00
。
多字符分隔符
多字符模式中,分隔符可以包括2~3个字符,如(||
)、(&&&
)、(^_^
)等多字符。多字符分隔符模式下,日志解析完全根据分隔符进行匹配,您无需使用Quote对日志进行包裹。
- 注意: 多字符分隔符中没有Quote概念,您 唯一需要关心 的是:需确保日志字段内容中不会出现分隔符的完整匹配,否则会产生字段误分割。
例如,分隔符设置为&&
的情况下,日志:1997&&Ford&&E350&&ac&abs&moon&&3000.00
会被解析为5个字段:1997
、Ford
、E350
、ac&abs&moon
和3000.00
。
使用多字符分隔符解析Nginx access日志
为何使用多字符分隔符
一般Nginx访问日志使用正则或者grok的方式来进行解析,但这两种方式相对多字符分隔符都存在一个非常重要的缺陷:解析效率太低。多字符分隔符通俗易懂,而且解析性能极高,只需一遍简单的字符匹配查找,性能是正则或者grok的3倍以上。因此若您的Nginx访问日志量极大,建议使用多字符分隔符类型的access log,可节省相当多的CPU。
Nginx access日志格式配置
如何配置nginx access日志格式,您可以参考Nginx配置示例,Nginx log module。
配置Nginx多字符分隔符的日志,需要特殊注意的一点是:requests
, referrers
, user-agents
等字段中不能出现相同的多字符分隔符。因此需要给多字符分隔符中配置一个不会再这些字段直接出现的符号,例如"
。下面是一个配置示例:
log_format parsable '$remote_addr |"| $remote_user |"| $time_local |"|' '$request |"| $status |"| $body_bytes_sent |"|' '$http_referer |"| $http_user_agent';
Logtail配置多字符分隔符
日志样例
上述配置的Nginx access日志示例如下:
66.249.65.159|"|-|"|06/Nov/2014:19:10:38 +0600|"|GET /news/53f8d72920ba2744fe873ebc.html HTTP/1.1|"|404|"|177|"|-|"|Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)
解析配置
-
创建采集配置:在数据接入页面中,我们选择自定义数据中的
文本文件
接入。 - 在采集配置中我们选择
分隔符模式
,日志路径中的文件夹和文件名分别输入/var/log/nginx
和access.log
。 - 在日志样例中输入上述样例。
- 分隔符输入
|"|
。 - 分隔符输入完毕后,配置页面会自动分解出8个字段,此时填上分解出的key名称。
最后配置如下:
采集结果
配置应用到机器组后,Logtail会对新产生的日志执行多字符分割,最后采集到服务端的效果如下:
高级定制
在日志服务控制台中,您可以完成80%以上常用的配置管理。但也有一定情况下,控制台无法满足您的配置功能,例如:
- 设置Quote(默认为
\u0001
) - 将分隔符设置为不可见字符或空格
- 隐藏的高级配置
如果您有上述需求,可以使用日志服务的CLI(command language interface)来满足您的需求:
建议初次使用的同学们按照以下方式使用:
- 安装CLI工具,具体请参考使用手册
- 在控制台创建一个分隔符配置
- 使用CLI工具获取该配置,保存到本地文件中
- 修改本地文件,把其中您需要修改的字段替换
- 调用CLI工具的
update_logtail_config
命令更新配置
操作示例如下:
aliyun log get_logtail_config --project_name="demo-log-project" --config_name="delimiter-log" > temp.json vim temp.json aliyun log update_logtail_config --project_name="demo-log-project" --config_detail="file://./temp.json"