4 个版本

0.1.5 2024年6月11日
0.1.4 2021年3月26日
0.1.3 2021年3月17日
0.1.2 2021年3月17日

解析器实现中排名527

Download history 7/week @ 2024-04-29 44/week @ 2024-05-13 20/week @ 2024-05-20 18/week @ 2024-05-27 160/week @ 2024-06-10 16/week @ 2024-06-17 5/week @ 2024-07-15 45/week @ 2024-07-22 13/week @ 2024-07-29 88/week @ 2024-08-05 128/week @ 2024-08-12

每月下载量274

自定义许可

24KB
575

Rsyslog

Rsyslog 是一个非常灵活的基于 RFC 5424 的 syslog 解析 Rust 库。仅使用 nom 作为依赖项。

特性

  • 这个库非常。如果你接受 TIMESTAMP 使用 Option<&str>,它比 rust-syslog-rfc5424 快 50%。当启用 chrono-timestamp 功能时(将 TIMESTAMP 解析为 chrono 的 DateTime<Offset> 类型),它们的表现相当。与任何 Ruby/Python/Js 实现相比,它显然快一个数量级。它不是针对性能进行了超级优化(尤其是在 SD 方面),我怀疑 rust-syslog-rfc5424 也不是。无论如何,性能不是 rsyslog 的主要目标。它是灵活性。
  • 它允许你在需要时注入自己的 TIMESTAMP、SD 和 MSG 解析器。你需要做的就是实现必要的特质,并在指定解析器类型时注入类型。在我的情况下,我需要解析一个具有无效 SD 的 syslog(基本上它根本不存在,看向你 Heroku)以及一个能够解析原始消息以及 Heroku 路由消息格式的 msg 解析器。你可以在 example/multitype 中看到一个示例。
  • 它允许你在不遍历初始字符串以找到断点(通常是换行符)并将其拆分为字符串切片的 Vec 中进行动态解析多个消息。你需要做的就是注入一个 MSG 解析器,确保它在应该停止时停止。然后你可以使用迭代器来迭代和解析每个子字符串。
  • Rsyslog 提供了一些 TIMESTAMP、结构化数据以及 MSG 解析器的常见实现。

Cargo 功能特性

可选功能特性

  • chrono-timestamp:允许您将 TIMESTAMP 解析为 Option<chrono::DateTime<chrono::FixedOffset>>
  • serde-serialize:允许您使用 serde 序列化 Message 结构体。

使用示例

简单消息

let msg = r#"<29>1 2016-02-21T04:32:57+00:00 web1 someservice - - [origin x-service="someservice"][meta sequenceId="14125553"] 127.0.0.1 - - 1456029177 "GET /v1/ok HTTP/1.1" 200 145 "-" "hacheck 0.9.0" 24306 127.0.0.1:40124 575"#;
let message: Message = rsyslog::Message::parse(msg)?;

默认情况下,Message 类型使用默认泛型类型参数 Message<'a, Option<&'a str>, Vec<StructuredData>, Raw<'a>>

多行消息

type OneLineMessage<'a> = Message<'a, Option<&'a str>, Vec<StructuredData<'a>>, LineRaw<'a>>;

let msg = r#"<29>1 2016-02-21T04:32:57+00:00 web1 someservice - - - 127.0.0.1 - - 1456029177 "GET /v1/info HTTP/1.1" 200 145 "-" "hacheck 0.9.0" 24306 127.0.0.1:40124 575
<29>1 2016-02-21T05:32:57+00:00 web2 someservice - - - 127.0.0.1 - - 1456029177 "GET /v1/videos HTTP/1.1" 200 145 "-" "hacheck 0.9.0" 24306 127.0.0.1:40124 575
<29>1 2016-02-21T06:32:57+00:00 web3 someservice - - - 127.0.0.1 - - 1456029177 "GET /v1/users HTTP/1.1" 200 145 "-" "hacheck 0.9.0" 24306 127.0.0.1:40124 575"#;

let hostnames = OneLineMessage::iter(msg)
    .map(|s| s.map(|s| s.hostname))
    .collect::<Vec<_>>();

更多示例可以在 示例 目录中找到。

依赖关系

~3–4.5MB
~81K SLoC