fluent/fluentd · warning

Unknown severity: #{severity}

Error message

Unknown severity: #{severity}

What it means

Fluent::Plugin::ConsoleAdapter (lib/fluent/log/console_adapter.rb) bridges Console-style logger calls from embedded gems into Fluentd's log. When a caller invokes it with a severity: that is not one of the recognized level names (LEVEL_TEXT: trace/debug/info/warn/error/fatal), it warns, downgrades the message to 'warn', and still logs it via @logger.send('warn', ...).

Source

Thrown at lib/fluent/log/console_adapter.rb:55

        @logger = logger
        # When `verbose` is `true`, following items will be added as a prefix or
        # suffix of the subject:
        #   * Severity
        #   * Object ID
        #   * PID
        #   * Time
        # Severity and Time are added by Fluentd::Log too so they are redundant.
        # PID is the worker's PID so it's also redundant.
        # Object ID will be too verbose in usual cases.
        # So set it as `false` here to suppress redundant items.
        super(StringIO.new, verbose: false)
      end

      def call(subject = nil, *arguments, name: nil, severity: 'info', **options, &block)
        if LEVEL_TEXT.include?(severity.to_s)
          level = severity
        else
          @logger.warn("Unknown severity: #{severity}")
          level = 'warn'
        end

        @stream.seek(0)
        @stream.truncate(0)
        super
        @logger.send(level, @stream.string.chomp)
      end
    end
  end
end

View on GitHub (pinned to dd45c6e18d)

Solutions

  1. Map the offending gem's severity names to Fluentd levels (notice→info, err/error→error, warning→warn, etc.) at the adapter boundary or via a wrapper logger.
  2. Patch/upgrade the gem to emit standard Console/Fluentd severity names.
  3. Contribute an upstream translation table to Fluentd's ConsoleAdapter for syslog-style severities.

Example fix

# before (gem emits a syslog-style severity; adapter warns and downgrades to warn)
ConsoleAdapter.call('worker', severity: :notice)

# after (normalize severity before it reaches the adapter)
SEVERITY_MAP = { notice: 'info', warning: 'warn', err: 'error', critical: 'error', emergency: 'fatal' }.freeze
sev = SEVERITY_MAP[raw_severity] || raw_severity
ConsoleAdapter.call('worker', severity: sev)
Defensive patterns

Strategy: validation

Validate before calling

FLUENT_SEVERITIES = %w[trace debug info warn error fatal].freeze
sev = 'notice'
sev = { 'notice' => 'info', 'warning' => 'warn', 'err' => 'error' }[sev] || sev unless FLUENT_SEVERITIES.include?(sev)
ConsoleAdapter.call('component', severity: sev)

Type guard

FLUENT_SEVERITIES.include?(severity.to_s) # true => safe to pass severity through unchanged

Prevention

When it happens

Trigger: A gem routing its logging through the Console adapter passes a syslog-style severity such as :warning, :notice, :err, :critical, or :emergency, or a typo'd/nil severity string, none of which match LEVEL_TEXT.

Common situations: Bundling gems (async libraries, HTTP server helpers) whose Console logger uses syslog level names; custom plugins copying console-gem idioms into Fluentd helpers.

Related errors


AI-assisted analysis of fluent/fluentd@dd45c6e18d (2026-08-21). Data as JSON: /api/errors/b0273d1f44adaa0c. Report an issue: GitHub.