4 个版本
0.1.3 | 2024 年 6 月 9 日 |
---|---|
0.1.2 | 2024 年 6 月 9 日 |
0.1.1 | 2024 年 6 月 7 日 |
0.1.0 | 2024 年 6 月 7 日 |
#363 在 调试
39KB
745 行
grok_rs
grok_rs 是 Elastic Grok 处理器的 Rust 版本,受 grok-go 和 grok 启发。
使用方法
[dependencies]
grok-rs = "0.1.3"
示例
仅使用默认模式
let grok = Grok::default();
let pattern = grok
// USERNAME are defined in grok-patterns
.compile("%{USERNAME}", false)
.unwrap();
let result = pattern.parse("admin [email protected]").unwrap();
println!("{:#?}", result);
输出为
{
"USERNAME": String(
"admin",
),
}
使用用户定义的模式
let mut grok = Grok::default();
grok.add_pattern("NAME", r"[A-z0-9._-]+");
let pattern = grok.compile("%{NAME}", false).unwrap();
let result = pattern.parse("admin").unwrap();
println!("{:#?}", result);
输出为
{
"NAME": String(
"admin",
),
}
当 named_capture_only
为 true 时
let grok = Grok::default();
let pattern = grok
.compile("%{USERNAME} %{EMAILADDRESS:email}", true)
.unwrap();
let result = pattern.parse("admin [email protected]").unwrap();
println!("{:#?}", result);
输出为
{
"email": String(
"[email protected]",
),
}
使用类型
let mut grok = Grok::default();
grok.add_pattern("NUMBER", r"\d+");
let pattern = grok.compile("%{NUMBER:digit:int}", false).unwrap();
let result = pattern.parse("hello 123").unwrap();
println!("{:#?}", result);
输出为
{
"digit": Int(
123,
),
}
注意
grok_rs
基于 regex 代码包,因此缺少一些无法高效实现的特性。这包括但不限于前瞻和后引用。作为交换,该代码包中的所有正则表达式搜索都具有最坏情况 O(m*n)
时间复杂度,其中 m
与正则表达式的大小成正比,n
与被搜索字符串的大小成正比。
Elastic Grok 兼容性
此代码包声明与 Elastic Grok 模式 v8.14.0 兼容,该模式于 2024-06-05 标记。
依赖项
~2.1–3MB
~54K SLoC