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
- 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.
- Patch/upgrade the gem to emit standard Console/Fluentd severity names.
- 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
- Wrap third-party Console-style loggers with a severity mapper before wiring them into Fluentd.
- Whitelist severities at your logging facade boundary; default unknown ones to 'info' rather than letting them leak through.
- Test gem log integration with syslog-style levels (notice, err) before shipping.
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.