本文介紹字段值提取函數的語法規則,包括參數解釋、函數示例等。
函數列表
類型 | 函數 | 說明 |
正則提取 | 根據正則表達式提取字段的值并賦值給其他字段。 支持和其他函數組合使用。相關示例,請參見解析Java報錯日志。 | |
JSON提取 | 對特定字段中的JSON對象進行JSON操作,包括JSON展開、JMES提取或者JMES提取后再展開。 支持和其他函數組合使用。相關示例,請參見復雜JSON數據加工。 | |
分隔符提取 | 使用自定義的分隔符與預定義的字段名,從特定字段中提取多個字段。
支持和其他函數組合使用。相關示例,請參見解析CSV格式日志。 | |
KV模式提取 | 通過quote提取多個源字段中的鍵值對信息。 支持和其他函數組合使用。相關示例,請參見提取字符串動態鍵值對。 | |
通過分隔符提取源字段中的鍵值對信息。 | ||
Syslog標準提取 | 根據Syslog協議由已知priority值計算出facility和severity,并且匹配相應的level信息。 支持和其他函數組合使用。相關示例,請參見解析Syslog標準格式數據。 | |
使用定義規則提取 | 使用定義的anchor_rules規則提取字符串。 |
e_regex
根據正則表達式提取字段的值并賦值給其他字段。
函數格式
e_regex(key,正則表達式,fields_info,mode="fill-auto",pack_json=None)
參數說明
參數名稱
參數類型
是否必填
說明
key
任意
是
源字段名。如果字段不存在,則不進行任何操作。特殊字段名的設置請參見事件類型。
正則表達式
String
是
提取字段的正則表達式。 支持捕獲組和非捕獲組正則表達式。
說明非捕獲有時需要使用分組,且使用前綴
?:
。例如\w+@\w+\.\w(?:\.\cn)?
。關于分組不捕獲請參見非捕獲組。fields_info
String/ List/ Dict
否
匹配后目標字段名。當正則表達式參數沒有配置命名捕獲的名稱時,必須配置該參數。
mode
String
否
字段的覆蓋模式。默認為fill-auto。關于更多字段值及含義請參見字段提取檢查與覆蓋模式。
pack_json
String
否
將正則表達式的所有匹配結果打包放入pack_json指定的字段中。默認值是None,表示不打包。
返回結果
返回附帶新字段值的日志。
函數示例
示例1:提取字段中符合表達式的值。
原始日志
msg: 192.168.0.1 http://... 127.0.0.0
加工規則
# 提取字段msg中出現的第一個IP地址。 e_regex("msg",r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}","ip")
加工結果
msg: 192.168.0.1 http://... 127.0.0.0 ip: 192.168.0.1
示例2:提取字段中符合表達式的多個值。
原始日志
msg: 192.168.0.1 http://... 127.0.0.0
加工規則
# 提取字段msg中出現的兩個IP地址,分別賦值給server_ip和client_ip。 e_regex("msg",r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}",["server_ip","client_ip"])
加工結果
msg: 192.168.0.1 http://... 127.0.0.0 server_ip: 192.168.0.1 client_ip: 127.0.0.0
示例3:通過捕獲組提取符合表達式的值。
原始日志
content: start sys version: deficience, err: 2
加工規則
# 使用正則表達式捕獲content中的version和error值。 e_regex("content",r"start sys version: (\w+),\s*err: (\d+)",["version","error"])
加工結果
content: start sys version: deficience, err: 2 error: 2 version: deficience
示例4:通過命名捕獲組提取字段值。
原始日志
content: start sys version: deficience, err: 2
加工規則
e_regex("content",r"start sys version: (?P<version>\w+),\s*err: (?P<error>\d+)")
加工結果
content: start sys version: deficience, err: 2 error: 2 version: deficience
示例5:使用正則表達式捕獲字段dict中的值,并動態命名字段名和其值。
原始日志
dict: verify:123
加工規則
e_regex("dict",r"(\w+):(\d+)",{r"k_\1": r"v_\2"})
加工結果
dict: verify:123 k_verify: v_123
示例6:提取字段中符合表達式的值,并打包賦值給name字段。
原始日志
msg: 192.168.0.1 http://... 127.0.0.0
加工規則
e_regex("msg", r"\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}", "ip", pack_json="name")
加工結果
msg:192.168.0.1 http://... 127.0.0.0 name:{"ip": "192.168.0.1"}
示例7:使用正則表達式提取字段dict中的值,動態命名字段名和其值,并打包賦值給name字段。
原始日志
dict: x:123, y:456, z:789
加工規則
e_regex("dict", r"(\w+):(\d+)", {r"k_\1": r"v_\2"}, pack_json="name")
加工結果
dict:x:123, y:456, z:789 name:{"k_x": "v_123", "k_y": "v_456", "k_z": "v_789"}
示例8:通過捕獲組提取符合表達式的值,并打包賦值給name字段。
原始日志
content: start sys version: deficience, err: 2
加工規則
e_regex( "content", r"start sys version: (\w+),\s*err: (\d+)", ["version", "error"],pack_json="name")
加工結果
content:start sys version: deficience, err: 2 name:{"version": "deficience", "error": "2"}
更多參考
支持和其他函數組合使用。相關示例,請參見解析Java報錯日志。
e_json
對特定字段中的JSON對象進行JSON操作,包括JSON展開、JMES提取或者JMES提取后再展開。
函數格式
e_json(key, expand=None, depth=100, prefix="__", suffix="__", fmt="simple", sep=".", expand_array=True, fmt_array="{parent}_{index}", include_node=r"[\u4e00-\u9fa5\u0800-\u4e00a-zA-Z][\w\-\.]*", exclude_node="", include_path="", exclude_path="", jmes="", output="", jmes_ignore_none=False, mode='fill-auto' )
說明使用e_json解析目標數據,如果需要解析的字符串不符合JSON數據結構,則不會進行字符串解析,而返回原字符串。
參數說明
參數名稱
參數類型
是否必填
說明
key
String
是
源字段名。如果字段不存在,則不進行任何操作。特殊字段名的設置請參見事件類型。
expand
Boolean
否
是否將字段展開。
沒有配置jmes參數時,則默認為True,表示展開。
配置jmes參數時,則默認為False,表示不展開。
depth
Number
否
字段展開的深度。取值范圍為1~2000,1表示只展開第一層,默認為100層。
prefix
String
否
展開時添加為字段名的前綴。
suffix
String
否
展開時添加為字段名的后綴。
fmt
String
否
格式化方式。取值:
simple(默認值):表示將節點名作為字段名。展示形式為
{prefix}{current}{suffix}
。full:表示將父節點與當前節點合并作為字段名。展示形式為
{parent_list_str}{sep}{prefix}{current}{suffix}
。分隔符是由sep
參數指定,默認為.
。parent:表示用完整的路徑作為字段名。展示形式為
{parent}{sep}{prefix}{current}{suffix}
。分隔符是由sep
參數指定,默認為.
。root:表示將根節點與當前節點合并作為字段名。展示形式為
{parent_list[0]}{sep}{prefix}{current}{suffix}
。分隔符由sep
參數指定,默認為.
。
sep
String
否
父子節點格式化的分隔符。當
fmt
取值為full、parent或root時需要設置。默認為.
。expand_array
Boolean
否
是否將數組展開。默認為
True
表示展開數組。fmt_array
String
否
數組展開的格式化方式,格式為
{parent_rlist[0]}_{index}
。也可以使用最多五個占位符自定義格式化字符串:parent_list
,current
,sep
,prefix
,suffix
。include_node
String/ Number
否
節點允許名單,表示過濾時包含的節點名稱。默認只有中文、數字、字母和
_.-
的節點才會被自動展開。exclude_node
String
否
節點限制名單,表示過濾時排除的節點名稱。
include_path
String
否
節點允許名單,表示過濾時包含的節點路徑。
exclude_path
String
否
節點限制名單,表示過濾時排除的節點路徑。
jmes
String
否
將字段值轉化為JSON對象并通過JMES提取特定值。
output
String
否
通過JMES提取特定值時輸出的字段名。
jmes_ignore_none
Boolean
否
當JMES提取不到值時是否忽略。默認為True表示忽略,否則輸出一個空字符串。
mode
String
否
字段的覆蓋模式。默認為fill-auto。關于更多字段值及含義請參見字段提取檢查與覆蓋模式。
JSON展開過濾
如果設置了節點允許名單,則內容必須包含在節點允許名單中然后才會在結果中出現。節點允許名單正則示例:
e_json("json_data_filed", ...., include_node=r'key\d+')
。如果設置了節點限制名單,則內容必須包含在節點限制名單中然后才不會在結果中出現。節點限制名單正則示例:
e_json("json_data_filed", ...., exclude_node=r'key\d+')
。展開節點路徑:正則
include_path
與exclude_path
從路徑開頭匹配,匹配路徑是以.
分隔。
JMES過濾
使用JMES選擇、計算。
選擇特定JSON路徑下的元素屬性列表:
e_json(..., jmes="cve.vendors[*].product",output="product")
用逗號拼接特定JSON路徑下的元素屬性:
e_json(..., jmes="join(',', cve.vendors[*].name)",output="vendors")
計算特定JSON路徑下元素的最大屬性值:
e_json(..., jmes="max(words[*].score)",output="hot_word")
當特定路徑不存在或為空時,返回一個空字符串:
e_json(..., jmes="max(words[*].score)",output="hot_word", jmes_ignore_none=False)
parent_list和parent_rlist
以如下示例說明。
原始日志:
data: { "k1": 100,"k2": {"k3": 200,"k4": {"k5": 300}}}
parent_list是將父節點從左到右排列。
e_json("data", fmt='{parent_list[0]}-{parent_list[1]}#{current}')
得到的日志:
data:{ "k1": 100,"k2": {"k3": 200,"k4": {"k5": 300}}} data-k2#k3:200 data-k2#k5:300
parent_rlist是將父節點從右到左排列。
e_json("data", fmt='{parent_rlist[0]}-{parent_rlist[1]}#{current}')
得到的日志:
data:{ "k1": 100,"k2": {"k3": 200,"k4": {"k5": 300}}} k2-data#k3:200 k4-k2#k5:300
返回結果
返回附帶新字段值的日志。
函數示例
示例1:字段展開操作。
原始日志
data: {"k1": 100, "k2": 200}
加工規則
e_json("data",depth=1)
加工結果
data: {"k1": 100, "k2": 200} k1: 100 k2: 200
示例2:給字段名添加前綴和后綴。
原始日志
data: {"k1": 100, "k2": 200}
加工規則
e_json("data", prefix="data_", suffix="_end")
加工結果
data: {"k1": 100, "k2": 200} data_k1_end: 100 data_k2_end: 200
示例3:將字段按照不同格式展開。
原始日志
data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } }
fmt=full格式
e_json("data", fmt='full')
data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } } data.k1: 100 data.k2.k3: 200 data.k2.k4.k5: 300
fmt=parent格式
e_json("data", fmt='parent')
data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } } data.k1: 100 k2.k3: 200 k4.k5: 3000
fmt=root格式
e_json("data", fmt='root')
data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } } data.k1: 100 data.k3: 200 data.k5: 300
示例4:使用指定分隔符、字段名前綴和字段名后綴提取JSON。
原始日志
data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } }
加工規則
e_json("data", fmt='parent', sep="@", prefix="__", suffix="__")
加工結果
data: {"k1": 100, "k2": {"k3": 200, "k4": {"k5": 300} } } data@__k1__:100 k2@__k3__:200 k4@__k5__:300
示例5:指定fmt_array參數,按照數組方式提取JSON。
原始日志
people: [{"name": "xm", "sex": "boy"}, {"name": "xz", "sex": "boy"}, {"name": "xt", "sex": "girl"}]
加工規則
e_json("people", fmt='parent', fmt_array="{parent_rlist[0]}-{index}")
加工結果
people: [{"name": "xm", "sex": "boy"}, {"name": "xz", "sex": "boy"}, {"name": "xt", "sex": "girl"}] people-0.name: xm people-0.sex: boy people-1.name: xz people-1.sex: boy people-2.name: xt people-2.sex: girl
示例6:使用JMES提取JSON對象。
原始日志
data: { "people": [{"first": "James", "last": "d"},{"first": "Jacob", "last": "e"}],"foo": {"bar": "baz"}}
加工規則
e_json("data", jmes='foo', output='jmes_output0') e_json("data", jmes='foo.bar', output='jmes_output1') e_json("data", jmes='people[0].last', output='jmes_output2') e_json("data", jmes='people[*].first', output='jmes_output3')
加工結果
data: { "people": [{"first": "James", "last": "d"},{"first": "Jacob", "last": "e"}],"foo": {"bar": "baz"}} jmes_output0: {"bar": "baz"} jmes_output1: baz jmes_output2: d jmes_output3: ["james", "jacob"]
更多參考
支持和其他函數組合使用。相關示例,請參見復雜JSON數據加工。
e_csv、e_psv、e_tsv
使用自定義的分隔符與預定義的字段名,從特定字段中提取多個字段。
e_csv:默認分隔符為半角逗號(,)。
e_psv:默認分隔符為豎線(|)。
e_tsv:默認分隔符為
\t
。
函數格式
e_csv(源字段名, 目標字段列表, sep=",", quote='"', restrict=True, mode="fill-auto") e_psv(源字段名, 目標字段列表, sep="|", quote='"', restrict=True, mode="fill-auto") e_tsv(源字段名, 目標字段列表, sep="\t", quote='"', restrict=True, mode="fill-auto")
參數說明
參數名稱
參數類型
是否必填
說明
源字段名
任意
是
源字段名。如果字段不存在,則不進行任何操作。特殊字段名的設置請參見事件類型。
目標字段列表
任意
是
字段值經過分隔符分隔后的每個值對應的字段名。
可以是字符串的列表,例如:
["error", "message", "result"]
。當字段名中不包含逗號時,也可以直接用逗號作為分隔字符,例如:
"error, message, result"
。特殊字段名的設置請參見事件類型。
sep
String
否
分隔符,只能是單個字符。
quote
String
否
引用符,用于包裹值的字符。當值包含分隔符時需要使用。
restrict
Boolean
否
是否采用嚴格模式,默認為False表示非嚴格模式。當分隔值的個數與目標字段列表數不一致時:
嚴格模式下不進行任何操作。
非嚴格模式下對前幾個可以配對的字段進行賦值。
mode
String
否
字段的覆蓋模式。默認為fill-auto。關于更多字段值及含義請參見字段提取檢查與覆蓋模式。
返回結果
返回附帶新字段值的日志。
函數示例
以
e_csv
為例,e_psv
和e_tsv
功能類似。原始日志
content: 192.168.0.100,10/Jun/2019:11:32:16 +0800,example.aliyundoc.com,GET /zf/11874.html HTTP/1.1,200,0.077,6404,192.168.0.100:8001,200,0.060,https://image.developer.aliyundoc.com/s?q=%E8%9B%8B%E8%8A%B1%E9%BE%99%E9%A1%BB%E9%9D%A2%E7%9A%84%E5%81%9A%E6%B3%95&from=wy878378&uc_param_str=dnntnwvepffrgibijbprsvdsei,-,Mozilla/5.0 (Linux; Android 9; HWI-AL00 Build/HUAWEIHWI-AL00) AppleWebKit/537.36,-,-
加工規則
e_csv("content", "remote_addr, time_local,host,request,status,request_time,body_bytes_sent,upstream_addr,upstream_status, upstream_response_time,http_referer,http_x_forwarded_for,http_user_agent,session_id,guid")
加工結果
content: 192.168.0.100,10/Jun/2019:11:32:16 +0800,example.aliyundoc.com,GET /zf/11874.html HTTP/1.1,200,0.077,6404,192.168.0.100:8001,200,0.060,https://image.developer.aliyundoc.com/s?q=%E8%9B%8B%E8%8A%B1%E9%BE%99%E9%A1%BB%E9%9D%A2%E7%9A%84%E5%81%9A%E6%B3%95&from=wy878378&uc_param_str=dnntnwvepffrgibijbprsvdsei,-,Mozilla/5.0 (Linux; Android 9; HWI-AL00 Build/HUAWEIHWI-AL00) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Mobile Safari/537.36,-,- body_bytes_sent: 6404 guid: - host: example.aliyundoc.com http_referer: https://image.developer.aliyundoc.com/s?q=%E8%9B%8B%E8%8A%B1%E9%BE%99%E9%A1%BB%E9%9D%A2%E7%9A%84%E5%81%9A%E6%B3%95&from=wy878378&uc_param_str=dnntnwvepffrgibijbprsvdsei http_user_agent: Mozilla/5.0 (Linux; Android 9; HWI-AL00 Build/HUAWEIHWI-AL00) AppleWebKit/537.36 http_x_forwarded_for: - remote_addr: 192.168.0.100 request: GET /zf/11874.html HTTP/1.1 request_time: 0.077 session_id: - status: 200 time_local: 10/Jun/2019:11:32:16 +0800 topic: syslog-forwarder upstream_addr: 192.168.0.100:8001 upstream_response_time: 0.060 upstream_status: 200
更多參考
支持和其他函數組合使用。相關示例,請參見解析CSV格式日志。
e_kv
通過quote提取多個源字段中的鍵值對信息。
函數格式
e_kv(源字段或源字段列表, sep="=", quote='"', escape=False, prefix="", suffix="", mode="fill-auto")
參數說明
參數名稱
參數類型
是否必填
說明
源字段或源字段列表
字符串或字符串列表
是
字段名或多個字段名的列表。特殊字段名的設置請參見事件類型。
sep
String
否
關鍵字與值的正則表達式的分隔符串,默認為
=
,不限于單個字符。說明可以使用非捕獲分組,但不能使用捕獲分組。關于分組請參見分組。
quote
String
否
引用符,用于包裹值的字符。默認為
"
。說明提取的動態鍵值對的值一般需要quote來包括,例如:
a="abc"
,b="xyz"
如果提取對象中不包含,則只提取如下字符集的值:中文字母數字_-.%~
。例如a=中文ab12_-.%~|abc b=123
可以提取a: 中文ab12_-.%~
,b: 123
。escape
Boolean
否
是否自動提取反轉字符的值。默認為
False
表示否。例如key="abc\"xyz"
默認提取字段key
的值為abc\
,設置escape=True
時,提取的值為abc"xyz
。prefix
String
否
給提取的字段名添加前綴。
suffix
String
否
給提取的字段名添加后綴。
mode
String
否
字段的覆蓋模式。默認為fill-auto。關于更多字段值及含義請參見字段提取檢查與覆蓋模式。
返回結果
返回附帶新字段值的日志。
函數示例
示例1:使用默認分隔符=提取鍵值對信息。
原始日志
http_refer: https://video.developer.aliyundoc.com/s?q=asd&a=1&b=2
說明如果原始日志為
request_uri: a1=1&a2=&a3=3
,a2值為空,則使用e_kv()函數無法提取出a2。您可以使用e_regex()函數進行提取,例如e_regex("request_uri",r'(\w+)=([^=&]*)',{r"\1":r"\2"},mode="overwrite")。加工規則
e_kv("http_refer")
加工結果
http_refer: https://video.developer.aliyundoc.com/s?q=asd&a=1&b=2 q: asd a: 1 b: 2
示例2:給字段名增加前綴和后綴。
原始日志
http_refer: https://video.developer.aliyundoc.com/s?q=asd&a=1&b=2
加工規則
e_kv( "http_refer", sep="=", quote='"', escape=False, prefix="data_", suffix="_end", mode="fill-auto", )
加工結果
http_refer: https://video.developer.aliyundoc.com/s?q=asd&a=1&b=2 data_q_end: asd data_a_end: 1 data_b_end: 2
示例3:提取字段content2中的鍵值對信息,使用escape參數提取反轉字符的值。
原始日志
content2: k1:"v1\"abc", k2:"v2", k3: "v3"
加工規則
e_kv("content2", sep=":", escape=True)
加工結果
content2: k1:"v1\"abc", k2:"v2", k3: "v3" k1: v1"abc k2: v2 k3: v3
更多參考
支持和其他函數組合使用。相關示例,請參見提取字符串動態鍵值對。
e_kv_delimit
通過分隔符提取源字段中的鍵值對信息。
函數格式
e_kv_delimit(源字段或源字段列表, pair_sep=r"\s", kv_sep="=", prefix="", suffix="", mode="fill-auto")
參數說明
參數名稱
參數類型
是否必填
說明
源字段或源字段列表
字符串或字符串列表
是
字段名或多個字段名的列表。特殊字段名的設置請參見事件類型。
pair_sep
String
否
用于分隔鍵值對的正則字符集,默認為
\s
。例如\s\w
、abc\s
等。說明如果您需要使用字符串對字段進行分隔,推薦您使用str_replace或regex_replace將字符串轉換成字符作為分隔符,然后再使用e_kv_delimit函數對字段進行分隔。
kv_sep
String
否
用于分隔鍵值對的正則字符串,默認為
=
,不限于單個字符。說明可以使用非捕獲分組,但不能使用捕獲分組。關于分組請參見分組。
prefix
String
否
給提取的字段名添加前綴。
suffix
String
否
給提取的字段名添加后綴。
mode
String
否
字段的覆蓋模式。默認為fill-auto。關于更多字段值及含義請參見字段提取檢查與覆蓋模式。
返回結果
返回附帶新字段值的日志。
函數示例
示例1:使用默認分隔符
=
提取鍵值對信息。原始日志
data: i=c1 k1=v1 k2=v2 k3=v3
說明如果原始日志為
request_uri: a1=1&a2=&a3=3
,a2值為空,則使用e_kv_delimit()函數無法提取出a2。您可以使用e_regex()函數進行提取,例如e_regex("request_uri",r'(\w+)=([^=&]*)',{r"\1":r"\2"}, mode="overwrite")。加工規則
e_kv_delimit("data")
加工結果
data: i=c1 k1=v1 k2=v2 k3=v3 i: c1 k2: v2 k1: v1 k3: v3
示例2:使用分隔符
&?
提取鍵值對信息。原始日志
data: k1=v1&k2=v2?k3=v3
加工規則
e_kv_delimit("data",pair_sep=r"&?")
加工結果
data: k1=v1&k2=v2?k3=v3 k2: v2 k1: v1 k3: v3
示例3:使用正則表達式提取鍵值對信息。
原始日志
data: k1=v1 k2:v2 k3=v3
加工規則
e_kv_delimit("data", kv_sep=r"(?:=|:)")
加工結果
data: k1=v1 k2:v2 k3=v3 k2: v2 k1: v1 k3: v3
e_syslogrfc
根據Syslog協議由已知priority值計算出facility和severity,并且匹配相應的level信息。
函數格式
e_syslogrfc(key, rfc, fields_info=None, mode='overwrite')
參數說明
參數名稱
參數類型
是否必填
說明
key
任意
是
字段名,需要填入代表
priority
值的字段。rfc
String
是
Syslog使用的RFC協議??蛇x值為SYSLOGRFC3164或者SYSLOGRFC5424。
fields_info
Dict
否
key表示源字段名,value表示新字段名。以下是默認支持重命名的需要進行重命名的字段名及新名稱,支持對新名稱修改。
{"_severity_":"sev","_facility_":"fac","_severitylabel_":"sevlabel","_facilitylabel_":"faclabel"}
mode
String
否
字段的覆蓋模式。默認為overwrite。關于更多字段值及含義請參見字段提取檢查與覆蓋模式。
返回結果
返回添加字段信息的日志。
函數示例
示例1:使用默認Syslog RFC5424協議提取facility、severity和level信息。
原始日志
receive_time: 1558663265 _priority_: 13 _version_: 1 _log_time_: 2019-05-06 11:50:16.015554+08:00 _hostname_: iZbp1a65********i2qZ _program_: root _procid_: - _msgid_: - _extradata_: - _content_: twish
加工規則
e_syslogrfc("_priority_","SYSLOGRFC5424")
加工結果
receive_time: 1558663265 _priority_: 13 _version_: 1 _log_time_: 2019-05-06 11:50:16.015554+08:00 _hostname_: iZbp1a65********i2qZ _program_: root _procid_: - _msgid_: - _extradata_: - _content_: twish _facility_: 1 _severity_: 5 _severitylabel_: Notice: normal but significant condition _facilitylabel_: user-level messages
示例2:使用Syslog RFC5424協議提取facility、severity和level信息,并使用fields_info重命名字段名。
原始日志
receive_time: 1558663265 _priority_: 13 _version_: 1 _log_time_: 2019-05-06 11:50:16.015554+08:00 _hostname_: iZbp1a65********i2qZ _program_: root _procid_: - _msgid_: - _extradata_: - _content_: twish
加工規則
e_syslogrfc( "_priority_", "SYSLOGRFC5424", { "_facility_": "fac", "_severity_": "sev", "_facilitylabel_": "_facility_label_", "_severitylabel_": "_severity_label_", }, )
加工結果
receive_time: 1558663265 _priority_: 13 _version_: 1 _log_time_: 2019-05-06 11:50:16.015554+08:00 _hostname_: iZbp1a65********i2qZ _program_: root _procid_: - _msgid_: - _extradata_: - _content_: twish _facility_: 1 _severity_: 5 _severity_label_: Notice: normal but significant condition _facility_label_: user-level messages
更多參考
支持和其他函數組合使用。相關示例,請參見解析Syslog標準格式數據。
e_anchor
使用定義的anchor_rules規則提取字符串。
函數格式
e_anchor(key,anchor_rules,fields,restrict=False,mode="overwrite")
參數說明
參數名稱
參數類型
是否必填
說明
key
任意
是
字段名。
anchor_rules
String
是
提取字符串的規則,例如:
User = *; Severity = *;,
待提取的內容用*表示。控制臺上展示的日志(Key : Value形式)中,Value與冒號之間有默認的空格,填寫anchor_rules時,請勿帶上默認的空格。
說明在源字段的值中,不能使用*作為前后綴標識。
fields
任意
是
源字段值經過提取后,每個值對應的字段名??梢詾樽址牧斜?,例如:
["user", "job", "result"]
。當字段名中不包含半角逗號(,)時,也可以直接用半角逗號(,)分隔的字符串,例如:"user, job, result"
。特殊字段名(包含特殊符號,但不能包含*號)的設置請參見事件類型。支持跳過某個字段名,使用*代替。例如:
"user,*,result"
,在提取的結果中會只有user和result。更多信息,請參見示例10。restrict
Boolean
否
是否采用嚴格模式,默認為False表示非嚴格模式。當提取的值的個數與目標字段列表數不一致時:
嚴格模式下不進行任何操作。
非嚴格模式下對前幾個可以配對的字段進行賦值。
mode
String
否
默認為overwrite。更多信息,請參見字段提取檢查與覆蓋模式。
返回結果
返回提取成功后的內容。
函數示例
示例1:提取多組值。
原始日志
content : "Aug 2 04:06:08: host=192.168.0.10: local/ssl2 notice mcpd[3772]: User=jsmith@example.com: severity=warning: 01070638:5: Pool member 172.31.51.22:0 monitor status down."
加工規則
e_anchor("content","User=*: severity=*:",["user_field","severity_field"])
加工結果
content : "Aug 2 04:06:08: host=192.168.0.10: local/ssl2 notice mcpd[3772]: User=jsmith@example.com: severity=warning: 01070638:5: Pool member 172.31.51.22:0 monitor status down." user_field : jsmith@example.com severity_field : warning
示例2:提取多jsonArray值。
原始日志
content : '"information":{"name_list":["Twiss","Evan","Wind","like"],"university":["UCL","Stanford University","CMU"]},"other":"graduate"'
加工規則
e_anchor("content",'name_list":*,"university":*},', ["name_list","universities"])
加工結果
content : '"information":{"name_list":["Twiss","Evan","Wind","like"],"university":["UCL","Stanford University","CMU"]},"other":"graduate"' name_list : ["Twiss","Evan","Wind","like"] universities : ["UCL","Stanford University","CMU"]
示例3:提取包含特殊字符值的日志。
原始日志
content : (+2019) June 24 "I am iron man"
加工規則
e_anchor("content", "(+*) * \"*\"",["Year","Date","Msg"])
加工結果
content : (+2019) June 24 "I am iron man" Year : 2019 Date : June 24 Msg : I am iron man
示例4:提取包含特殊字符(不可見字符
\x09
)值的日志。原始日志
content : \x09\x09\x09Chrome/55.0 Safari/537.36
加工規則
e_anchor("content", "\x09\x09\x09*/55.0 */537.36",["Google", "Apple"])
加工結果
content : \x09\x09\x09Chrome/55.0 Safari/537.36 Google : Chrome Apple : Safari
示例5:提取包含特殊字符值的字段content,其中
MESSAGE:
后的To...Subject
都是content內容。原始日志
content : 12:08:10,651 INFO sample_server ReportEmailer:178 - DEBUG SENDING MESSAGE: To: example@aliyun.com Subject: New line Breaks in Message
加工規則
e_anchor("content","* INFO *: \n To: *\n Subject: *",["time","message","email","subject"])
加工結果
content : 12:08:10,651 INFO sample_server ReportEmailer:178 - DEBUG SENDING MESSAGE: To: example@aliyun.com Subject: New line Breaks in Message time : 12:08:10,651 message : sample_server ReportEmailer:178 - DEBUG SENDING MESSAGE email : example@aliyun.com subject : New line Breaks in Message
示例6:提取包含特殊字符值的字段content,不可見的
\t
形式。原始日志
content : I'm tabbed in
加工規則
e_anchor("content","\tI'm * in","word") # 或者使用以下規則,復制content的value(請勿復制默認的空格) e_anchor("content"," I'm * in","word")
加工結果
content : I'm tabbed in word : tabbed
示例7:提取包含特殊字符值的字段content,可見的
\t
形式。原始日志
content : \tI'm tabbed in
加工規則
e_anchor("content","\tI'm * in","word") # 或者使用以下規則 e_anchor("content"," I'm * in","word")
加工結果
content : \tI'm tabbed in word : tabbed
示例8:使用嚴格模式提取日志。
原始日志
content : I used to love having snowball fight with my friends and building snowmen on the streets around our neighborhood
加工規則
e_anchor("content","I * to * having",["v_word", "n_word","asd"],restrict=True)
加工結果
content : I used to love having snowball fight with my friends and building snowmen on the streets around our neighborhood
示例9:使用非嚴格模式提取日志。
原始日志
content : I used to love having snowball fight with my friends and building snowmen on the streets around our neighborhood
加工規則
e_anchor("content","love * fight with my * and",["test1","test2","test13"],restrict=False)
加工結果
content : I used to love having snowball fight with my friends and building snowmen on the streets around our neighborhood test1 : having snowball test2 : friends
示例10:提取某個字段的值,并給另一個字段賦值。
原始日志
content: Could you compare the severity of natural disasters to man-made disasters
加工規則
e_anchor('content', 'compare the * of natural disasters to man-made *', 'n-word,*')
加工結果
content : Could you compare the severity of natural disasters to man-made disasters n-word : severity