前言
上一節中我們介紹了如何使用正規表達式的方式來解析日志,将非結構化的日志轉化為半結構的資料。除正規表達式方式外,日志服務還支援分隔符模式的日志,分隔符支援單字元和多字元兩種方式。本文通過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"