Module: Tempest::DebugLog

Defined in:
lib/tempest/debug_log.rb

Overview

Thin wrapper around stdlib Logger for opt-in debug logging.

Activated only when the TEMPEST_DEBUG_LOG environment variable points at a writable path. Otherwise from_env returns a Logger pointed at IO::NULL at FATAL level, so call sites can unconditionally call ‘info`/`debug`/`warn` without an `if logger` guard and without producing any output or file I/O.

Output format is ISO-8601 local time + level + progname tag + message, e.g.:

2026-05-17T10:30:42+09:00 INFO  [stream] reconnect attempt=2 cursor=nil

Constant Summary collapse

LEVELS =
{
  "DEBUG" => Logger::DEBUG,
  "INFO"  => Logger::INFO,
  "WARN"  => Logger::WARN,
  "ERROR" => Logger::ERROR,
  "FATAL" => Logger::FATAL,
}.freeze

Class Method Summary collapse

Class Method Details

.build_null_loggerObject



41
42
43
44
45
# File 'lib/tempest/debug_log.rb', line 41

def build_null_logger
  logger = Logger.new(IO::NULL)
  logger.level = Logger::FATAL
  logger
end

.formatterObject



47
48
49
50
51
52
# File 'lib/tempest/debug_log.rb', line 47

def formatter
  proc do |severity, time, progname, msg|
    tag = progname && !progname.to_s.empty? ? "[#{progname}] " : ""
    "#{time.iso8601} #{severity.ljust(5)} #{tag}#{msg}\n"
  end
end

.from_env(env) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/tempest/debug_log.rb', line 26

def from_env(env)
  raw = env["TEMPEST_DEBUG_LOG"]
  if raw.nil? || raw.empty?
    return build_null_logger
  end

  path = File.expand_path(raw)
  FileUtils.mkdir_p(File.dirname(path))

  logger = Logger.new(path, "daily")
  logger.level = resolve_level(env["TEMPEST_DEBUG_LOG_LEVEL"]) || Logger::INFO
  logger.formatter = formatter
  logger
end

.resolve_level(value) ⇒ Object



54
55
56
57
# File 'lib/tempest/debug_log.rb', line 54

def resolve_level(value)
  return nil if value.nil? || value.empty?
  LEVELS[value.to_s.upcase]
end