module Clacky::Logger

def console?

def console?
le ||= false

def debug(message, **context)

Log at DEBUG level.
def debug(message, **context)
  write_log(:debug, message, context)
end

def echo_to_console(level, line)

def echo_to_console(level, line)
 if LEVELS[level] < LEVELS[CONSOLE_MIN_LEVEL]
r.puts(line)
tandardError

def ensure_log_dir

def ensure_log_dir
ils.mkdir_p(LOG_DIR) unless Dir.exist?(LOG_DIR)

def error(message, **context)

Exception; its backtrace is appended automatically.
Log at ERROR level. Accepts an optional :error key that may be an
def error(message, **context)
  write_log(:error, message, context)
end

def format_line(time, level, message, context)

def format_line(time, level, message, context)
amp = time.strftime("%Y-%m-%dT%H:%M:%S.%3N%z")
    = level.to_s.upcase.ljust(5)
    = "[#{timestamp}] #{tag} #{message}"
text.empty?

pand exception objects for :error key
err = context[:error]).is_a?(Exception)
ntext = context.merge(
error:     "#{err.class}: #{err.message}",
backtrace: (err.backtrace || []).first(10).join(" | ")
s = context.map { |k, v| "#{k}=#{v.inspect}" }.join(" ")
ase} | #{pairs}"

def info(message, **context)

Log at INFO level.
def info(message, **context)
  write_log(:info, message, context)
end

def log_file_path(time)

def log_file_path(time)
oin(LOG_DIR, "clacky-#{time.strftime('%Y-%m-%d')}.log")

def prune_old_logs

Remove log files older than MAX_LOG_FILES days.
def prune_old_logs
 Dir.glob(File.join(LOG_DIR, "clacky-*.log")).sort
 = logs.length - MAX_LOG_FILES
irst(excess).each { |f| File.delete(f) } if excess > 0

def warn(message, **context)

Log at WARN level.
def warn(message, **context)
  write_log(:warn, message, context)
end

def write_log(level, message, context = {})

def write_log(level, message, context = {})
 Time.now
 format_line(now, level, message, context)
synchronize do
re_log_dir
.open(log_file_path(now), "a") { |f| f.puts(line) }
e_old_logs
_to_console(level, line) if console?
tandardError
r let logger errors crash the main process.