nexus_semantic_logger

Configures a semantic_logger as required for NexusMods components.

Telemetry

As well as providing a semantic logger, this gem handles datadog telemetry associated with the logging approach:

  • logs
  • traces
  • metrics
    • statsd is automatically attached to datadog runtime metrics and may also be used for custom metrics.

Customise log level per logger

For example, to show debug logging for MySubscriber while having all other logs on info.

# The log level must be set to the lowest level which can be dynamically controlled.
LOG_LEVEL=DEBUG
# The default level for filtered logs.
LOG_NAMES_DEFAULT_LEVEL=INFO
# Per level overrides for filtered logs.
LOG_NAMES_DEBUG=MySubscriber
  • Customised log names are available for each level e.g. LOG_NAMES_TRACE
  • Log names are matched on prefix.
  • Multiple log names are supported via comma separated values.

Changing log level dynamically

The default level for filtered logs (LOG_NAMES_DEFAULT_LEVEL) may be changed on a running instance with the WINCH signal. This cycles through the available levels [trace debug info warn error fatal].

Note that you cannot dynamically enable a level lower than the LOG_LEVEL. Instead the env var must be adjusted and the instance restarted.

Send signal: pkill --signal WINCH --count --full "^puma.*"

Instance output: WINCH signal changed LOG_NAMES_DEFAULT_LEVEL from debug to info

Querying current log level

The SYS signal will print the levels used by the running instance.

Send signal: pkill --signal SYS --count --full "^puma.*"

Instance output: SYS signal reports LOG_LEVEL=debug LOG_NAMES_DEFAULT_LEVEL=warn

Sending metrics

Ensure the metric name is in the format: nexus.{component}.{major}.{minor}

Where major and minor are specific to the component logic e.g. nexus.uploads.clamscan.pass

For example, to increment a count:

NexusSemanticLogger.metrics.increment('nexus.users.registration.complete')

Local gem development

Steps to run this gem from local sources in one the nexus 'staged build' rails components:

Copy gem sources to component

cd ~/legacy/users
cp -r ../nexus_semantic_logger .

Adjust component Dockerfile to include gem sources

Within stage 1, append a COPY after the Gemfile copy:

COPY --chown=nexus:nexus Gemfile* ./
COPY --chown=nexus:nexus nexus_semantic_logger/ ./nexus_semantic_logger/

Within stage 2, append a COPY after the bundle copy:

COPY --from=stage1 /usr/local/bundle /usr/local/bundle
COPY --from=stage1 /app/nexus_semantic_logger/ /app/nexus_semantic_logger/

Adjust Gemfile to use local path

gem 'nexus_semantic_logger', :path => "/app/nexus_semantic_logger"