#log-parser #key-value #text-parser #parser #pattern #log #message-parser

actiondb

一个安全高效的非结构化文本(日志)解析库

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 解析实现

LGPL-2.1

185KB
4.5K SLoC

Coverage Status

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:它是一个必填字段,包含一个 UUID
  • name:它是一个可选字段,包含模式的名称。目前对有效字符集没有限制
  • 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解析器,字符集为从09的数字。可以指定可选的最小和最大长度,如同SET中所述。

GREEDY

它尝试填充解析器和字面量或两个字面量之间的差距。它将下一个字面量用作“结束字符串”条件。如果GREEDY解析器是模式中的最后一个解析器,它将消耗整个剩余的消息。

示例

模式

from %{GREEDY:ipaddr}: %{INT:dunno}

示例消息

from 1.2.3.4: 123

提取的关键值对

  • (ipaddr,1.2.3.4)
  • (dunno,123)

adbtool

adbtool是一款可用于以下目的的工具

  • 验证模式,
  • 解析文本文件。

它支持validateparse子命令。更多信息请查看它的--help选项。

更新日志

依赖关系

~4MB
~67K SLoC