Class: PaulBunyan::LogRelayer

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Includes:
Logger::Severity
Defined in:
lib/paul_bunyan/log_relayer.rb

Constant Summary collapse

DELEGATED_METHODS =

delegate non-relayed methods to the primary logger

%i(
  progname        progname=
  level           level=
  sev_threshold   sev_threshold=

  formatter       formatter=
  datetime_format datetime_format=

  close

  debug? info? warn? error? fatal?
)

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLogRelayer

Returns a new instance of LogRelayer.



49
50
51
# File 'lib/paul_bunyan/log_relayer.rb', line 49

def initialize
  @loggers = []
end

Instance Attribute Details

#loggersObject (readonly)

Returns the value of attribute loggers.



25
26
27
# File 'lib/paul_bunyan/log_relayer.rb', line 25

def loggers
  @loggers
end

Instance Method Details

#<<(msg) ⇒ Object



61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/paul_bunyan/log_relayer.rb', line 61

def <<(msg)
  loggers.reduce(nil) do |memo, logger|
    n = logger << msg

    # this would be simpler with an array, but would generate unnecessary garbage
    if memo.nil? || n.nil?
      memo || n
    else
      memo < n ? memo : n
    end
  end
end

#add(severity, message = nil, progname = nil, &block) ⇒ Object Also known as: log



53
54
55
56
57
58
# File 'lib/paul_bunyan/log_relayer.rb', line 53

def add(severity, message = nil, progname = nil, &block)
  block = memoized_block(&block) if block
  loggers.reduce(true) do |memo, logger|
    logger.add(severity, message, progname, &block) && memo
  end
end

#add_logger(logger) ⇒ Object



35
36
37
38
39
40
41
42
43
# File 'lib/paul_bunyan/log_relayer.rb', line 35

def add_logger(logger)
  loggers.push(logger)

  # Appease rails checking if logger already writes to stdout
  if loggers.length == 1
    @logdev = loggers[0].instance_variable_get(:@logdev)
  end
  logger
end

#add_metadata(metadata = {}, **kw_metadata) ⇒ Object



148
149
150
# File 'lib/paul_bunyan/log_relayer.rb', line 148

def ( = {}, **)
  messaging_loggers(:add_metadata, , **)
end

#clear_metadata!Object



152
153
154
# File 'lib/paul_bunyan/log_relayer.rb', line 152

def clear_metadata!
  messaging_loggers(:clear_metadata!)
end

#clear_tags!Object



133
134
135
# File 'lib/paul_bunyan/log_relayer.rb', line 133

def clear_tags!
  messaging_loggers(:clear_tags!)
end

#current_metadataObject



156
157
158
159
160
161
162
163
164
# File 'lib/paul_bunyan/log_relayer.rb', line 156

def 
  loggers.inject({}) do |agg, logger|
    if logger.respond_to?(:current_metadata)
      agg.merge(logger.)
    else
      agg
    end
  end
end

#current_tagsObject



116
117
118
119
120
121
# File 'lib/paul_bunyan/log_relayer.rb', line 116

def current_tags
  tags = loggers.each_with_object(Set.new) do |logger, set|
    set.merge(logger.current_tags) if logger.respond_to?(:current_tags)
  end
  tags.to_a
end

#debug(progname = nil, &block) ⇒ Object



74
75
76
# File 'lib/paul_bunyan/log_relayer.rb', line 74

def debug(progname = nil, &block)
  add(DEBUG, nil, progname, &block)
end

#error(progname = nil, &block) ⇒ Object



86
87
88
# File 'lib/paul_bunyan/log_relayer.rb', line 86

def error(progname = nil, &block)
  add(ERROR, nil, progname, &block)
end

#fatal(progname = nil, &block) ⇒ Object



90
91
92
# File 'lib/paul_bunyan/log_relayer.rb', line 90

def fatal(progname = nil, &block)
  add(FATAL, nil, progname, &block)
end

#flushObject



137
138
139
# File 'lib/paul_bunyan/log_relayer.rb', line 137

def flush
  messaging_loggers(:flush)
end

#info(progname = nil, &block) ⇒ Object



78
79
80
# File 'lib/paul_bunyan/log_relayer.rb', line 78

def info(progname = nil, &block)
  add(INFO, nil, progname, &block)
end

#levelObject



98
99
100
101
# File 'lib/paul_bunyan/log_relayer.rb', line 98

def level
  logger = loggers.min { |a, b| a.level <=> b.level }
  logger.nil? ? DEBUG : logger.level
end

#pop_tags(size = 1) ⇒ Object



129
130
131
# File 'lib/paul_bunyan/log_relayer.rb', line 129

def pop_tags(size = 1)
  messaging_loggers(:pop_tags, size)
end

#primary_loggerObject



27
28
29
# File 'lib/paul_bunyan/log_relayer.rb', line 27

def primary_logger
  loggers[0]
end

#push_tags(*tags) ⇒ Object



123
124
125
126
127
# File 'lib/paul_bunyan/log_relayer.rb', line 123

def push_tags(*tags)
  tags.flatten.reject(&:blank?).tap do |new_tags|
    messaging_loggers(:push_tags, *new_tags)
  end
end

#remove_logger(logger) ⇒ Object



45
46
47
# File 'lib/paul_bunyan/log_relayer.rb', line 45

def remove_logger(logger)
  loggers.delete(logger)
end

#remove_metadata(metadata = {}, **kw_metadata) ⇒ Object



166
167
168
# File 'lib/paul_bunyan/log_relayer.rb', line 166

def ( = {}, **)
  messaging_loggers(:remove_metadata, , **)
end

#secondary_loggersObject



31
32
33
# File 'lib/paul_bunyan/log_relayer.rb', line 31

def secondary_loggers
  loggers[1..-1] || []
end

#silence(level = Logger::ERROR, &block) ⇒ Object



103
104
105
106
107
108
109
110
111
112
113
114
# File 'lib/paul_bunyan/log_relayer.rb', line 103

def silence(level = Logger::ERROR, &block)
  loggers = self.loggers.select { |l| l.respond_to?(:silence) }.reverse
  silencer = proc do
    logger = loggers.pop
    if logger
      logger.silence(level, &silencer)
    else
      block.call
    end
  end
  silencer.call
end

#tagged(*tags) ⇒ Object



141
142
143
144
145
146
# File 'lib/paul_bunyan/log_relayer.rb', line 141

def tagged(*tags)
  new_tags = push_tags(*tags)
  yield self
ensure
  pop_tags(new_tags.size)
end

#unknown(progname = nil, &block) ⇒ Object



94
95
96
# File 'lib/paul_bunyan/log_relayer.rb', line 94

def unknown(progname = nil, &block)
  add(UNKNOWN, nil, progname, &block)
end

#warn(progname = nil, &block) ⇒ Object



82
83
84
# File 'lib/paul_bunyan/log_relayer.rb', line 82

def warn(progname = nil, &block)
  add(WARN, nil, progname, &block)
end

#with_metadata(metadata = {}, **kw_metadata) ⇒ Object



170
171
172
173
174
175
# File 'lib/paul_bunyan/log_relayer.rb', line 170

def ( = {}, **)
  (, **)
  yield
ensure
  (, **)
end