---
title: "Text File Scanner"
description: "scan text/binary files for symbol values using the Jackson library"
source: "https://github.com/log-10x/modules/tree/main/pipelines/compile/modules/scanner/text/module.yaml"
icon: "material/code-json"

---
Extracts [symbol](https://doc.log10x.com/run/transform/structure/#symbols) values from text/binary files using plain text tokenization or [Jackson](https://github.com/FasterXML/jackson){target="\_blank"} parsers.

Parses input by splitting lines with delimiters or using a [JsonFactory](https://fasterxml.github.io/jackson-core/javadoc/2.8/com/fasterxml/jackson/core/JsonFactory.html){target="\_blank"} for structured token reading.

When source code for a log format is unavailable (e.g., third-party services), scan a sample log to extract symbols for future parsing.

!!! note "Size limit"

    Files over 50KB are skipped to avoid slow parsing of machine-generated content.

## :material-wrench-outline: Config Files

To configure the Text file scanner 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: [text/jackson.yaml](https://github.dev/log-10x/config/blob/main/pipelines/compile/scanners/text/jackson.yaml "text/jackson.yaml"){target="\_blank"}.  
  
<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/compile/scanners/text/jackson.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-jackson.yaml0-edit-button" data-tooltip="Edit configuration file" data-dialog-id="jackson-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="jackson-yaml0-dialog" class="md-dialog md-dialog--editor">
    <div class="editor-dialog-wrapper">
        <div class="editor-dialog-header">
            <span class="editor-dialog-title">Edit jackson.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('jackson-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/compile/scanners/text/jackson.yaml"
                            data-copy-nix="/etc/log10x/config/compile/scanners/text/jackson.yaml"
                            data-copy-win="C:\log10x\configs/compile/scanners/text/jackson.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/compile/scanners/text/jackson.yaml">$TENX_CONFIG/compile/scanners/text/jackson.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/compile/scanners/text/jackson.yaml">./pipelines/compile/scanners/text/jackson.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">ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJ0ZW54IiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAidGV4dCIgOiB7CiAgICAgICJ0eXBlIiA6ICJhcnJheSIsCiAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgInR5cGUiIDogIm9iamVjdCIsCiAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAgICJwYXJzZXJOYW1lIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiUGFyc2VyIGxvZ2ljYWwgbmFtZVxuXG5EZWZpbmVzIGEgbG9naWNhbCB1bmlxdWUgbmFtZSBmb3IgdGhpcyBwYXJzZXIgKGUuZy4sICdsb2dzJykiCiAgICAgICAgICB9LAogICAgICAgICAgImZpbGVOYW1lRmlsdGVyIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiUGF0dGVybiB0byBtYXRjaCBmb3IgdGFyZ2V0IGlucHV0IGZpbGUgbmFtZVxuXG5EZWZpbmVzIGEgcmVnZXggcGF0dGVybiBhIGZpbGUgbXVzdCBtYXRjaCBhZ2FpbnN0IGZvciB0aGlzIHNjYW5uZXIgdG8gYXBwbHkgdG8gaXQuIgogICAgICAgICAgfSwKICAgICAgICAgICJwYXJzZXJGYWN0b3J5Q2xhc3MiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJQYXJzZXIgZmFjdG9yeSBjbGFzc1xuXG5Qcm92aWRlcyBhbiBvcHRpb25hbCBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIG5hbWUgZGVyaXZlZCBmcm9tIGEgW0pzb25GYWN0b3J5XShodHRwczovL2Zhc3RlcnhtbC5naXRodWIuaW8vamFja3Nvbi1jb3JlL2phdmFkb2MvMi42L2NvbS9mYXN0ZXJ4bWwvamFja3Nvbi9jb3JlL0pzb25GYWN0b3J5Lmh0bWwpLiAgSWYgc3BlY2lmaWVkLCB0aGUgc2Nhbm5lciBpbnN0YW50aWF0ZXMgdGhlIGZhY3RvcnkgdXNpbmcgYSBwYXJhbWV0ZXJsZXNzIGNvbnN0cnVjdG9yICBhbmQgaW52b2tlcyBpdHMgW2NyZWF0ZVBhcnNlcl0oaHR0cHM6Ly9mYXN0ZXJ4bWwuZ2l0aHViLmlvL2phY2tzb24tY29yZS9qYXZhZG9jLzIuNi9jb20vZmFzdGVyeG1sL2phY2tzb24vY29yZS9Kc29uRmFjdG9yeS5odG1sI2NyZWF0ZVBhcnNlcihqYXZhLmlvLklucHV0U3RyZWFtKSkgbWV0aG9kIHRvIGdlbmVyYXRlIGEgcGFyc2VyIGluc3RhbmNlLiBUaGUgc2Nhbm5lciB1c2VzIHRoZSBwYXJzZXIgdG8gcmVhZCB0b2tlbiB2YWx1ZXMgZnJvbSB0aGUgZmlsZS4gIGlmICd0ZXh0UGFyc2VyRmFjdG9yeUFyZ3MnIGlzIHNwZWNpZmllZCwgYSBjb25zdHJ1Y3RvciByZWNlaXZpbmcgYSBzdHJpbmdbXSBtdXN0ICBiZSBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MgdG8gcmVjZWl2ZSBvcHRpb25hbCBjb25maWcgcGFyYW1ldGVycyIKICAgICAgICAgIH0sCiAgICAgICAgICAicGFyc2VyRmFjdG9yeUFyZ3MiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkFyZ3VtZW50cyBmb3IgJ3RleHRQYXJzZXJGYWN0b3J5JyBjdG9yXG5cblNwZWNpZmllcyBhcmd1bWVudHMgdG8gcGFzcyB0byB0aGUgcGFyc2VyIGZhY3RvcnkgaW5zdGFuY2UgY29uc3RydWN0b3IuIFRoaXMgb3B0aW9uIG9ubHkgYXBwbGllcyBpZiAndGV4dFBhcnNlckZhY3RvcnlDbGFzcycgaXMgc2V0LiIsCiAgICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogInN0cmluZyIKICAgICAgICAgICAgfQogICAgICAgICAgfSwKICAgICAgICAgICJzY2FuRmllbGRWYWx1ZXMiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiQ29udHJvbHMgd2hldGhlciB0byBjYXB0dXJlIEphY2tzb24gcGFyc2VyIGZpZWxkIHZhbHVlc1xuXG5Db250cm9scyB3aGV0aGVyIHRvIGNhcHR1cmUgYSBKYWNrc29uIHBhcnNlcidzIFtWQUxVRV9TVFJJTkddKGh0dHBzOi8vZmFzdGVyeG1sLmdpdGh1Yi5pby9qYWNrc29uLWNvcmUvamF2YWRvYy8yLjgvY29tL2Zhc3RlcnhtbC9qYWNrc29uL2NvcmUvSnNvblRva2VuLmh0bWwjVkFMVUVfU1RSSU5HKSB0b2tlbnMgYXJlIHNjYW5uZWQgZm9yIGVudHJpZXMgb3IganVzdCB2YWx1ZXMgb2YgW0ZJRUxEX05BTUVdKGh0dHBzOi8vZmFzdGVyeG1sLmdpdGh1Yi5pby9qYWNrc29uLWNvcmUvamF2YWRvYy8yLjgvY29tL2Zhc3RlcnhtbC9qYWNrc29uL2NvcmUvSnNvblRva2VuLmh0bWwjRklFTERfTkFNRSkgdG9rZW5zLiAgICBUaGlzIG9wdGlvbiBvbmx5IGFwcGxpZXMgaWYgJ3RleHRQYXJzZXJGYWN0b3J5Q2xhc3MnIGlzIHNldC4gKEFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgIm1heExpbmVzIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICJzdHJpbmciLAogICAgICAgICAgICAgICJudWxsIgogICAgICAgICAgICBdLAogICAgICAgICAgICAibWFya2Rvd25EZXNjcmlwdGlvbiIgOiAiTWF4IG51bWJlciBvZiBsaW5lcyB0byBzY2FuXG5cbkNvbnRyb2xzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0byBzY2FuIGZvciBzeW1ib2wgdmFsdWVzIGZyb20gdGhlIGlucHV0IGZpbGUuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1bCB3aGVuIHNjYW5uaW5nIGV4aXN0aW5nIGxvZyBmaWxlcyBhcyAndGVtcGxhdGVzJyBmb3IgcGFyc2luZyBmdXR1cmUgbG9ncyBmcm9tIGEgc2ltaWxhciBpbnB1dCBzdHJlYW0uIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImxpbmVPZmZzZXQiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJMaW5lIG51bWJlciBmcm9tIHdoaWNoIHRvIHN0YXJ0IHNjYW5cblxuU3BlY2lmaWVzIHRoZSBsaW5lIG51bWJlciBmcm9tIHdoaWNoIHRvIHN0YXJ0IHNjYW5uaW5nIGZvciBzeW1ib2xzLiBUaGlzIG9wdGlvbiBpcyB1c2VmdWwgd2hlbiBzY2FubmluZyBhIHNwZWNpZmljIHBvcnRpb24gb2YgYSB0ZXh0IGZpbGUuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgImFsbG93RGlnaXRzIiA6IHsKICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICJib29sZWFuIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkNvbnRyb2xzIHdoZXRoZXIgdG8gY2FwdHVyZSB0b2tlbnMgY29udGFpbmluZyBudW1lcmljIGFzIHN5bWJvbCB0b2tlbnNcblxuQ29udHJvbHMgd2hldGhlciB0b2tlbnMgY29udGFpbiBudW1lcmljIGNoYXJzIChlLmcuLCAwLTkpIGFyZSBhY2NlcHRlZCBhcyBzeW1ib2wgdG9rZW5zLiBBcyBhbHBoYW51bWVyaWMgY29tYmluYXRpb25zIHRlbmQgdG8gaGF2ZSBoaWdoIGNhcmRpbmFsaXR5IChlLmcuLCBHVUlELCB0cmFjZV9pZCksIGl0IGlzIG5vdCBnZW5lcmFsbHkgYWR2aXNlZCAgdG8gYWRkIHRoZW0gdG8gc3ltYm9sIHVuaXRzIHVubGVzcyBzcGVjaWZpY2FsbHkga25vd24gdG8gYmUgJ2NvbnN0YW50JyAvIGxvdyBjYXJkaW5hbGl0eSB2YWx1ZXMgKEFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9LAogICAgICAgICAgIm1pbkxlbmd0aCIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAibnVtYmVyIiwKICAgICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgXSwKICAgICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIk1pbiBjaGFyYWN0ZXIgbGVuZ3RoIGZvciBhIHRva2VuIHRvIGJlIGNvbnNpZGVyZWQgYSBzeW1ib2wgdmFsdWVcblxuU2V0cyB0aGUgbWluaW1hbCBjaGFyYWN0ZXIgbGVuZ3RoIGEgdG9rZW4gbXVzdCBoYXZlIHRvIGNvbnN0aXR1dGUgYSBzeW1ib2wgdmFsdWUuIFZlcnkgc2hvcnQgdG9rZW5zIChlLmcuLCBsZW4gPCAzKSBoYXZlIGEgaGlnaCBwcm9iYWJpbGl0eSBvZiBiZWluZyBkeW5hbWljIHZhbHVlcyB3aXRoIGhpZ2ggY2FyZGluYWxpdHkgYW5kLCBhcyBzdWNoLCBzaG91bGQgbm90ICBiZSBjYXB0dXJlZCBhcyBzeW1ib2wgdmFsdWVzLiAoQWNjZXB0cyBudW1iZXIgb3Igc3RyaW5nIHdpdGggJD0gcHJlZml4IGZvciBydW50aW1lIGV2YWx1YXRpb24pIgogICAgICAgICAgfSwKICAgICAgICAgICJtYXhMZW5ndGgiIDogewogICAgICAgICAgICAidHlwZSIgOiBbCiAgICAgICAgICAgICAgIm51bWJlciIsCiAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJNYXggY2hhcmFjdGVyIGxlbmd0aCBmb3IgYSB0b2tlbiB0byBiZSBjb25zaWRlcmVkIGEgc3ltYm9sIHZhbHVlXG5cblNldHMgdGhlIG1heGltdW0gY2hhcmFjdGVyIGxlbmd0aCBhIHRva2VuIG11c3QgaGF2ZSB0byBjb25zdGl0dXRlIGEgc3ltYm9sIHZhbHVlLiBWZXJ5IGxvbmcgdG9rZW5zIChlLmcuLCBsZW4gPiAxMDApIGhhdmUgYSBoaWdoIHByb2JhYmlsaXR5IG9mIGJlaW5nIGR5bmFtaWMgdmFsdWVzIHdpdGggaGlnaCBjYXJkaW5hbGl0eSBhbmQsIGFzIHN1Y2gsIHNob3VsZCBub3QgIGJlIGNhcHR1cmVkIGFzIHN5bWJvbCB2YWx1ZXMuIChBY2NlcHRzIG51bWJlciBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICAicmVxdWlyZWQiIDogWwogICAgICAgICAgInBhcnNlck5hbWUiLAogICAgICAgICAgImZpbGVOYW1lRmlsdGVyIgogICAgICAgIF0KICAgICAgfQogICAgfQogIH0sCiAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlCn0=</template>

```yaml
# 🔟❎ 'compile' text symbol scanner configuration

# The 'text' scanner parses text files for symbol values. It utilizes
# the Jackson parser library to parse any text/binary format it supports.
# This includes formats such json, yaml, xml, ini, protobuf and more.

# The configuration below is added by default to the 10x 'compile' pipeline.
# Even so, if another text scanner is defined via the 'textScanners' options group
# whose 'fileNameFilter' matches that of the current target input file,
# it will take precedence over the text scanners defined below.
# To learn more about text scanner options below, see:
# https://doc.log10x.com/compile/scanner/text

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

# =============================== Text Options ================================

text:

  - parserName: text
    fileNameFilter: '^.*\.(csv|txt|properties|csv|tsv|ini|conf|sh|log|out)$'
    maxLines: 500
    lineOffset: 0
    allowDigits: false
    minLength: 2
    maxLength: 50

  - parserName: json
    fileNameFilter: '^.*\.(json)$'
    parserFactoryClass: com.fasterxml.jackson.core.JsonFactory
    scanFieldValues: true

  - parserName: yaml
    fileNameFilter: '^.*\.(yml|yaml)$'
    parserFactoryClass: com.log10x.eng.scanner.text.TextYamlFactory
    scanFieldValues: true

  - parserName: xml
    fileNameFilter: '^.*\.(xml|xsd)$'
    parserFactoryClass: com.fasterxml.jackson.dataformat.xml.XmlFactory
    scanFieldValues: true
```

## :material-menu: Options

Specify the options below to [configure](/config "configure") multiple Text file scanner:

|Name|Description|Category|
|---|---|---|
|[textParserName](#textparsername "parser logical name")|Parser logical name|General|
|[textFileNameFilter](#textfilenamefilter "pattern to match for target input file name")|Pattern to match for target input file name|General|
|[textParserFactoryClass](#textparserfactoryclass "parser factory class")|Parser factory class|Parser|
|[textParserFactoryArgs](#textparserfactoryargs "arguments for 'textParserFactory' ctor")|Arguments for 'textParserFactory' ctor|Parser|
|[textScanFieldValues](#textscanfieldvalues "controls whether to capture Jackson parser field values")|Controls whether to capture Jackson parser field values|Parser|
|[textMaxLines](#textmaxlines "max number of lines to scan")|Max number of lines to scan|Text|
|[textLineOffset](#textlineoffset "line number from which to start scan")|Line number from which to start scan|Text|
|[textAllowDigits](#textallowdigits "controls whether to capture tokens containing numeric as symbol tokens")|Controls whether to capture tokens containing numeric as symbol tokens|Text|
|[textMinLength](#textminlength "min character length for a token to be considered a symbol value")|Min character length for a token to be considered a symbol value|Text|
|[textMaxLength](#textmaxlength "max character length for a token to be considered a symbol value")|Max character length for a token to be considered a symbol value|Text|

### General

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

Parser logical name.

|Type|Required|Category|
|---|---|---|
|String|✔|General|

Defines a logical unique name for this parser (e.g., 'logs').


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

Pattern to match for target input file name.

|Type|Required|Category|
|---|---|---|
|String|✔|General|

Defines a regex pattern a file must match against for this scanner to apply to it.


### Parser

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

Parser factory class.

|Type|Default|Category|
|---|---|---|
|String|""|Parser|

Provides an optional fully qualified name of a class name derived from a
[JsonFactory](https://fasterxml.github.io/jackson-core/javadoc/2.6/com/fasterxml/jackson/core/JsonFactory.html){target="\_blank"}.

If specified, the scanner instantiates the factory using a parameterless constructor
and invokes its [createParser](<https://fasterxml.github.io/jackson-core/javadoc/2.6/com/fasterxml/jackson/core/JsonFactory.html#createParser(java.io.InputStream)>){target="\_blank"}
method to generate a parser instance. The scanner uses the parser to read token values from the file.

if 'textParserFactoryArgs' is specified, a constructor receiving a string\[\] must
be defined by this class to receive optional config parameters.


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

Arguments for 'textParserFactory' ctor.

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

Specifies arguments to pass to the parser factory instance constructor.
This option only applies if 'textParserFactoryClass' is set.


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

Controls whether to capture Jackson parser field values.

|Type|Default|Category|
|---|---|---|
|Boolean|false|Parser|

Controls whether to capture a Jackson parser's [VALUE\_STRING](https://fasterxml.github.io/jackson-core/javadoc/2.8/com/fasterxml/jackson/core/JsonToken.html#VALUE_STRING){target="\_blank"} tokens are scanned for entries
or just values of [FIELD\_NAME](https://fasterxml.github.io/jackson-core/javadoc/2.8/com/fasterxml/jackson/core/JsonToken.html#FIELD_NAME){target="\_blank"} tokens.

This option only applies if 'textParserFactoryClass' is set.


### Text

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

Max number of lines to scan.

|Type|Default|Category|
|---|---|---|
|Number|0|Text|

Controls the maximum number of lines to scan for symbol values from the input file.
This option is useful when scanning existing log files as 'templates' for parsing future logs
from a similar input stream.


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

Line number from which to start scan.

|Type|Default|Category|
|---|---|---|
|Number|0|Text|

Specifies the line number from which to start scanning for symbols.
This option is useful when scanning a specific portion of a text file.


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

Controls whether to capture tokens containing numeric as symbol tokens.

|Type|Default|Category|
|---|---|---|
|Boolean|false|Text|

Controls whether tokens contain numeric chars (e.g., 0-9)
are accepted as symbol tokens. As alphanumeric combinations tend to have
high cardinality (e.g., GUID, trace\_id), it is not generally advised
to add them to symbol units unless specifically known to be 'constant' / low cardinality values.


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

Min character length for a token to be considered a symbol value.

|Type|Default|Category|
|---|---|---|
|Number|0|Text|

Sets the minimal character length a token must have to constitute a symbol value.
Very short tokens (e.g., len \< 3) have a high probability
of being dynamic values with high cardinality and, as such, should not
be captured as symbol values.


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

Max character length for a token to be considered a symbol value.

|Type|Default|Category|
|---|---|---|
|Number|0|Text|

Sets the maximum character length a token must have to constitute a symbol value.
Very long tokens (e.g., len \> 100) have a high probability
of being dynamic values with high cardinality and, as such, should not
be captured as symbol values.


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

