Přeskočit obsah

Deklarace parserů

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

LogMan.io Parsec v současnosti podporuje tři typy deklarací parserů:

  • Parser-kombinátor
  • JSON parser
  • XML parser
  • Parser Windows Events

Struktura deklarace

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

define:
    type: parsec/<type>

Pro deklaraci parseru:

define:
    type: parsec/parser

Parser-kombinátor

Parser-kombinátor (parsec) se používá pro zpracování událostí v prostém textovém formátu. Je založen na SP-Lang Parsec výrazech.

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

parser.yaml
define:
    name: Můj Parser
    type: parsec/parser

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

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

Když je specifikováno field, zpracová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í parser-kombinátorů

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

Pro účely příkladu si řekněme, že chceme zpracovat kolekci jednoduchých událostí:

Ahoj Miroslave z Prahy!
Ahoj Kristýno z Plzně.

Příklad deklarace parseru:

define:
    type: parsec/parser

parse:
    !PARSE.KVLIST
    - !PARSE.UNTIL " " # 'Ahoj '
    - name: !PARSE.UNTIL " " # 'Miroslav '
    - !PARSE.EXACTLY "z " # 'z '
    - city: !PARSE.LETTERS # 'Praha'
    - !PARSE.CHARS # '!'

Výstupy:

{
    "name": "Miroslav",
    "city": "Praha"
}
{
    "name": "Kristýna",
    "city": "Plzeň"
}
Příklad 2: Složitější příklad

Pro účely tohoto příkladu si řekněme, ž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, aby výstup byl 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: parsec/parser

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 si řekněme, ž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

Chtěli bychom, aby výstup byl v následujícím formátu:

{
    "log.syslog.priority": 189,
    "@timestamp": 1695421899,
    "host.hostname": "server-abc",
    "process.name": "server-check",
    "process.pid": 1234,
    "user.name": "harry potter",
    "source.ip": "198.20.65.68"
}

Vytvoříme dva parsery. První parser zpracuje hlavičku syslogu a druhý zpracuje zprávu.

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

parse:
    !PARSE.KVLIST
    - "<"
    - PRI: !PARSE.DIGITS # 189
    - ">"
    - "@timestamp": !PARSE.DATETIME RFC3164 # Sep 22 10:31:39
    - host.hostname: !PARSE.UNTIL " " # server-abc
    - process.name: !PARSE.UNTIL "[" # server-check
    - process.pid: !PARSE.UNTIL "]" # 1234
    - ":"
    - !PARSE.SPACES
    - message: !PARSE.CHARS # User "harry potter" logged in from 198.20.65.68
20_parser_message.yaml
    define:
        type: parsec/parser
        field: message

    parse:
        !PARSE.KVLIST
        - !PARSE.UNTIL " " # Uživatel
        - user.name: !PARSE.BETWEEN { what: '"' } # harry potter
        - " "
        - !PARSE.UNTIL " " # přihlášen
        - !PARSE.UNTIL " " # z
        - !PARSE.UNTIL " " # adresy
        - source.ip: !PARSE.CHARS

JSON parser

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

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

Toto je kompletní JSON parser a zpracovává události do objektu JSON, který může být později odkazován v sub-parsers a mapování.

XML parser

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

parser_xml.yaml
define:
    name: XML parser
    type: parsec/parser/xml

Toto je kompletní XML parser a zpracovává události do objektu XML, který může být později odkazován v sub-parsers a mapování.

Parser Windows Event

Parser Windows Events se používá pro zpracování událostí, které jsou generovány z Microsoft Windows. Tyto události jsou ve formátu XML.

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

Toto je kompletní parser Windows Event a zpracovává události z Microsoft Windows, oddělující pole do párů klíč-hodnota.