20次重大发布

0.21.0 2023年11月13日
0.19.0 2023年7月30日
0.18.0 2022年9月30日
0.17.0 2022年6月17日
0.2.0 2020年2月9日

#230解析器实现

Download history 3909/week @ 2024-04-01 4850/week @ 2024-04-08 4578/week @ 2024-04-15 4166/week @ 2024-04-22 3047/week @ 2024-04-29 5629/week @ 2024-05-06 5175/week @ 2024-05-13 5963/week @ 2024-05-20 5195/week @ 2024-05-27 5126/week @ 2024-06-03 5131/week @ 2024-06-10 4874/week @ 2024-06-17 4335/week @ 2024-06-24 5487/week @ 2024-07-01 5945/week @ 2024-07-08 4307/week @ 2024-07-15

20,294 每月下载量
用于 3 crates

MIT 许可证

62KB
1.5K SLoC

Syslog Loose

一个简单的解析器,旨在解析syslog消息。目标是尽可能从消息中提取正确信息,而不是严格符合标准。

syslog消息格式有两种标准。

RFC5424

RFC5424定义良好且明确。syslog-loose首先尝试根据该标准解析消息。不幸的是,许多系统不生成符合RFC5424的消息,因此如果失败,将回退到

RFC3164

RFC3164是一个更宽松、更模糊的格式。

让我们看看一个示例消息

<34>Oct 11 22:14:15 mymachine su: 'su root' failed for lonvick on /dev/pts/8

第一个字段 <34> 是消息的设施和严重性的组合。这些字段可以缺失,如果缺失,则两个字段都返回 None。参见 这里

日期字段,对于3164来说,需要以 MMM DD HH:MM:SS 的格式。没有指定年份。可以向 parse_message_with_year 传递一个函数,用于解决年份。例如,你可能希望将所有日期解析为当前年份,除非是1月1日,而你有一个来自12月31日的日志消息。

解析器还可以处理3339格式(例如,1985-04-12T23:20:50.52Z)的时间戳。

接下来两个字段是可选的,是主机名或应用名,以及可选的进程ID。这些字段应以 : 结尾。例如

mymachine app[323] :

这给我们

hostname = mymachine appname = app procid = 323

mymachine app :

hostname = mymachine appname = app procid = None

mymachine :

hostname = mymachine appname = None procid = None

app[323] :

这给我们

hostname = None appname = app procid = 323

紧随 : 的文本是消息。消息可以首先以 结构化数据 开始,由 [] 包围的多个部分组成,格式如下:[id key="value"..]。可以通过空格分隔多个键值对。剩余的文本将被解析为自由格式消息。任何无法解析的结构化数据部分将被忽略。

示例


fn resolve_year((month, _date, _hour, _min, _sec): syslog_loose::IncompleteDate) -> i32 {
    let now = Utc::now();
    if now.month() == 1 && month == 12 {
        now.year() - 1
    } else {
        now.year()
    }
}

parse_message_with_year(msg, resolve_year, Variant::Either)

时区

RFC3164消息中的日期可能不一定指定时区。如果您想手动指定时区,可以使用 parse_message_with_year_tz 解析消息。参数 tz 包含一个chrono FixedOffset 的Option,它指定了与UTC的偏移量。

如果没有指定时区,日期将按本地时间解析 - 除非该时间在本地时区中不存在(时钟前进时不存在的时间段),那么时区将被解析为UTC。

依赖项

~2–7.5MB
~46K SLoC