Code for the Advent of Code event
aoc
advent-of-code
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