#log #logstash #etl #grok #elastic

grok-rs

Rust 版本的 Elastic Grok 处理器

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调试

Apache-2.0

39KB
745

Build Status Version codecov

grok_rs

grok_rs 是 Elastic Grok 处理器的 Rust 版本,受 grok-gogrok 启发。

使用方法

[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