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 在 解析器实现 中
20,294 每月下载量
用于 3 crates
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