---
title: "Process Output"
description: "write TenXObject and template values to a sub-process stdin"
source: "https://github.com/log-10x/modules/tree/main/pipelines/run/modules/output/event/process/module.yaml"
icon: "material/launch"

---
Spawns a process and writes [TenXObject](https://doc.log10x.com/api/js/#TenXObject "Provide structured, reflective access to log/trace events read from input(s).") instance and template field values to its stdin.

This output enables the runtime to leverage external processes  (e.g., [FluentBit](https://fluentbit.io/){target="\_blank"}) as a means of transmitting processed data to local and remote destinations.

## :material-wrench-outline: Config Files

To configure the Process output module, [:material-cog: Edit](https://doc.log10x.com/config/app/#module-config "Learn how to edit app and module configurations") these files.  

Below is the default configuration from: [process/config.yaml](https://github.dev/log-10x/config/blob/main/pipelines/run/output/event/process/config.yaml "process/config.yaml"){target="\_blank"} (<span class="tenx-tooltip" data-tooltip="The config file below contains required fields to activate this module, marked with &#10071;">** Required Fields*</span>).  
  
<div class="edit-options">
    <a class="md-button tenx-edit-online-button" data-tooltip="Edit online on github.dev" href="https://github.dev/log-10x/config/blob/main/pipelines/run/output/event/process/config.yaml" target="_blank" rel="noopener noreferrer">
        <span class="twemoji" style="margin-right: 0.3rem;">
            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                <path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"></path>
            </svg>
        </span> Edit Online
    </a>
    <button class="md-button tenx-config.yaml0-edit-button" data-tooltip="Edit configuration file" data-dialog-id="config-yaml0-dialog">
        <span style="margin-right: 0.3rem;">
            <span class="twemoji">
                <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
                    <path d="M20.71,7.04C21.1,6.65 21.1,6 20.71,5.63L18.37,3.29C18,2.9 17.35,2.9 16.96,3.29L15.12,5.12L18.87,8.87M3,17.25V21H6.75L17.81,9.93L14.06,6.18L3,17.25Z"></path>
                </svg>
            </span>
        </span>Edit Locally
    </button>
</div>

<dialog id="config-yaml0-dialog" class="md-dialog md-dialog--editor">
    <div class="editor-dialog-wrapper">
        <div class="editor-dialog-header">
            <span class="editor-dialog-title">Edit config.yaml Locally</span>
            <div class="editor-header-actions">
                <button class="editor-toolbar-btn yaml-editor-locations" data-tooltip="Save">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path></svg>
                </button>
                <button class="editor-toolbar-btn yaml-editor-reset" data-tooltip="Reset to default">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M12.5 8c-2.65 0-5.05 1-6.9 2.6L2 7v9h9l-3.62-3.62c1.39-1.16 3.16-1.88 5.12-1.88 3.54 0 6.55 2.31 7.6 5.5l2.37-.78C21.08 11.03 17.15 8 12.5 8z"></path></svg>
                </button>
                <button class="editor-toolbar-btn yaml-editor-copy" data-tooltip="Copy to clipboard">
                    <svg class="icon-copy" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path></svg>
                    <svg class="icon-check" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg>
                </button>
                <span class="header-divider"></span>
                <button class="editor-toolbar-btn yaml-editor-fullscreen" data-tooltip="Fullscreen">
                    <svg class="icon-maximize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M5,5H10V7H7V10H5V5M14,5H19V10H17V7H14V5M17,14H19V19H14V17H17V14M10,17V19H5V14H7V17H10Z"></path></svg>
                    <svg class="icon-minimize" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" style="display:none;"><path fill="currentColor" d="M5,16H8V19H10V14H5V16M14,14V19H16V16H19V14H14M16,5V8H19V10H14V5H16M10,5V10H5V8H8V5H10Z"></path></svg>
                </button>
                <span class="header-divider"></span>
                <button class="editor-toolbar-btn editor-dialog-close" onclick="closeDialog('config-yaml0-dialog')" data-tooltip="Close">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path></svg>
                </button>
            </div>
        </div>
        <div class="editor-dialog-content">
            <div class="yaml-editor-container"></div>
        </div>
        <div class="yaml-editor-statusbar">
            <span class="yaml-editor-status"></span>
        </div>
    </div>
    <!-- Locations Popup -->
    <div class="locations-popup" style="display: none;">
        <div class="locations-popup-content">
            <div class="locations-popup-header">
                <span class="locations-header-label">Download and save to:</span>
                <button class="locations-popup-close" aria-label="Close">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="16" height="16">
                        <path fill="currentColor" d="M19,6.41L17.59,5L12,10.59L6.41,5L5,6.41L10.59,12L5,17.59L6.41,19L12,13.41L17.59,19L19,17.59L13.41,12L19,6.41Z"></path>
                    </svg>
                </button>
            </div>
            <ul class="locations-list">
                <li>
                    <span class="location-label">Linux / Docker / macOS
                        <span class="help-icon" data-tooltip="Default system location. The engine automatically reads configs from here at startup. Best for production deployments.">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                        </span>
                    </span>
                    <div class="location-path-row">
                        <code class="default-path location-path" data-tooltip=""
                            data-copy-osx="/etc/log10x/config/run/output/event/process/config.yaml"
                            data-copy-nix="/etc/log10x/config/run/output/event/process/config.yaml"
                            data-copy-win="C:\log10x\configs/run/output/event/process/config.yaml"></code>
                        <button class="copy-btn" data-tooltip="Copy path">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                            </svg>
                        </button>
                    </div>
                </li>
                <li>
                    <span class="location-label">Custom directory
                        <span class="help-icon" data-tooltip="Set TENX_CONFIG environment variable to point to a custom config directory. Useful when you want configs in a non-standard location.">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                        </span>
                    </span>
                    <div class="location-path-row">
                        <code class="location-path" data-tooltip="$TENX_CONFIG/run/output/event/process/config.yaml">$TENX_CONFIG/run/output/event/process/config.yaml</code>
                        <button class="copy-btn" data-tooltip="Copy path">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                            </svg>
                        </button>
                    </div>
                </li>
                <li>
                    <span class="location-label">Within cloned repo
                        <span class="help-icon" data-tooltip="First run: git clone github.com/log-10x/config. Then save the file to this path within the cloned folder. Use for version control.">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="12" height="12"><path fill="currentColor" d="M11 18h2v-2h-2v2m1-16A10 10 0 0 0 2 12a10 10 0 0 0 10 10 10 10 0 0 0 10-10A10 10 0 0 0 12 2m0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8m0-14a4 4 0 0 0-4 4h2a2 2 0 0 1 2-2 2 2 0 0 1 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5a4 4 0 0 0-4-4Z"/></svg>
                        </span>
                    </span>
                    <div class="location-path-row">
                        <code class="location-path" data-tooltip="./pipelines/run/output/event/process/config.yaml">./pipelines/run/output/event/process/config.yaml</code>
                        <button class="copy-btn" data-tooltip="Copy path">
                            <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                                <path fill="currentColor" d="M19 21H8V7h11m0-2H8a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11a2 2 0 0 0 2-2V7a2 2 0 0 0-2-2m-3-4H4a2 2 0 0 0-2 2v14h2V3h12V1Z"></path>
                            </svg>
                        </button>
                    </div>
                </li>
            </ul>
            <div class="locations-popup-footer">
                <button class="locations-download-btn" title="Download config file">
                    <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="14" height="14">
                        <path fill="currentColor" d="M5 20h14v-2H5v2m14-9h-4V3H9v8H5l7 7 7-7Z"></path>
                    </svg>
                    <span>Download</span>
                </button>
            </div>
        </div>
    </div>
</dialog>

<template class="tenx-config-schema" data-encoding="base64">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJpbmNsdWRlIiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAidGVueCIgOiB7CiAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICB9LAogICAgInByb2NPdXQiIDogewogICAgICAidHlwZSIgOiAiYXJyYXkiLAogICAgICAiaXRlbXMiIDogewogICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiBmYWxzZSwKICAgICAgICAicHJvcGVydGllcyIgOiB7CiAgICAgICAgICAiY29tbWFuZCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbW1hbmQgdG8gbGF1bmNoXG5cblNwZWNpZmllcyB0aGUgY29tbWFuZCB0byBleGVjdXRlIHRvIGxhdW5jaCB0aGUgc3ViLXByb2Nlc3MuIFRoaXMgY29tbWFuZCBjYW4gc3BlY2lmeSBhIHNoaXBwZXIgKGUuZy4sIEZsdWVudCBCaXQsIEZpbGViZWF0KSBvciBPUyB1dGlsIChlLmcuLCBuYykgcHJvY2VzcyB0aGF0IHdpbGwgZm9yd2FyZCB0aGUgb3V0cHV0IG9iamVjdCB2YWx1ZXMgdG8gYSByZW1vdGUgZGVzdGluYXRpb24uIgogICAgICAgICAgfSwKICAgICAgICAgICJhcmdzIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJhcnJheSIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJBcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgc3Bhd25lZCBzdWItcHJvY2Vzc1xuXG5MaXN0IG9mIHZhbHVlcyB0byBwYXNzIGFzIHN0YXJ0dXAgYXJndW1lbnRzIHRvIHRoZSBzcGF3bmVkIHN1Yi1wcm9jZXNzLiIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJsYXp5TGF1bmNoIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIlNldHMgd2hldGhlciB0byBsYXVuY2ggdGhlIHByb2Nlc3Mgb24tZGVtYW5kXG5cbkNvbnRyb2xzIHdoZXRoZXIgdG8gc3Bhd24gdGhlIHRhcmdldCBzdWItcHJvY2VzcyB1cG9uIHRoZSBjcmVhdGlvbiBvZiB0aGUgb3V0cHV0IG9yIG9uLWRlbWFuZC4gSWYgdHJ1ZSwgbGF1bmNoIHRoZSBzdWItcHJvY2VzcyB3aGVuIHRoZSBmaXJzdCBUZW5YT2JqZWN0IGluc3RhbmNlIGlzIHdyaXR0ZW4gdG8gaXRzIHN0ZGluLiAoQWNjZXB0cyBib29sZWFuIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSIKICAgICAgICAgIH0sCiAgICAgICAgICAic3RhcnR1cFdhaXRNcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIldhaXQgdGltZSBmb3IgcHJvY2VzcyB0byBzdGFydHVwXG5cblNldHMgYSBzdGFydHVwIGRlbGF5IHdhaXQgdGltZSBpbiBtaWxsaXNlY29uZHMgYmVmb3JlIHRoZSBwcm9jZXNzIGlzIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGZvciBldmVudHMuIGlmIHByb3ZpZGVkLCB3aWxsIGFkZCBhIHdhaXQgYXMgcGFydCBvZiBzdGFydGluZyB0aGUgcHJvY2VzcyBiZWZvcmUgZW1pdHRpbmcgZXZlbnRzIGludG8gaXQuIG1heCB2YWx1ZSBmb3IgdGhpcyBhcmd1bWVudCBpcyAxMCwwMDAgKGllIDEwIHNlY29uZHMpLiBpZiBbcHJvY091dFN0YXJ0dXBXYWl0UGF0dGVybl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvI3Byb2NvdXRzdGFydHVwd2FpdHBhdHRlcm4pIGlzIGFsc28gcHJvdmlkZWQsIHRoZSBwcm9jZXNzIHdpbGwgYmUgY29uc2lkZXJlZCBhIGZhaWx1cmUgaWYgdGhlIHdhaXQgdGltZSBoYXMgcGFzc2VkIGJlZm9yZSBhIGxpbmUgbWF0Y2hpbmcgJ3Byb2NPdXRTdGFydHVwV2FpdFBhdHRlcm4nIHdhcyBlbWl0dGVkLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIgogICAgICAgICAgfSwKICAgICAgICAgICJzdGFydHVwV2FpdFBhdHRlcm4iIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJXYWl0IGZvciBhbiBvdXRwdXQgZnJvbSB0aGUgcHJvY2VzcyBhdCBzdGFydHVwXG5cblNldHMgYSByZWdleCBwYXR0ZXJuIHRvIHdhaXQgZm9yIHRoZSBwcm9jZXNzIHRvIGVtaXQgZm9yIGl0IHRvIGJlIGNvbnNpZGVyZWQgYXZhaWxhYmxlIGZvciBldmVudHMuIGlmIHByb3ZpZGVkLCB3aWxsIHdhaXQgdW50aWwgdGhlIHByb2Nlc3MgaGFzIGVtaXR0ZWQgYSBsaW5lIHRvIGl0J3Mgb3V0cHV0IHRoYXQgbWF0Y2hlcyB0aGUgcmVnZXggYmVmb3JlIGVtaXR0aW5nIGV2ZW50cyBpbnRvIGl0LiBpZiBbcHJvY091dFN0YXJ0dXBXYWl0TXNdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jT3V0U3RhcnR1cFdhaXRNcykgaXMgYWxzbyBwcm92aWRlZCwgd2lsbCBvbmx5IHdhaXQgZm9yIHRoZSBzcGVjaWZpZWQgd2FpdCB0aW1lLCBhZnRlciB3aGljaCBpZiBubyBsaW5lIHdhcyBlbWl0dGVkIHRvIG1hdGNoIHRoZSBwcm92aWRlZCByZWdleCB0aGUgcHJvY2VzcyB3aWxsIGJlIGNvbnNpZGVyZWQgYSBmYWlsdXJlLiIKICAgICAgICAgIH0sCiAgICAgICAgICAiZGVzdHJveU1vZGUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJDb250cm9sIGhvdyB0byB0ZXJtaW5hdGUgdGhlIHN1Yi1wcm9jZXNzIG9uIG91dHB1dCBjbG9zZVxuXG5Db250cm9scyBob3cgdG8gdHJlYXQgc3Bhd25lZCBzdWItcHJvY2VzcyB3aGVuIHRoaXMgb3V0cHV0IGNsb3Nlcy4gUG9zc2libGUgdmFsdWVzOiB8IFZhbHVlICAgICAgfCBEZXNjcmlwdGlvbiB8IHwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwgfCAqKmdyYWNlZnVsKiogKGRlZmF1bHQpICAgfCBUaGUgc3ViLXByb2Nlc3MgaXMgZGVzdHJveWVkIGdyYWNlZnVsbHkgd2l0aCBhIHRpbWVvdXQgcGVyaW9kIG9mIFtwcm9jT3V0RGVzdHJveVdhaXRdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0ZGVzdHJveXdhaXQpLiB8IHwgKipmb3JjaWJsZSoqICAgICAgICAgICAgIHwgVGVybWluYXRlcyB0aGUgc3ViLXByb2Nlc3MgaW1tZWRpYXRlbHkuIHwgfCAqKmNhY2hlZCoqICAgICAgICAgICAgICAgfCBUaGUgc3ViLXByb2Nlc3MgcmVtYWlucyBhbGl2ZSBmb3IgZnV0dXJlIHBpcGVsaW5lcyB0aGF0IGxhdW5jaCB0aGUgc2FtZSBjb21tYW5kIGFuZCBhcmd1bWVudCBjb21iaW5hdGlvbiB3aXRoaW4gdGhlIGhvc3QgSlZNLiBBIG1heGltdW0gb2YgW3Byb2NPdXRNYXhDYWNoZVNpemVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0bWF4Y2FjaGVzaXplKSBjYW4gYmUga2VwdCBhbGl2ZS4gVXNlZnVsIGZvciBsYXVuY2hpbmcgc2hpcHBlcnMgKGUuZy4sIEZpbGViZWF0LCBGbHVlbnQgQml0KSBhY3Jvc3MgbXVsdGlwbGUgMTB4IHBpcGVsaW5lIHJ1bnMgaW4gYSBsb25nLWxpdmluZyBzZXJ2ZXIgZW52aXJvbm1lbnQuIHwiCiAgICAgICAgICB9LAogICAgICAgICAgImRlc3Ryb3lXYWl0IiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiRHVyYXRpb24gdG8gd2FpdCBmb3Igc3Bhd25lZCBzdWItcHJvY2VzcyB0byB0ZXJtaW5hdGVcblxuQ29udHJvbHMgdGhlIHRpbWUgZHVyYXRpb24gdGhhdCB0aGUgb3V0cHV0IHN0cmVhbSB3aWxsIHdhaXQgZm9yIHRoZSBzdWItcHJvY2VzcyB0byB0ZXJtaW5hdGUgZ3JhY2VmdWxseSAoZS5nLiwgJzVzJykuIElmIHRoZSBwcm9jZXNzIHRpbWVvdXRzLCB0aGUgb3V0cHV0IHdpbGwgZm9yY2libHkgdGVybWluYXRlIGl0LiBJZiBzZXQgdG8gMCwgdGhlIG91dHB1dCBzdHJlYW0gd2lsbCB3YWl0IGluZGVmaW5pdGVseSBmb3IgdGhlIHN1Yi1wcm9jZXNzIHRvIHRlcm1pbmF0ZS4gVGhpcyB2YWx1ZSBvbmx5IGFwcGxpZXMgd2hlbiBbcHJvY091dERlc3Ryb3lNb2RlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvcHJvY2Vzcy8jcHJvY291dGRlc3Ryb3ltb2RlKSBpcyBzZXQgdG8gYGdyYWNlZnVsYC4iCiAgICAgICAgICB9LAogICAgICAgICAgIm1heENhY2hlU2l6ZSIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIk1heCBudW1iZXIgb2Ygc3ViLXByb2Nlc3NlcyB0byBrZWVwIGFsaXZlIGFjcm9zcyBzdWJzZXF1ZW50IDEweCBwaXBlbGluZSBleGVjdXRpb25zXG5cblNldHMgdGhlIGdsb2JhbCBtYXhpbXVtIG51bWJlciBvZiBwcm9jZXNzZXMgdGhhdCBjYW4gcmV0YWluZWQgZ2xvYmFsbHkgYWNyb3NzIDEweCBwaXBlbGluZSBleGVjdXRpb25zIHdpdGhpbiB0aGUgaG9zdCBKVk0uIFRoaXMgdmFsdWUgaXMgdXNlZnVsIHdoZW4gbGF1bmNoaW5nIHNoaXBwZXJzIChlLmcuLCBGaWxlYmVhdCwgRmx1ZW50IEJpdCkgZm9yIHVzZSBhY3Jvc3MgbXVsdGlwbGUgMTB4IHBpcGVsaW5lIGV4ZWN1dGlvbnMgd2l0aGluIGEgc2VydmVyIGVudmlyb25tZW50LiBUaGlzIHZhbHVlIG9ubHkgYXBwbGllcyB3aGVuIFtwcm9jT3V0RGVzdHJveU1vZGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0ZGVzdHJveW1vZGUpIGlzIHNldCB0byBgY2FjaGVkYC4gSWYgW3Byb2NPdXRNYXhDYWNoZVNpemVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0bWF4Y2FjaGVzaXplKSBpcyBzZXQgdG8gMCwgbm8gY2FjaGluZyBpcyBwZXJmb3JtZWQsIGFuZCBzdWItcHJvY2Vzc2VzIGFyZSBkZXN0cm95ZWQgZ3JhY2VmdWxseS4gKEFjY2VwdHMgbnVtYmVyIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSIKICAgICAgICAgIH0sCiAgICAgICAgICAiYWxsb3dNdWx0aXBsZVN0cmVhbXMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQWxsb3cgbXVsdGlwbGUgY29uY3VycmVudCBvdXRwdXRzIHRvIHNoYXJlIGEgc3VicHJvY2Vzc1xuXG5JZiB0aGlzIHZhbHVlIGlzIHRydWUsIG11bHRpcGxlIG91dHB1dCBzdHJlYW1zIHNoYXJpbmcgYW4gaWRlbnRpY2FsIGNvbW1hbmQgYW5kIGFyZ3VtZW50cyB3aWxsIGVtaXQgdGhlaXIgdmFsdWVzIHRvIGEgc2luZ2xlIHN1YnByb2Nlc3MuIFdyaXRlIGFjY2VzcyB0byB0aGUgc3VicHJvY2Vzcycgc3RkaW4gZGV2aWNlIHdpbGwgYmUgc3luY2hyb25pemVkIGJldHdlZW4gY29uY3VycmVudCBvdXRwdXQgc3RyZWFtcy4gIEZvciBleGFtcGxlLCBpZiB0aGUgdGFyZ2V0IHN1YnByb2Nlc3MgaXMgYSBsb2cgZm9yd2FyZGVyIChlLmcuLCBGbHVlbnRkL0JpdCkgaXQgY2FuIGJlIGNvbmZpZ3VyZWQgdG8gcm91dGUgVGVuWE9iamVjdHMgZnJvbSBtdWx0aXBsZSBvdXRwdXQgc3RyZWFtcyB0byB0aGVpciB0YXJnZXQgZGVzdGluYXRpb25zIHdpdGhvdXQgcmVxdWlyaW5nIGEgc2VwYXJhdGUgaW5zdGFuY2Ugb2YgdGhlIGZvcndhcmRlciBmb3IgZWFjaCBjb25maWd1cmVkIG91dHB1dCBzdHJlYW0uIChBY2NlcHRzIGJvb2xlYW4gb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAgICAgICAiZGVmYXVsdCIgOiBmYWxzZQogICAgICAgICAgfSwKICAgICAgICAgICJmaWVsZHMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkxpc3Qgb2YgVGVuWE9iamVjdCBmaWVsZCBuYW1lcyB0byBlbmNvZGVcblxuU3BlY2lmaWVzIGEgbGlzdCBvZiBUZW5YT2JqZWN0IGludHJpbnNpYy9jYWxjdWxhdGVkL2V4dHJhY3RlZCBmaWVsZCBuYW1lcyB0byBleHRyYWN0IGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0LiAoRGVmYXVsdDogW1wiZW5jb2RlZE91dGVyVGV4dF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhCYXNlT2JqZWN0K2VuY29kZWRPdXRlclRleHQpXCJdKSIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfSwKICAgICAgICAgICAgImRlZmF1bHQiIDogWwogICAgICAgICAgICAgICJlbmNvZGVkT3V0ZXJUZXh0XShodHRwczovL2RvYy5sb2cxMHguY29tL2FwaS9qcy8jVGVuWEJhc2VPYmplY3QrZW5jb2RlZE91dGVyVGV4dCkiCiAgICAgICAgICAgIF0KICAgICAgICAgIH0sCiAgICAgICAgICAiZmlsdGVyIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gYW4gVGVuWE9iamVjdCBtdXN0IGV2YWx1YXRlIGFzICd0cnV0aHknIGFnYWluc3QgdG8gYmUgd3JpdHRlbiB0byB0aGlzIG91dHB1dFxuXG5TcGVjaWZpZXMgYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gdGhhdCBhbiBUZW5YT2JqZWN0IG11c3QgZXZhbHVhdGUgYXMgdHJ1dGh5IHRvIHdyaXRlIGl0cyBpbnN0YW5jZS90ZW1wbGF0ZSBmaWVsZCB2YWx1ZXMgdG8gdGhpcyBvdXRwdXQuICBGb3IgZXhhbXBsZSwgdG8gb25seSBlbWl0IFt0aW1lc3RhbXBlZF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhCYXNlT2JqZWN0K3RpbWVzdGFtcGVkKSBUZW5YT2JqZWN0cywgc3BlY2lmeTogYGBgIHlhbWwgcHJvY091dEZpbHRlcjogdGhpcy50aW1lc3RhbXBlZCBgYGAiCiAgICAgICAgICB9LAogICAgICAgICAgIndyaXRlT2JqZWN0cyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAiYm9vbGVhbiIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJJZiB0cnVlLCBUZW5YT2JqZWN0IGZpZWxkIHZhbHVlcyBzcGVjaWZpZWQgYnkgW3Byb2NPdXRGaWVsZHNdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0ZmllbGRzKSBhcmUgZW5jb2RlZCB0byB0aGlzIG91dHB1dFxuXG5EZXRlcm1pbmUgd2hldGhlciB0byB3cml0ZSBbcHJvY091dEZpZWxkc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvI3Byb2NvdXRmaWVsZHMpIHZhbHVlcyBvZiBhbiBUZW5YT2JqZWN0IHBhc3NlZCB0byB0aGlzIG91dHB1dC4gVGhpcyBjb25maWd1cmF0aW9uIGlzIHR5cGljYWxseSBkZWZpbmVkIHVzaW5nIGEgSmF2YVNjcmlwdCBleHByZXNzaW9uLiAgVG8gZW5hYmxlL2Rpc2FibGUgdGhlIG91dHB1dCBkZXBlbmRpbmcgb24gd2hldGhlciBhIGxhdW5jaCBhcmd1bWVudCwgZW52aXJvbm1lbnQgdmFyaWFibGUsIG9yIEpWTSAtRCBvcHRpb24gZXZhbHVhdGVzIGFzIHRydXRoeSwgdXNlOiBgYGAgeWFtbCAgIHByb2NPdXRXcml0ZU9iamVjdHM6ICQ9VGVuWEVudi5nZXQoXCJteVByb2NDbWRcIikgYGBgIFRvIGxlYXJuIG1vcmUgc2VlIFtUZW5YRW52LmdldF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhFbnYuZ2V0KS4gKERlZmF1bHQ6IHRydWUpIiwKICAgICAgICAgICAgImRlZmF1bHQiIDogInRydWUiCiAgICAgICAgICB9LAogICAgICAgICAgIndyaXRlVGVtcGxhdGVzIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIklmIHRydWUsIHdyaXRlIG5ldyBUZW5YVGVtcGxhdGVzIHRvIHRoaXMgb3V0cHV0XG5cbkNvbnRyb2xzIHdoZXRoZXIgdG8gd3JpdGUgdGVtcGxhdGUgdmFsdWVzIG9mIFRlblhPYmplY3RzIHBhc3NlZCB0byB0aGlzIG91dHB1dC4gVGhlIG91dHB1dCB3aWxsIG9ubHkgZW1pdCBUZW5YVGVtcGxhdGVzIHRoYXQgdGhlIHBpcGVsaW5lIGRpZCBub3QgbG9hZCBhdCBzdGFydHVwIHZpYSB0aGVbdGVtcGxhdGVGaWxlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi90ZW1wbGF0ZS8jdGVtcGxhdGVmaWxlcykgYXJndW1lbnQsIGFuZCB3aWxsIG9ubHkgZW1pdCBhbiBUZW5YVGVtcGxhdGUgb25jZSBiYXNlZCBvbiBpdHMgW3RlbXBsYXRlSGFzaF0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9hcGkvanMvI1RlblhCYXNlT2JqZWN0K3RlbXBsYXRlSGFzaCkgdmFsdWUuIChEZWZhdWx0OiBmYWxzZSkiLAogICAgICAgICAgICAiZGVmYXVsdCIgOiAiZmFsc2UiCiAgICAgICAgICB9LAogICAgICAgICAgImVuY29kZVR5cGUiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgb3V0cHV0IGZvcm1hdCBpbiB3aGljaCB0byBlbmNvZGUgVGVuWE9iamVjdCB2YWx1ZXMuIFBvc3NpYmxlIHZhbHVlczpbanNvbiwgZGVsaW1pdGVkXVxuXG5TcGVjaWZpZXMgaG93IHRvIGVuY29kZSBbcHJvY091dEZpZWxkc10oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvI3Byb2NvdXRmaWVsZHMpIHZhbHVlcyB0byB0aGlzIG91dHB1dC4gUG9zc2libGUgdmFsdWVzOiAtICoqanNvbioqOiBmb3JtYXRzIG5hbWVzIGFuZCB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IHtcImZpZWxkXCI6XCJzdHJcIixcImZpZWxkMlwiOjEsIFwiZmllbGQzXCI6IHRydWV9IC0gKipkZWxpbWl0ZWQqKjogZm9ybWF0cyB2YWx1ZXMgZm9yIHRoZSBjdXJyZW50IFRlblhPYmplY3QgYXM6IFwic3RyXCIsMSx0cnVlICAgIFRoZSBbcHJvY091dEVuY29kZURlbGltaXRlcl0oaHR0cHM6Ly9kb2MubG9nMTB4LmNvbS9ydW4vb3V0cHV0L2V2ZW50L3Byb2Nlc3MvI3Byb2NvdXRlbmNvZGVkZWxpbWl0ZXIpIGFyZ3VtZW50IGRldGVybWluZXMgdGhlIHNlcGFyYXRvciB0byB1c2UuIChEZWZhdWx0OiBkZWxpbWl0ZWQpIiwKICAgICAgICAgICAgImRlZmF1bHQiIDogImRlbGltaXRlZCIKICAgICAgICAgIH0sCiAgICAgICAgICAiZW5jb2RlZExpbmVQcmVmaXgiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJUaGUgbGluZSBwcmVmaXggcHJlcGVuZGVkIHRvIHRoZSBlbmNvZGVkIGV2ZW50IGlmICdwcm9jT3V0RW5jb2RlVHlwZScgaXMgJ2RlbGltaXRlZCdcblxuU2V0cyB0aGUgY2hhciB3aGljaCBpcyBwcmVwZW5kZWQgdG8gdGhlIGVtaXR0ZWQgVGVuWE9iamVjdCBmaWVsZCB2YWx1ZXMgd2hlbiBbcHJvY091dEVuY29kZVR5cGVdKGh0dHBzOi8vZG9jLmxvZzEweC5jb20vcnVuL291dHB1dC9ldmVudC9wcm9jZXNzLyNwcm9jb3V0ZW5jb2RldHlwZSkgaXMgYGRlbGltaXRlZGAuIChEZWZhdWx0OiApIiwKICAgICAgICAgICAgImRlZmF1bHQiIDogIiIKICAgICAgICAgIH0sCiAgICAgICAgICAiZW5jb2RlRGVsaW1pdGVyIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiVGhlIGRlbGltaXRlciBwbGFjZWQgYmV0d2VlbiBrZXkgYW5kIHZhbHVlcyBwYWlycyBpZiAncHJvY091dEVuY29kZVR5cGUnIGlzICdkZWxpbWl0ZWQnXG5cblNldHMgdGhlIGNoYXIgZGVsaW1pdGVyIHRvIHNlcGFyYXRlIFRlblhPYmplY3QgZmllbGQgdmFsdWVzIHdoZW4gW3Byb2NPdXRFbmNvZGVUeXBlXShodHRwczovL2RvYy5sb2cxMHguY29tL3J1bi9vdXRwdXQvZXZlbnQvcHJvY2Vzcy8jcHJvY291dGVuY29kZXR5cGUpIGlzIGBkZWxpbWl0ZWRgLiAoRGVmYXVsdDogICkiLAogICAgICAgICAgICAiZGVmYXVsdCIgOiAiICIKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJyZXF1aXJlZCIgOiBbCiAgICAgICAgICAiY29tbWFuZCIKICAgICAgICBdCiAgICAgIH0KICAgIH0KICB9LAogICJhZGRpdGlvbmFsUHJvcGVydGllcyIgOiB0cnVlCn0=</template>

```yaml
# 🔟❎ 'run' Fluent Bit output configuration

# Launch a Fluent Bit process into whose stdin pipe to write TenXObject instance/template field values.
# To learn more see https://doc.log10x.com/run/output/event/process/

# Set the 10x pipeline to 'run'
tenx: run

# =============================== Dependencies ================================

include: run/modules/output/event/process

# ============================ Fluent Bit Options =============================

# Multiple sub-process outputs can be defined below

procOut:

  # ----------------------------- Object Output -------------------------------

   # 'writeObjects' controls whether to write TenXObject field values to output.
  - writeObjects: false # (❗ REQUIRED)

    # -------------------------- Process Options ------------------------------

    # 'command' defines the OS-resolvable path of the sub-process to spawn
    command: /opt/fluent-bit/bin/fluent-bit

    args:
      - -i
      - stdin
      - -o
      - stdout

    # 'destroyMode' is set to 'cached' to allow a fluent-bit sub-process to
    #  to be reused across multiple 10x pipeline executions within a host JVM.
    destroyMode: cached

    # 'maxCacheSize' sets the size of the cache to used for caching fluent-bit instances
    maxCacheSize: 1

    # 'lazyLaunch' determines whether the fluent-bit instance will launch immediately
    # during the pipeline initialization, or only on-demand.
    lazyLaunch: true

    # 'startupWaitMs' and 'startupWaitPattern' controls the wait for the fluent-bit instance
    # to be ready for receiving events, before starting to emit to it.
    startupWaitMs: $=parseDuration("5s")
    startupWaitPattern: \[\s*sp\s*]\s+stream\s+processor\s+started\b

    # ------------------------------ Encoding ---------------------------------

    # 'filter' specifies an expression that any TenXObject passed to this output must
    #  evaluate as truthy against to write its instance/template values to stdout.
    #  For example, 'filter: this.timestamp' will only emit timestamped objects.
    #  To learn more see: https://doc.log10x.com/api/js/#TenXBaseObject+timestamped
    filter: null

    # 'fields' specifies a list of 10x intrinsic/calculated/extracted fields
    #  to extract from each target object passed to the output
    #  and written to stdout in the format specified by 'encodeType'
    #  If no fields are specified, encode/decode the target TenXObject.

    #  This example corresponds to the stdin format defined by fluent-bit in:
    #  https://docs.fluentbit.io/manual/pipeline/inputs/standard-input
    #  The 'text' argument below could be replaced by any list of intrinsic/calculated/extracted fields.
    #  The "" delimiter instructs 'joinFields' to produce JSON output.
    fields:  #
      - open="["
      - timestamp=dateFormat("+%s.%N")
      - separator=","
      - fields=joinFields("", "text")
      - close="]"

    # 'encodeType' specifies how 'fields' are encoded to stdout. Possible values:
    #    - 'json': formats names and values for the current TenXObject as: {"field":"str","field2":1, "field3": true}
    #    - 'delimited': formats values for the current TenXObject as: "str",1,true
    #                   The value separator (e.g., ',') is set by: 'encodeDelimiter'
    encodeType: delimited

    # 'encodeDelimiter' sets the char delimiter used to separate TenXObject
    #  field values when 'encodeType' is set to: 'delimited'
    encodeDelimiter: ' '

  # ----------------------------- Template Output -----------------------------

    # 'writeTemplates' controls whether to write new templates for TenXObjects written to
    #  this output. To learn more https://doc.log10x.com/run/template
  - writeTemplates: false  # (❗ REQUIRED)

    # -------------------------- Process Options ------------------------------

    # The output below writes the template values of TenXObjects
    # passed to this location. To learn more about TenXTemplates, see:
    # https://doc.log10x.com/run/template

    # 'command' defines the OS-resolvable path of the sub-process to spawn
    command: /opt/fluent-bit/bin/fluent-bit

    args:
      - -i
      - stdin
      - -o
      - stdout

    # 'destroyMode' is set to 'cached' to allow a fluent-bit sub-process to
    #  to be reused across multiple 10x pipeline executions within a host JVM.
    destroyMode: cached

    # 'maxCacheSize' sets the size of the cache to used for caching fluent-bit instances
    maxCacheSize: 1

    # 'lazyLaunch' determines whether the fluent-bit instance will launch immediately
    # during the pipeline initialization, or only on-demand.
    lazyLaunch: true

    # 'startupWaitMs' and 'startupWaitPattern' controls the wait for the fluent-bit instance
    # to be ready for receiving events, before starting to emit to it.
    startupWaitMs: $=parseDuration("5s")
    startupWaitPattern: \[\s*sp\s*]\s+stream\s+processor\s+started\b
```

## :material-menu: Options

Specify the options below to [configure](/config "configure") multiple Process output:

|Name|Description|Category|
|---|---|---|
|[procOutCommand](#procoutcommand "command to launch")|Command to launch|Process|
|[procOutArgs](#procoutargs "arguments to pass to the spawned sub-process")|Arguments to pass to the spawned sub-process|Process|
|[procOutLazyLaunch](#procoutlazylaunch "sets whether to launch the process on-demand")|Sets whether to launch the process on-demand|Process|
|[procOutStartupWaitMs](#procoutstartupwaitms "wait time for process to startup")|Wait time for process to startup|Process|
|[procOutStartupWaitPattern](#procoutstartupwaitpattern "wait for an output from the process at startup")|Wait for an output from the process at startup|Process|
|[procOutDestroyMode](#procoutdestroymode "control how to terminate the sub-process on output close")|Control how to terminate the sub-process on output close|Lifecycle|
|[procOutDestroyWait](#procoutdestroywait "duration to wait for spawned sub-process to terminate")|Duration to wait for spawned sub-process to terminate|Lifecycle|
|[procOutMaxCacheSize](#procoutmaxcachesize "max number of sub-processes to keep alive across subsequent 10x pipeline executions")|Max number of sub-processes to keep alive across subsequent 10x pipeline executions|Lifecycle|
|[procOutAllowMultipleStreams](#procoutallowmultiplestreams "allow multiple concurrent outputs to share a subprocess")|Allow multiple concurrent outputs to share a subprocess|Lifecycle|
|[procOutFields](#procoutfields "list of TenXObject field names to encode")|List of TenXObject field names to encode|Encoding|
|[procOutFilter](#procoutfilter "a JavaScript expression an TenXObject must evaluate as 'truthy' against to be written to this output")|A JavaScript expression an TenXObject must evaluate as 'truthy' against to be written to this output|Encoding|
|[procOutWriteObjects](#procoutwriteobjects "if true, TenXObject field values specified by [procOutFields](https://doc.log10x.com/run/output/event/process/#procoutfields) are encoded to this output")|If true, TenXObject field values specified by \[procOutFields\](https://doc.log10x.com/run/output/event/process/#procoutfields) are encoded to this output|Encoding|
|[procOutWriteTemplates](#procoutwritetemplates "if true, write new TenXTemplates to this output")|If true, write new TenXTemplates to this output|Encoding|
|[procOutEncodeType](#procoutencodetype "the output format in which to encode TenXObject values. Possible values:[json, delimited]")|The output format in which to encode TenXObject values. Possible values:\[json, delimited\]|Encoding|
|[procOutEncodedLinePrefix](#procoutencodedlineprefix "the line prefix prepended to the encoded event if 'procOutEncodeType' is 'delimited'")|The line prefix prepended to the encoded event if 'procOutEncodeType' is 'delimited'|Encoding|
|[procOutEncodeDelimiter](#procoutencodedelimiter "the delimiter placed between key and values pairs if 'procOutEncodeType' is 'delimited'")|The delimiter placed between key and values pairs if 'procOutEncodeType' is 'delimited'|Encoding|

### Process

#### :material-menu-right-outline:**`procOutCommand`**

Command to launch.

|Type|Required|Category|
|---|---|---|
|String|✔|Process|

Specifies the command to execute to launch the sub-process.
This command can specify a shipper (e.g., Fluent Bit, Filebeat) or OS util (e.g., nc)
process that will forward the output object values to a remote destination.


#### :material-menu-right-outline:**`procOutArgs`**

Arguments to pass to the spawned sub-process.

|Type|Default|Category|
|---|---|---|
|List|\[\]|Process|

List of values to pass as startup arguments to the spawned sub-process.


#### :material-menu-right-outline:**`procOutLazyLaunch`**

Sets whether to launch the process on-demand.

|Type|Default|Category|
|---|---|---|
|Boolean|false|Process|

Controls whether to spawn the target sub-process upon the creation of the output or on-demand.
If true, launch the sub-process when the first TenXObject instance is written to its stdin.


#### :material-menu-right-outline:**`procOutStartupWaitMs`**

Wait time for process to startup.

|Type|Default|Category|
|---|---|---|
|Number|0|Process|

Sets a startup delay wait time in milliseconds before the process is considered available for events.
if provided, will add a wait as part of starting the process before emitting events into it.
max value for this argument is 10,000 (ie 10 seconds).
if [procOutStartupWaitPattern](https://doc.log10x.com/run/output/event/process/#procoutstartupwaitpattern "wait for an output from the process at startup") is also provided, the process will be considered
a failure if the wait time has passed before a line matching 'procOutStartupWaitPattern' was emitted.


#### :material-menu-right-outline:**`procOutStartupWaitPattern`**

Wait for an output from the process at startup.

|Type|Default|Category|
|---|---|---|
|String|""|Process|

Sets a regex pattern to wait for the process to emit for it to be considered available for events.
if provided, will wait until the process has emitted a line to it's output that matches the regex
before emitting events into it.
if [procOutStartupWaitMs](https://doc.log10x.com/run/output/event/process/#procOutStartupWaitMs "wait time for process to startup") is also provided, will only wait for the specified
wait time, after which if no line was emitted to match the provided regex the process will be considered
a failure.


### Lifecycle

#### :material-menu-right-outline:**`procOutDestroyMode`**

Control how to terminate the sub-process on output close.

|Type|Default|Category|
|---|---|---|
|String|""|Lifecycle|

Controls how to treat spawned sub-process when this output closes. Possible values:

|Value|Description|
|---|---|
|**graceful** (default)|The sub-process is destroyed gracefully with a timeout period of [procOutDestroyWait](https://doc.log10x.com/run/output/event/process/#procoutdestroywait "duration to wait for spawned sub-process to terminate").|
|**forcible**|Terminates the sub-process immediately.|
|**cached**|The sub-process remains alive for future pipelines that launch the same command and argument combination within the host JVM. A maximum of [procOutMaxCacheSize](https://doc.log10x.com/run/output/event/process/#procoutmaxcachesize "max number of sub-processes to keep alive across subsequent 10x pipeline executions") can be kept alive. Useful for launching shippers (e.g., Filebeat, Fluent Bit) across multiple 10x pipeline runs in a long-living server environment.|


#### :material-menu-right-outline:**`procOutDestroyWait`**

Duration to wait for spawned sub-process to terminate.

|Type|Default|Category|
|---|---|---|
|String|""|Lifecycle|

Controls the time duration that the output stream will
wait for the sub-process to terminate gracefully (e.g., '5s').
If the process timeouts, the output will forcibly terminate it. If set to 0,
the output stream will wait indefinitely for the sub-process to terminate.
This value only applies when [procOutDestroyMode](https://doc.log10x.com/run/output/event/process/#procoutdestroymode "control how to terminate the sub-process on output close") is set to `graceful`.


#### :material-menu-right-outline:**`procOutMaxCacheSize`**

Max number of sub-processes to keep alive across subsequent 10x pipeline executions.

|Type|Default|Category|
|---|---|---|
|Number|0|Lifecycle|

Sets the global maximum number of processes that can retained globally
across 10x pipeline executions within the host JVM. This value is useful
when launching shippers (e.g., Filebeat, Fluent Bit) for use
across multiple 10x pipeline executions within a server environment.
This value only applies when [procOutDestroyMode](https://doc.log10x.com/run/output/event/process/#procoutdestroymode "control how to terminate the sub-process on output close") is set to `cached`.
If [procOutMaxCacheSize](https://doc.log10x.com/run/output/event/process/#procoutmaxcachesize "max number of sub-processes to keep alive across subsequent 10x pipeline executions") is set to 0, no caching is performed, and sub-processes
are destroyed gracefully.


#### :material-menu-right-outline:**`procOutAllowMultipleStreams`**

Allow multiple concurrent outputs to share a subprocess.

|Type|Default|Category|
|---|---|---|
|Boolean|false|Lifecycle|

If this value is true, multiple output streams sharing an identical
command and arguments will emit their values to a single subprocess.
Write access to the subprocess' stdin device will be synchronized between concurrent output streams.

For example, if the target subprocess is a log forwarder (e.g., Fluentd/Bit)
it can be configured to route TenXObjects from multiple output streams to their target
destinations without requiring a separate instance of the forwarder for each configured output stream.


### Encoding

#### :material-menu-right-outline:**`procOutFields`**

List of TenXObject field names to encode.

|Type|Default|Category|
|---|---|---|
|List|\[encodedOuterText\](https://doc.log10x.com/api/js/#TenXBaseObject+encodedOuterText)\]|Encoding|

Specifies a list of TenXObject intrinsic/calculated/extracted field names to extract and write to the output.


#### :material-menu-right-outline:**`procOutFilter`**

A JavaScript expression an TenXObject must evaluate as 'truthy' against to be written to this output.

|Type|Default|Category|
|---|---|---|
|String|""|Encoding|

Specifies a JavaScript expression that an TenXObject must evaluate as truthy to write its
instance/template field values to this output.

For example, to only emit [timestamped](https://doc.log10x.com/api/js/#TenXBaseObject+timestamped "Return true if length of timestamp is greater than 0") TenXObjects, specify:

```yaml
procOutFilter: this.timestamped
```


#### :material-menu-right-outline:**`procOutWriteObjects`**

If true, TenXObject field values specified by \[procOutFields\](https://doc.log10x.com/run/output/event/process/#procoutfields) are encoded to this output.

|Type|Default|Category|
|---|---|---|
|String|true|Encoding|

Determine whether to write [procOutFields](https://doc.log10x.com/run/output/event/process/#procoutfields "list of TenXObject field names to encode") values of an TenXObject passed to this output.
This configuration is typically defined using a JavaScript expression.

To enable/disable the output depending on whether a launch argument, environment variable,
or JVM -D option evaluates as truthy, use:

```yaml
  procOutWriteObjects: $=TenXEnv.get("myProcCmd")
```

To learn more see [TenXEnv.get](https://doc.log10x.com/api/js/#TenXEnv.get).


#### :material-menu-right-outline:**`procOutWriteTemplates`**

If true, write new TenXTemplates to this output.

|Type|Default|Category|
|---|---|---|
|String|false|Encoding|

Controls whether to write template values of TenXObjects passed to this output.
The output will only emit TenXTemplates that the pipeline did not load at startup via the[templateFile](https://doc.log10x.com/run/template/#templatefiles "input files or glob patterns containing JSON-encoded TenXTemplates") argument,
and will only emit an TenXTemplate once based on its [templateHash](https://doc.log10x.com/api/js/#TenXBaseObject+templateHash "An alphanumeric encoded value of a 64bit hash of the current object's template field.") value.


#### :material-menu-right-outline:**`procOutEncodeType`**

The output format in which to encode TenXObject values. Possible values:\[json, delimited\].

|Type|Default|Category|
|---|---|---|
|String|delimited|Encoding|

Specifies how to encode [procOutFields](https://doc.log10x.com/run/output/event/process/#procoutfields "list of TenXObject field names to encode") values to this output. Possible values:

- **json**: formats names and values for the current TenXObject as: {"field":"str","field2":1, "field3": true}
- **delimited**: formats values for the current TenXObject as: "str",1,true
  The [procOutEncodeDelimiter](https://doc.log10x.com/run/output/event/process/#procoutencodedelimiter "the delimiter placed between key and values pairs if 'procOutEncodeType' is 'delimited'") argument determines the separator to use.


#### :material-menu-right-outline:**`procOutEncodedLinePrefix`**

The line prefix prepended to the encoded event if 'procOutEncodeType' is 'delimited'.

|Type|Default|Category|
|---|---|---|
|String||Encoding|

Sets the char which is prepended to the emitted TenXObject field values when [procOutEncodeType](https://doc.log10x.com/run/output/event/process/#procoutencodetype "the output format in which to encode TenXObject values. Possible values:[json, delimited]") is `delimited`.


#### :material-menu-right-outline:**`procOutEncodeDelimiter`**

The delimiter placed between key and values pairs if 'procOutEncodeType' is 'delimited'.

|Type|Default|Category|
|---|---|---|
|String| |Encoding|

Sets the char delimiter to separate TenXObject field values when [procOutEncodeType](https://doc.log10x.com/run/output/event/process/#procoutencodetype "the output format in which to encode TenXObject values. Possible values:[json, delimited]") is `delimited`.


<br/>:material-github: This module is defined in [process/module.yaml](https://github.com/log-10x/modules/tree/main/pipelines/run/modules/output/event/process/module.yaml "process/module.yaml"){target="\_blank"}.

