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
Therefresh_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.
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 akind. 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.
-
The
policysection defines when and how rotation occurs. -
Trigger:
sizeRotates the log file when it reaches the configured size. -
Roller:
fixed_windowRenames archived files using a pattern with a sliding index.Example configuration:pattern: "/logs/output_{}.log"base: 1count: 4
output.logis renamed tooutput_1.logoutput_1.log→output_2.logoutput_2.log→output_3.logoutput_3.log→output_4.log- The previous
output_4.logis deleted
.gzto the pattern to enable compression of archived logs:
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 gbcount: 4
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.
file
The file appender writes logs to a file without rotation. The file grows indefinitely and may exhaust disk space. Use rolling_file instead.
filters
filters may be attached to any appender for additional message filtering. Here, threshold filter discards messages below the specified level.
Encoder (log format)
Each appender uses anencoder to format log entries. The default encoder kind is pattern:
Format specifiers
Example output
Loggers
Root logger
The root logger is the default logger. All log records not matched by a named logger are processed by it.Named loggers
Named loggers configure log levels for specific components. The logger name must match thetarget used in the node code.
Loggers form a hierarchy using
::. For example:
node;node::networkis a child ofnode.
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:Available logger targets
The following targets can be configured in theloggers section: