File: logging-observer.rb

package info (click to toggle)
ruby-rack-timeout 0.7.0-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 212 kB
  • sloc: ruby: 515; makefile: 4
file content (56 lines) | stat: -rw-r--r-- 1,752 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
require "logger"
require_relative "core"

class Rack::Timeout::StateChangeLoggingObserver
  STATE_LOG_LEVEL = { :expired   => :error,
                      :ready     => :info,
                      :active    => :debug,
                      :timed_out => :error,
                      :completed => :info,
                    }
  def initialize
    @logger = nil
  end

  # returns the Proc to be used as the observer callback block
  def callback
    method(:log_state_change)
  end

  SIMPLE_FORMATTER = ->(severity, timestamp, progname, msg) { "#{msg} at=#{severity.downcase}\n" }
  def self.mk_logger(device, level = ::Logger::INFO)
    ::Logger.new(device).tap do |logger|
      logger.level     = level
      logger.formatter = SIMPLE_FORMATTER
    end
  end


  attr_writer :logger

  private

  def logger(env = nil)
    @logger ||
      (defined?(::Rails) && ::Rails.respond_to?(:logger) && ::Rails.logger) ||
      (env && !env["rack.logger"].is_a?(::Rack::NullLogger) && env["rack.logger"]) ||
      (env && env["rack.errors"] && self.class.mk_logger(env["rack.errors"]))      ||
      (@fallback_logger ||= self.class.mk_logger($stderr))
  end

  # generates the actual log string
  def log_state_change(env)
    info = env[::Rack::Timeout::ENV_INFO_KEY]
    level = STATE_LOG_LEVEL[info.state]
    logger(env).send(level) do
      s  = +"source=rack-timeout"
      s << " id="      << info.id           if info.id
      s << " wait="    << info.ms(:wait)    if info.wait
      s << " timeout=" << info.ms(:timeout) if info.timeout
      s << " service=" << info.ms(:service) if info.service
      s << " term_on_timeout=" << info.term.to_s if info.term
      s << " state="   << info.state.to_s   if info.state
      s
    end
  end
end