7 个版本 (4 个重大更新)
使用旧的 Rust 2015
0.7.0 | 2016年3月25日 |
---|---|
0.6.1 | 2016年1月24日 |
0.4.0 | 2015年10月28日 |
0.3.1 | 2015年9月7日 |
0.2.1 | 2015年7月24日 |
#2055 in 解析实现
185KB
4.5K SLoC
actiondb
actiondb 是一个库及其关联的工具,用于从非结构化数据中高效地提取信息。它是一个解析日志并从中提取预定义模式的关键值对的工具。
模式可以指定在 JSON 或 YAML 序列化文件中。它们的模式相同,只是格式不同。该格式允许您为每个模式提供一个名称、一个唯一的标识符(UUID)以及使用示例消息测试消息解析。
模式
一个模式由文字和解析器组成,例如
Jun %{INT:day} %{INT:hour}:%{INT:min}:%{INT:sec} server sshd[%{INT:pid}]: Accepted publickey for joe
它可以用来解析以下日志消息
Jun 25 14:09:58 server sshd[26665]: Accepted publickey for joe
JSON 模式文件
这些文件包含模式和它们的属性。一个 JSON 文件看起来像以下示例
{
"patterns": [
{
"name": "SSH_DISCONNECT",
"uuid": "9a49c47d-29e9-4072-be84-3b76c6814743",
"pattern": "Jun %{INT:day} %{INT:hour}:%{INT:min}:%{INT:sec} lobotomy sshd[%{INT:pid}]: Received disconnect from %{GREEDY:ipaddr}: %{INT:dunno}: disconnected by user"
},
{
"uuid": "fa8bdbcb-e0fd-4da1-9fa4-15ecfec28ad2",
"pattern": "Jun %{INT:day} %{INT:hour}:%{INT:min}:%{INT:sec} lobotomy sshd[%{INT:pid}]: pam_unix(sshd:session): session closed for user zts"
}
]
}
它具有以下结构
patterns
:它是一个模式对象的顶层数组
一个模式对象由以下键值对组成
uuid
:它是一个必填字段,包含一个 UUIDname
:它是一个可选字段,包含模式的名称。目前对有效字符集没有限制pattern
:它与在模式中定义的相同values
:它是一个可选字段,包含应添加到匹配消息的额外键值对tags
:它是一个可选数组,包含应添加到匹配消息的标签test_messages
:它是一个测试消息数组,可以用来测试模式。
一个测试消息对象有以下键值对
message
:一个应被解析的字符串消息values
:一个对象,定义了解析后的预期键值对。每个键和值都必须是字符串。tags
:预期的标签
以下示例(在 YAML 中)可以看到一个示例测试消息对象
patterns:
-
uuid: "6d2cba0c-e241-464a-89c3-8035cac8f73e"
name: "LOGGEN"
pattern: "seq: %{INT:.loggen.seq}, thread: %{INT:.loggen.thread}, runid: %{INT:.loggen.runid}, stamp: %{GREEDY:.loggen.stamp} %{GREEDY:.loggen.padding}"
values:
foo: "bar"
tags:
- "foo"
- "bar"
test_messages:
-
message: "seq: 0000000001, thread: 0000, runid: 1437655178, stamp: 2015-07-23T14:39:38 PADDPADDPADDPADD"
values:
.loggen.seq: "0000000001"
.loggen.thread: "0000"
.loggen.runid: "1437655178"
.loggen.stamp: "2015-07-23T14:39:38"
.loggen.padding: "PADDPADDPADDPADD"
解析器
解析器可以用来从非结构化文本中提取数据。
每个解析器都有以下语法
%{PARSER_TYPE(required_arg1, required_arg2, optional_arg1="value", optional_arg2=value):parser_instance_name}
如果解析器没有额外的参数,其参数列表可以省略
%{PARSER_TYPE:parser_instance_name}
名称(name
)也可以省略。
%{PARSER_TYPE}
您可以使用以下字符作为解析器名称:_
、.
、[0-9]
、-
和 [a-zA-Z]
。
可用的解析器
SET
只解析作为其参数给出的字符。可以指定可选的最小和最大长度。
示例
%{SET("abcd",min_len=1,max_len=2):parsed_value_name}
与正则表达式(但速度更快)[abcd]{1,2}
相同。
INT
它重用了SET
解析器,字符集为从0
到9
的数字。可以指定可选的最小和最大长度,如同SET
中所述。
GREEDY
它尝试填充解析器和字面量或两个字面量之间的差距。它将下一个字面量用作“结束字符串”条件。如果GREEDY
解析器是模式中的最后一个解析器,它将消耗整个剩余的消息。
示例
模式
from %{GREEDY:ipaddr}: %{INT:dunno}
示例消息
from 1.2.3.4: 123
提取的关键值对
(ipaddr,1.2.3.4)
(dunno,123)
adbtool
adbtool
是一款可用于以下目的的工具
- 验证模式,
- 解析文本文件。
它支持validate
和parse
子命令。更多信息请查看它的--help
选项。
更新日志
依赖关系
~4MB
~67K SLoC