Skip to main content
The TON node uses the log4rs framework for logging. Logging is configured using a YAML file specified in the log_config_name field of the node configuration. In the Helm chart, this file is mounted at /main/logs.config.yml. A default configuration is bundled with the chart at files/logs.config.yml and is used if no custom configuration is provided. It can be overridden in one of the following ways:
  • inline in values.yaml;
  • from local file --set-file logsConfig=path;
  • by referencing an existing ConfigMap.

Hot reload

The refresh_rate field instructs log4rs to periodically re-read the configuration file. This allows log levels to be changed without restarting the node – updates are applied within the specified interval.
refresh_rate: 30 seconds
Supported units: seconds, minutes, hours. If the field is omitted, the config is read only once at startup. This feature can be used during production debugging: temporarily increase a logger’s level to debug, observe the output, then restore the original level without restarting the node.

Appenders

Appenders define where logs are written. Each appender has a unique name, the YAML key, and a kind. Three kinds are supported: rolling_file, console, and file. A TON node can generate a large volume of logs, especially during synchronization, elections, and catch-up. Appender configuration and log levels should be selected accordingly.

rolling_file

The rolling_file appender is the default and recommended option for production. It writes logs to a file with automatic size-based rotation. The chart creates a dedicated logs PersistentVolumeClaim for this appender, ensuring logs remain available locally. Rotation prevents uncontrolled disk usage.
appenders:
  rolling_logfile:
    kind: rolling_file
    path: /logs/output.log
    encoder:
      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} {l} [{t}] {I}: {m}{n}"
    policy:
      kind: compound
      trigger:
        kind: size
        limit: 25 gb
      roller:
        kind: fixed_window
        pattern: '/logs/output_{}.log'
        base: 1
        count: 4
  • The policy section defines when and how rotation occurs.
  • Trigger: size Rotates the log file when it reaches the configured size.
    FieldDescription
    limitMaximum file size. Supported suffixes: b, kb, mb, gb, tb; e.g. 25 gb.
  • Roller: fixed_window Renames archived files using a pattern with a sliding index.
    FieldRequiredDescription
    patternyesArchive filename template. {} is replaced by the index. Append .gz to compress archives.
    baseno; default 0Starting index
    countyesMaximum number of archive files
    Example configuration:
    • pattern: "/logs/output_{}.log"
    • base: 1
    • count: 4
    On rotation:
    1. output.log is renamed to output_1.log
    2. output_1.logoutput_2.log
    3. output_2.logoutput_3.log
    4. output_3.logoutput_4.log
    5. The previous output_4.log is deleted
    Add .gz to the pattern to enable compression of archived logs:
    pattern: '/logs/output_{}.log.gz'
    
Storage sizing: The Helm value storage.logs.size defines the size of the PVC mounted at /logs. Rotation settings must fit within this limit. Example of default configuration:
  • limit: 25 gb
  • count: 4
Maximum disk usage is 1 active file + 4 archived files = 5 × 25 GB = 125 GB The default storage.logs.size is 150Gi (~161 GB), providing headroom. If rotation limits are reduced, for example, 1 GB × 10 archives with .gz compression, actual disk usage is lower, allowing a smaller volume size.

console

The console appender writes logs to stdout or stderr. It is suitable when the cluster uses a log collection stack such as Loki, Fluentd, or Elasticsearch, and log storage is handled externally. At debug or trace levels, log volume can be high and may overload the collector. Log levels should be configured accordingly. When using console-only logging, disable the logs volume by setting storage.logs.enabled to false.
appenders:
  stdout:
    kind: console
    target: stdout          # or "stderr"
    encoder:
      pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} {l} [{t}] {I}: {m}{n}"

file

The file appender writes logs to a file without rotation. The file grows indefinitely and may exhaust disk space. Use rolling_file instead.
appenders:
  logfile:
    kind: file
    path: /logs/output.log
    append: true            # default: true
    encoder:
      pattern: "..."

filters

filters may be attached to any appender for additional message filtering. Here, threshold filter discards messages below the specified level.
appenders:
  stdout:
    kind: console
    filters:
      - kind: threshold
        level: warn
    encoder:
      pattern: "..."

Encoder (log format)

Each appender uses an encoder to format log entries. The default encoder kind is pattern:
encoder:
  pattern: "{d(%Y-%m-%d %H:%M:%S.%f)} {l} [{t}] {I}: {m}{n}"

Format specifiers

SpecifierNameDescription
{d} / {d(fmt)}dateTimestamp. Default format is ISO 8601. Custom format uses chrono syntax: {d(%Y-%m-%d %H:%M:%S.%f)}.
{l}levelLog levels: error, warn, info, debug, trace
{m}messageLog message body
{n}newlinePlatform-dependent newline
{t}targetLogger target; module name or explicit target: in the log macro.
{I}thread_idNumeric thread ID
{T}threadThread name
{f}fileSource file name
{L}lineSource line number
{M}moduleModule path
{P}pidProcess ID
{h(..)}highlightColorizes enclosed text by log levels; applies to console output only.

Example output

2025-01-15 14:30:45.123456 INFO [validator] 140234567890: Block validated successfully

Loggers

Root logger

The root logger is the default logger. All log records not matched by a named logger are processed by it.
root:
  level: error
  appenders:
    - rolling_logfile
FieldRequiredDescription
levelyesLog level: off, error, warn, info, debug, trace.
appendersyesList of appender names defined in the appenders section.

Named loggers

Named loggers configure log levels for specific components. The logger name must match the target used in the node code.
loggers:
  validator:
    level: info
FieldRequiredDefaultDescription
levelnoinherited from parentLog level
appendersno[]Appenders assigned to this logger.
additivenotrueIf true, messages also propagate to the parent logger appenders (root).
Loggers form a hierarchy using ::. For example:
  • node;
  • node::network is a child of node.
If additive: true, messages logged by node::network are written to:
  • the appenders configured for node::network;
  • the appenders of node;
  • the appenders of the root logger.

Log levels

Ordered from most to least verbose:
LevelDescription
traceMost detailed level. Used for execution flow tracing.
debugDebug information.
infoInformational messages about normal operation.
warnIndication of a potential problem.
errorErrors that don’t stop the node.
offLogging disabled.

Available logger targets

The following targets can be configured in the loggers section:
TargetDescription
nodeCore node messages
bootNode bootstrap and initialization
syncBlock synchronization
node::networkNode networking
node::network::neighboursNeighbor tracking (high log volume)
node::network::liteserverLiteserver request handling
node::validator::collatorBlock collation
adnlADNL network protocol
adnl_queryADNL query processing
overlayOverlay networks
overlay_broadcastOverlay broadcast messages
rldpRLDP protocol (reliable large datagrams)
dhtDistributed hash table
blockBlock structure and config parsing
executorTransaction execution
tvmTON Virtual Machine
validatorValidation (general)
validator_managerValidator management
validate_queryBlock and query validation
validate_rejectRejected block and query validation
catchainCatchain consensus protocol
catchain_adnl_overlayADNL overlay for catchain
catchain_networkCatchain network transport
validator_sessionValidator sessions
consensus_commonShared consensus logic
storageData storage
indexData indexing
ext_messagesExternal message handling
telemetryTelemetry and metrics