YAML Configuration Architecture

YAML config is a thin translation front-end: yamlconf.c converts .yaml files into the same nvlst/cnfobj structures RainerScript produces, feeding them to the shared cnfDoObj() back-end.

Overview

rsyslog’s YAML support is a first step toward a structured, operator-friendly configuration format. The guiding principle was to minimise the change surface: rather than building a parallel engine, runtime/yamlconf.c translates each YAML block into the same intermediate representation (cnfobj + nvlst) that the lex/bison RainerScript grammar already produces.

This confinement strategy means:

  • Parameter validation, type coercion, and error reporting reuse the existing nvlstGetParams() layer — no duplication.

  • Every module that works in RainerScript works identically in YAML.

  • Defects in the translation layer cannot silently corrupt the shared back-end.

  • The YAML-specific code is a single, self-contained file with no runtime presence after configuration loading completes.

This approach may be revisited if future requirements (richer error messages, schema validation, live reload) justify a deeper integration. Any such refactoring requires clear evidence of user benefit that outweighs the additional maintenance surface.

Processing Pipeline

        flowchart TD
  YF["YAML file<br>(.yaml / .yml)"]:::src
  LY["libyaml parser<br>(event stream)"]:::parse
  NV["nvlst chains<br>(name-value lists)"]:::ir
  CO["cnfobj<br>(typed config objects)"]:::ir
  CD["cnfDoObj()<br>(rsconf.c dispatcher)"]:::core
  MH["Module handlers<br>(global / input / action …)"]:::core
  SC["script: / statements:<br>content"]:::src
  CB["cnfAddConfigBuffer()<br>(RainerScript text)"]:::parse
  BP["lex / bison parser<br>(existing grammar)"]:::parse
  RE["Ruleset engine<br>(execution tree)"]:::core

  YF --> LY
  LY --> NV
  NV --> CO
  CO --> CD
  CD --> MH
  SC -->|"verbatim or<br>synthesised"| CB
  CB --> BP
  BP --> RE

  classDef src    fill:#fff2cc,stroke:#d6b656;
  classDef parse  fill:#dae8fc,stroke:#6c8ebf;
  classDef ir     fill:#f8cecc,stroke:#b85450;
  classDef core   fill:#d5e8d4,stroke:#82b366;
    

Legend: Yellow — input files/text. Blue — parsing stages. Red — intermediate representation. Green — shared rsyslog core back-end.

Key Structures

``nvlst`` (runtime/conf.h) is an ordered linked list of (name, value) pairs — rsyslog’s canonical intermediate representation for configuration parameters. Both the RainerScript grammar and yamlconf.c produce nvlst chains; nvlstGetParams() is format-agnostic.

``cnfobj`` wraps an nvlst with a type tag (CNFOBJ_GLOBAL, CNFOBJ_ACTION, CNFOBJ_INPUT, etc.). One cnfobj is constructed per top-level YAML block.

``cnfDoObj()`` (rsconf.c) receives a cnfobj, reads the type tag, and calls the same module initialisation function that RainerScript would have called.

Ruleset Script Handling

YAML offers three ways to express ruleset logic; all three end up in the same RainerScript execution tree via cnfAddConfigBuffer():

  • ``script:`` — raw RainerScript block, passed through verbatim.

  • ``statements:`` — YAML-native if / set / unset / call / foreach maps; yamlconf.c synthesises them into a RainerScript string.

  • ``filter:`` + ``actions:`` — one-level shortcut; synthesised into an if then { } fragment.

No separate interpreter exists. The lex/bison parser handles all ruleset logic.

Parity and Maintenance

Because both formats share the back-end, parity is largely automatic:

  • New global parameters — no YAML change needed; nvlstGetParams() picks them up automatically.

  • New top-level statement types — requires a parse_* function in yamlconf.c and an entry in the dispatch table.

  • Renamed/removed parameters — update yamlconf.c if it special-cases the name, and update the user docs for both formats.

See runtime/AGENTS.md: “Any change to config objects, statement types, template modifiers, or global parameters must be reflected here as well as in ``grammar/``.”

See Also


Support: rsyslog Assistant | GitHub Discussions | GitHub Issues: rsyslog source project

Contributing: Source & docs: rsyslog source project

© 2008–2026 Rainer Gerhards and others. Licensed under the Apache License 2.0.