logjam_agent 0.6.9 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,16 +1,44 @@
1
- require 'active_support/buffered_logger'
2
- require 'active_support/core_ext/logger'
3
1
  require 'fileutils'
4
2
 
3
+ if ActiveSupport::VERSION::STRING < "4.0"
4
+ require 'active_support/buffered_logger'
5
+ require 'active_support/core_ext/logger'
6
+ else
7
+ require 'active_support/logger'
8
+
9
+ class LogjamAgent::ConsoleFormatter < Logger::Formatter
10
+ # This method is invoked when a log event occurs
11
+ def call(severity, timestamp, progname, msg)
12
+ "[#{format_time(timestamp)}] #{String === msg ? msg : msg.inspect}\n"
13
+ end
14
+
15
+ def format_time(timestamp)
16
+ timestamp.strftime("%H:%M:%S.#{"%06d" % timestamp.usec}")
17
+ end
18
+ end
19
+
20
+ class ActiveSupport::Logger
21
+ class << self
22
+ alias_method :original_broadcast, :broadcast
23
+ def broadcast(logger)
24
+ logger.formatter = LogjamAgent::ConsoleFormatter.new
25
+ logger.formatter.extend(ActiveSupport::TaggedLogging::Formatter)
26
+ original_broadcast(logger)
27
+ end
28
+ end
29
+ end
30
+ end
31
+
5
32
  module LogjamAgent
6
- class BufferedLogger < ActiveSupport::BufferedLogger
33
+ class BufferedLogger < ( ActiveSupport::VERSION::STRING < "4.0" ?
34
+ ActiveSupport::BufferedLogger : ActiveSupport::Logger )
7
35
 
8
36
  attr_accessor :formatter
9
37
 
10
38
  def initialize(*args)
11
39
  super(*args)
12
40
  # stupid bug in the buffered logger code (Rails::VERSION::STRING < "3.2")
13
- @log.write "\n" if respond_to?(:buffer)
41
+ @log.write "\n" if @log && respond_to?(:buffer)
14
42
  @formatter = lambda{|_, _, _, message| message}
15
43
  end
16
44
 
@@ -36,6 +64,8 @@ module LogjamAgent
36
64
 
37
65
  def add(severity, message = nil, progname = nil, &block)
38
66
  return if level > severity
67
+ message = progname if message.nil?
68
+ progname = nil # rails 3.2 bug when using tagged logging
39
69
  request = self.request || Thread.main.thread_variable_get(:logjam_request)
40
70
  if message.is_a?(Exception)
41
71
  request.add_exception(message.class.to_s) if request
@@ -51,8 +81,10 @@ module LogjamAgent
51
81
  if respond_to?(:buffer)
52
82
  buffer << formatted_message << "\n"
53
83
  auto_flush
54
- else # @log is a logger
84
+ elsif @log # @log is a logger (or nil for rails 4)
55
85
  @log << "#{formatted_message}\n"
86
+ elsif @logdev
87
+ @logdev.write(formatted_message)
56
88
  end
57
89
  request.add_line(severity, time, message) if request
58
90
  message
@@ -63,7 +95,7 @@ module LogjamAgent
63
95
  if respond_to?(:buffer)
64
96
  @log = log_device
65
97
  else
66
- @log.instance_eval do
98
+ (@log||self).instance_eval do
67
99
  raise "cannot set log device" unless defined?(@logdev)
68
100
  @logdev = log_device
69
101
  end
@@ -15,7 +15,9 @@ module LogjamAgent
15
15
  ensure
16
16
  headers = result[1]
17
17
  headers["X-Logjam-Request-Id"] = request.id
18
- headers["X-Logjam-Caller-Id"] = request.fields[:caller_id]
18
+ unless (caller_id = request.fields[:caller_id]).blank?
19
+ headers["X-Logjam-Caller-Id"] = caller_id
20
+ end
19
21
  finish_request(env)
20
22
  end
21
23
 
@@ -4,36 +4,60 @@ module LogjamAgent
4
4
 
5
5
  module Rack
6
6
  class Logger < ActiveSupport::LogSubscriber
7
- def initialize(app)
7
+ def initialize(app, taggers = nil)
8
8
  @app = app
9
+ @taggers = taggers || Rails.application.config.log_tags || []
9
10
  @hostname = LogjamAgent.hostname
10
11
  end
11
12
 
12
13
  def call(env)
14
+ request = ActionDispatch::Request.new(env)
15
+
16
+ if logger.respond_to?(:tagged) && !@taggers.empty?
17
+ logger.tagged(compute_tags(request)) { call_app(request, env) }
18
+ else
19
+ call_app(request, env)
20
+ end
21
+ end
22
+
23
+ protected
24
+
25
+ def call_app(request, env)
13
26
  start_time = Time.now
14
- before_dispatch(env, start_time)
27
+ before_dispatch(request, env, start_time)
15
28
  result = @app.call(env)
16
29
  ensure
17
30
  run_time = Time.now - start_time
18
31
  after_dispatch(env, result, run_time*1000)
19
32
  end
20
33
 
21
- protected
34
+ def compute_tags(request)
35
+ @taggers.collect do |tag|
36
+ case tag
37
+ when :uuid
38
+ Rails.logger.request.uuid
39
+ when Proc
40
+ tag.call(request)
41
+ when Symbol
42
+ request.send(tag)
43
+ else
44
+ tag
45
+ end
46
+ end
47
+ end
22
48
 
23
- def before_dispatch(env, start_time)
49
+ def before_dispatch(request, env, start_time)
24
50
  TimeBandits.reset
25
-
26
51
  Thread.current.thread_variable_set(:time_bandits_completed_info, nil)
27
52
 
28
- request = ActionDispatch::Request.new(env)
29
-
30
53
  path = request.filtered_path
31
54
 
32
55
  logjam_fields = Rails.logger.request.fields
33
56
  logjam_fields.merge!(:started_at => start_time.iso8601, :ip => request.remote_ip, :host => @hostname)
34
57
  logjam_fields.merge!(extract_request_info(request))
35
58
 
36
- info "\n\nStarted #{request.request_method} \"#{path}\" for #{request.ip} at #{start_time.to_default_s}"
59
+ debug ""
60
+ info "Started #{request.request_method} \"#{path}\" for #{request.ip} at #{start_time.to_default_s}"
37
61
  end
38
62
 
39
63
  def after_dispatch(env, result, run_time_ms)
@@ -78,8 +102,8 @@ module LogjamAgent
78
102
  end
79
103
 
80
104
  result
81
- rescue Exception
82
- Rails.logger.error($!)
105
+ rescue Exception => e
106
+ Rails.logger.error(e)
83
107
  result
84
108
  end
85
109
 
@@ -128,7 +152,7 @@ require 'action_controller/log_subscriber'
128
152
  module ActionController #:nodoc:
129
153
 
130
154
  class LogSubscriber
131
- if Rails::VERSION::STRING =~ /^3.0/
155
+ if Rails::VERSION::STRING =~ /\A3\.0/
132
156
  def start_processing(event)
133
157
  payload = event.payload
134
158
  params = payload[:params].except(*INTERNAL_PARAMS)
@@ -138,14 +162,13 @@ module ActionController #:nodoc:
138
162
  full_name = "#{controller}##{action}"
139
163
  action_name = LogjamAgent.action_name_proc.call(full_name)
140
164
 
141
- # puts "setting logjam action to #{action_name}"
142
165
  Rails.logger.request.fields[:action] = action_name
143
166
 
144
167
  info " Processing by #{full_name} as #{payload[:formats].first.to_s.upcase}"
145
168
  info " Parameters: #{params.inspect}" unless params.empty?
146
169
  end
147
170
 
148
- elsif Rails::VERSION::STRING =~ /^3.1/
171
+ elsif Rails::VERSION::STRING =~ /\A3\.1/
149
172
 
150
173
  def start_processing(event)
151
174
  payload = event.payload
@@ -158,14 +181,13 @@ module ActionController #:nodoc:
158
181
  full_name = "#{controller}##{action}"
159
182
  action_name = LogjamAgent.action_name_proc.call(full_name)
160
183
 
161
- # puts "setting logjam action to #{action_name}"
162
184
  Rails.logger.request.fields[:action] = action_name
163
185
 
164
186
  info " Processing by #{full_name} as #{format}"
165
187
  info " Parameters: #{params.inspect}" unless params.empty?
166
188
  end
167
189
 
168
- elsif Rails::VERSION::STRING =~ /^3.2/
190
+ elsif Rails::VERSION::STRING =~ /\A(3\.2|4\.0)/
169
191
 
170
192
  def start_processing(event)
171
193
  payload = event.payload
@@ -178,7 +200,6 @@ module ActionController #:nodoc:
178
200
  full_name = "#{controller}##{action}"
179
201
  action_name = LogjamAgent.action_name_proc.call(full_name)
180
202
 
181
- # puts "setting logjam action to #{action_name}"
182
203
  Rails.logger.request.fields[:action] = action_name
183
204
 
184
205
  info "Processing by #{full_name} as #{format}"
@@ -15,13 +15,15 @@ module LogjamAgent
15
15
  paths = app.config.paths
16
16
  path = (Rails::VERSION::STRING < "3.1" ? paths.log.to_a : paths['log']).first.to_s
17
17
  logger = LogjamAgent::BufferedLogger.new(path)
18
- logger.level = ActiveSupport::BufferedLogger.const_get(app.config.log_level.to_s.upcase)
18
+ logger.level = ::Logger.const_get(app.config.log_level.to_s.upcase)
19
19
  logger.formatter = LogjamAgent::SyslogLikeFormatter.new
20
20
  logger.auto_flushing = false if Rails.env.production? && Rails::VERSION::STRING < "3.2"
21
+ logger = ActiveSupport::TaggedLogging.new(logger) if Rails::VERSION::STRING >= "3.2"
21
22
  logger
22
- rescue StandardError => e
23
+ rescue StandardError
23
24
  logger = LogjamAgent::BufferedLogger.new(STDERR)
24
- logger.level = ActiveSupport::BufferedLogger::WARN
25
+ logger = ActiveSupport::TaggedLogging.new(logger) if Rails::VERSION::STRING >= "3.2"
26
+ logger.level = ::Logger::WARN
25
27
  logger.warn(
26
28
  "Logging Error: Unable to access log file. Please ensure that #{path} exists and is writable. " +
27
29
  "The log level has been raised to WARN and the output directed to STDERR until the problem is fixed."
@@ -6,7 +6,7 @@ end
6
6
 
7
7
  module LogjamAgent
8
8
  class Request
9
- attr_reader :fields
9
+ attr_reader :fields, :uuid
10
10
 
11
11
  def initialize(app, env, logger, initial_fields)
12
12
  @logger = logger
@@ -14,13 +14,13 @@ module LogjamAgent
14
14
  @env = env
15
15
  @forwarder = Forwarders.get(app, env)
16
16
  @lines = []
17
- @id = UUID4R::uuid(1).gsub('-','')
18
- @fields = initial_fields.merge(:request_id => @id, :host => LogjamAgent.hostname, :process_id => Process.pid, :lines => @lines)
17
+ @uuid = UUID4R::uuid(1).gsub('-','')
18
+ @fields = initial_fields.merge(:request_id => @uuid, :host => LogjamAgent.hostname, :process_id => Process.pid, :lines => @lines)
19
19
  @mutex = Mutex.new
20
20
  end
21
21
 
22
22
  def id
23
- "#{@app}-#{@env}-#{@id}"
23
+ "#{@app}-#{@env}-#{@uuid}"
24
24
  end
25
25
 
26
26
  def action
@@ -49,6 +49,7 @@ module LogjamAgent
49
49
 
50
50
  def forward
51
51
  engine = @fields.delete(:engine)
52
+ # puts @fields.inspect
52
53
  @forwarder.forward(LogjamAgent.encode_payload(@fields), :engine => engine)
53
54
  rescue Exception => e
54
55
  handle_forwarding_error(e)
@@ -6,6 +6,7 @@ module LogjamAgent
6
6
  @hostname = LogjamAgent.hostname
7
7
  @app_name = "rails"
8
8
  @attributes = []
9
+ @newline = ActiveSupport::VERSION::STRING < "4.0" ? "" : "\n"
9
10
  end
10
11
 
11
12
  attr_accessor :attributes
@@ -29,7 +30,15 @@ module LogjamAgent
29
30
  end
30
31
 
31
32
  def call(severity, timestamp, progname, msg)
32
- "#{format_severity(severity)} #{format_time(timestamp)} #{@hostname} #{progname||@app_name}[#{$$}]#{render_attributes}: #{format_message(msg)}"
33
+ "#{format_severity(severity)} #{format_time(timestamp)}#{render_attributes}#{format_host_info(progname)}: #{format_message(msg)}#{@newline}"
34
+ end
35
+
36
+ if Rails.env.development?
37
+ def format_host_info(proganme); ""; end
38
+ else
39
+ def format_host_info(proganme)
40
+ " #{@hostname} #{progname||@app_name}[#{$$}]"
41
+ end
33
42
  end
34
43
 
35
44
  def render_attributes
@@ -1,3 +1,3 @@
1
1
  module LogjamAgent
2
- VERSION = "0.6.9"
2
+ VERSION = "0.7.0"
3
3
  end
data/logjam_agent.gemspec CHANGED
@@ -23,5 +23,5 @@ Gem::Specification.new do |s|
23
23
 
24
24
  s.add_runtime_dependency "activesupport"
25
25
  s.add_runtime_dependency "uuid4r"
26
- s.add_runtime_dependency "time_bandits", [">= 0.3"]
26
+ s.add_runtime_dependency "time_bandits", [">= 0.4"]
27
27
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logjam_agent
3
3
  version: !ruby/object:Gem::Version
4
- hash: 21
4
+ hash: 3
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 6
9
- - 9
10
- version: 0.6.9
8
+ - 7
9
+ - 0
10
+ version: 0.7.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Stefan Kaes
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2013-05-29 00:00:00 Z
18
+ date: 2013-07-20 00:00:00 Z
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
21
  name: rake
@@ -81,11 +81,11 @@ dependencies:
81
81
  requirements:
82
82
  - - ">="
83
83
  - !ruby/object:Gem::Version
84
- hash: 13
84
+ hash: 3
85
85
  segments:
86
86
  - 0
87
- - 3
88
- version: "0.3"
87
+ - 4
88
+ version: "0.4"
89
89
  type: :runtime
90
90
  version_requirements: *id005
91
91
  description: Logjam logger and request information forwarding