rsyslog_module
This skill captures the essential technical patterns for authoring and maintaining rsyslog modules (plugins/contrib).
Quick Start
- Locking: Follow the "Belt and Suspenders" rule (
assert()+if). - State:
pData(shared) vsWID(per-worker). - Boilerplate: Use
BEGINmodInit,CODESTARTmodInit, etc.- Resource: See Common Snippets for boilerplate code.
Detailed Instructions
1. Concurrency & Locking
Rsyslog v8 has a high-concurrency worker model.
- Shared State (
pData): Mutable state shared across workers MUST be protected by a mutex inpData. - Per-Worker State (
WID): Never sharewrkrInstanceData_t. - Belt and Suspenders:
assert(pData != NULL); if (pData == NULL) { // Handle error gracefully } - Headers: Every output module should have a "Concurrency & Locking" header block.
2. Module Lifecycle
Every module must implement and register standard entry points:
modInit(): Initialize static data and registry interfaces.modExit(): Finalize and cleanup.beginTransaction()/commitTransaction(): For efficient batch-based output.
3. Metadata Consistency
- Location:
MODULE_METADATA.yamlin the module directory. - Synchronization: Keep
doc/ai/module_map.yamlin sync with locking and concurrency changes.
4. Build Configuration
- Update
plugins/Makefile.amandconfigure.acwhen adding new modules. - Test Registration: Follow the "Define at Top, Distribute Unconditionally, Register Conditionally" pattern in
tests/Makefile.am. See thersyslog_testskill for details. This is critical formake distcheckvalidity. - Use
MODULE_TYPE(eMOD_OUT)and other macros fromruntime/module-template.h.
Related Skills
rsyslog_build: For compiling the module.rsyslog_test: For creating module-specific smoke tests.rsyslog_doc: For documentation requirements.