Code for the Advent of Code event
aoc advent-of-code
at rust 54 lines 1.2 kB view raw
1# frozen_string_literal: true 2 3module AoC 4 # Include-able module to enable logging from modules and classes. 5 module Logging 6 # Get the {AoC::Logger} instance for the current object. 7 # @return [AoC::Logger] 8 def log 9 self.class.log 10 end 11 12 @out = $stderr 13 @level = Logger::INFO 14 @formatter = Ougai::Formatters::Readable.new 15 @loggers = {} 16 17 class << self 18 # @param value [IO] 19 attr_writer :out 20 21 attr_writer :formatter 22 23 def level=(level) 24 @level = level 25 @loggers.each_value { |l| l.level = level } 26 end 27 28 def logger_for(source) 29 name = source_to_name source 30 @loggers[name] ||= Logger.new(@out, progname: name, level: @level).tap do |l| 31 l.formatter = @formatter 32 end 33 end 34 35 def source_to_name(source) 36 if source.respond_to? :name 37 source.name 38 elsif source.is_a? String 39 source 40 else 41 source.to_s 42 end 43 end 44 45 def included(base) 46 class << base 47 def log 48 @log ||= Logging.logger_for self 49 end 50 end 51 end 52 end 53 end 54end