Class: Familia::LogFormatter

Inherits:
Logger::Formatter
  • Object
show all
Defined in:
lib/familia/logging.rb

Overview

Note:

When used with FamiliaLogger, checks Fiber[:familia_trace_mode] to distinguish TRACE from DEBUG. When used with standard Logger, treats level 0 as TRACE since DEBUG and TRACE share the same numeric level.

Custom formatter for Familia logger output.

LogFormatter produces structured log output with severity letters, timestamps, process/thread/fiber IDs, and the log message.

Output format: SEVERITY, MM-DD HH:MM:SS.mmm pid:PID [THREAD_ID/FIBER_ID]: MESSAGE

Severity letters: T = TRACE (when Fiber[:familia_trace_mode] is set, or level 0 when not using FamiliaLogger) D = DEBUG I = INFO W = WARN E = ERROR F = FATAL U = UNKNOWN

Examples:

Output

I, 10-05 20:43:09.843 pid:12345 [67890/54321]: Connection established
T, 10-05 20:43:10.123 pid:12345 [67890/54321]: [LOAD] redis -> user:123

Use with FamiliaLogger for TRACE support

logger = Familia::FamiliaLogger.new($stderr)
logger.formatter = Familia::LogFormatter.new
logger.trace("Trace message")  # => T, ...
logger.debug("Debug message")  # => D, ...

Use with standard Logger (level 0 becomes 'T')

logger = Logger.new($stderr)
logger.formatter = Familia::LogFormatter.new
logger.debug("Debug message")  # => T, ... (because DEBUG=0)

See Also:

Constant Summary collapse

SEVERITY_LETTERS =

Severity string to letter mapping.

Maps severity string labels to single-letter codes for compact output. Note: TRACE is handled via Fiber check in #call for FamiliaLogger.

{
  'DEBUG' => 'D',
  'INFO' => 'I',
  'WARN' => 'W',
  'ERROR' => 'E',
  'FATAL' => 'F',
  'UNKNOWN' => 'U',
  'ANY' => 'T', # ANY is Logger's label for severity < 0, treat as TRACE
}.freeze

Instance Method Summary collapse

Instance Method Details

#call(severity, datetime, _progname, msg) ⇒ String

Format a log message with severity, timestamp, and context.

Examples:

formatter = Familia::LogFormatter.new
formatter.call("INFO", Time.now, nil, "Test message")
# => "I, 10-05 20:43:09.843 pid:12345 [67890/54321]: Test message\n"

Parameters:

  • severity (String)

    Severity label (e.g., "INFO", "DEBUG", "UNKNOWN")

  • datetime (Time)

    Timestamp of the log message

  • _progname (String)

    Program name (unused, kept for Logger compatibility)

  • msg (String)

    The log message

Returns:

  • (String)

    Formatted log line with newline



138
139
140
141
142
143
144
145
146
147
148
149
150
# File 'lib/familia/logging.rb', line 138

def call(severity, datetime, _progname, msg)
  # Check if we're in trace mode (TRACE uses same level as DEBUG but marks itself)
  # FamiliaLogger sets Fiber[:familia_trace_mode] when trace() is called
  severity_letter = if Fiber[:familia_trace_mode]
    'T'
  else
    SEVERITY_LETTERS.fetch(severity, severity[0])
  end

  utc_datetime = datetime.utc.strftime('%H:%M:%S.%3N')

  "#{severity_letter}, #{utc_datetime} #{msg}\n"
end