Přeskočit obsah

Deklarace parserů

Deklarace parseru bere jako vstup původní událost nebo konkrétní pole částečně zpracované události, analyzuje jeho jednotlivé části a ukládá je jako páry klíč-hodnota do události.

LogMan.io Parsec aktuálně podporuje tři typy deklarací parserů:

  • JSON parser
  • Parser Windows událostí
  • Parsec parser

Struktura deklarace

Aby bylo možné určit typ deklarace, je třeba specifikovat sekci define.

define:
    type: <declaration_type>

Pro deklaraci parseru specifikujte type jako parser.

JSON parser

JSON parser se používá pro zpracování událostí se strukturou JSON.

parser_json.yaml
define:
    name: JSON parser
    type: parser/json

Toto je kompletní JSON parser a bude analyzovat události ze struktury JSON, odděluje pole na páry klíč-hodnota.

Varování

Zatím LogMan.io Parsec nepodporuje zpracování událostí s vnořenou strukturou JSON. Například událost níže nelze analyzovat pomocí JSON parseru:

{
    "key": {
        "foo": 1,
        "bar": 2
    }
}

Parser Windows událostí

Parser Windows událostí se používá pro zpracování událostí, které jsou vytvářeny Microsoft Windows. Tyto události jsou ve formátu XML.

define:
    name: Windows Events Parser
    type: parser/windows-event

Toto je kompletní parser Windows událostí a bude analyzovat události z Microsoft Windows, odděluje pole na páry klíč-hodnota.

Parsec parser

Parsec parser se používá pro zpracování událostí ve formátu prostého textu. Je založen na výrazech SP-Lang Parsec.

Pro zpracování původních událostí použijte následující deklaraci:

parser.yaml
define:
    name: My Parser
    type: parser/parsec

parse:
    !PARSE.KVLIST
        - ...
        - ...
        - ...
subparser.yaml
define:
    name: My Parser
    type: parser/parsec
    field: <custom_field>

parse:
    !PARSE.KVLIST
        - ...
        - ...
        - ...

Když je specifikováno field, parsování se aplikuje na toto pole, jinak se aplikuje na původní událost. Proto musí být přítomno v každém sub-parseru.

Příklady deklarací Parsec parseru

Příklad 1: Jednoduchý příklad

Pro účely příkladu předpokládejme, že chceme zpracovat kolekci jednoduchých událostí:

Hello Miroslav from Prague!
Hi Kristýna from Pilsen.

{
    "name": "Miroslav",
    "city": "Prague"
}
{
    "name": "Kristýna",
    "city": "Pilsen"
}
define:
    type: parser/parsec

parse:
    !PARSE.KVLIST
        - !PARSE.UNTIL " "
        - name: !PARSE.UNTIL " "
        - !PARSE.EXACTLY "from "
        - city: !PARSE.LETTERS
Příklad 2: Složitější příklad

Pro účely tohoto příkladu předpokládejme, že chceme zpracovat kolekci jednoduchých událostí:

Process cleaning[123] finished with code 0.
Process log-rotation finished with code 1.
Process cleaning[657] started.

A chceme výstup v následujícím formátu:

{
    "process.name": "cleaning",
    "process.pid": 123,
    "event.action": "process-finished",
    "return.code": 0
}
{
    "process.name": "log-rotation",
    "event.action": "process-finished",
    "return.code": 1
}
{
    "process.name": "cleaning",
    "process.pid": 657,
    "event.action": "process-started",
}

Deklarace bude následující:

10_parser.yaml
define:
    type: parser/parsec

parse:
    !PARSE.KVLIST
        - !PARSE.UNTIL " "
        - !TRY
            - !PARSE.KVLIST
                - process.name: !PARSE.UNTIL "["
                - process.pid: !PARSE.UNTIL "]"
                - !PARSE.SPACE
            - !PARSE.KVLIST
                - process.name: !PARSE.UNTIL " "
        - !TRY
            - !PARSE.KVLIST
                - !PARSE.EXACTLY "started."
                - event.action: "process-started"
            - !PARSE.KVLIST
                - !PARSE.EXACTLY "finished with code "
                - event.action: "process-finished"
                - return.code: !PARSE.DIGITS
Příklad 3: Zpracování syslog událostí

Pro účely příkladu předpokládejme, že chceme zpracovat jednoduchou událost ve formátu syslog:

<189> Sep 22 10:31:39 server-abc server-check[1234]: User "harry potter" logged in from 198.20.65.68

Chceme výstup v následujícím formátu:

{
    "PRI": 189,
    "timestamp": 1695421899,
    "server": "server-abc",
    "process.name": "server-check",
    "process.pid": 1234,
    "user": "harry potter",
    "action": "log-in",
    "ip": "198.20.65.68"
}

Vytvoříme dva parsry. První parser bude zpracovávat hlavičku syslogu a druhý bude zpracovávat zprávu.

10_parser.yaml
define:
    name: Syslog parser
    type: parser/parsec

parse:
    !PARSE.KVLIST
        - !PARSE.EXACTLY "<"
        - PRI: !PARSE.DIGITS
        - !PARSE.EXACTLY ">"

        - timestamp: ...
        - server: !PARSE.UNTIL " "
        - process.name: !PARSE.UNTIL "["
        - process.pid: !PARSE.UNTIL "]"
        - !PARSE.EXACTLY ":"
        - message: !PARSE.CHARS

Tento parser

20_parser_message.yaml
    define:
        type: parser/parsec
        field: message
        drop: yes

    parse:
        !PARSE.KVLIST
            - !PARSE.UNTIL " "
            - user: !PARSE.BETWEEN { what: '"' }
            - !PARSE.EXACTLY " "
            - !PARSE.UNTIL " "
            - !PARSE.UNTIL " "
            - !PARSE.UNTIL " "
            - ip: !PARSE.CHARS