module Clacky::Logger
def console?
def console? le ||= false
def debug(message, **context)
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)
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)
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
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)
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.