gray_logger 0.9.4 → 0.9.5
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.
- data/lib/gray_logger.rb +3 -3
- data/lib/gray_logger/bucket.rb +35 -0
- data/lib/gray_logger/helper_methods.rb +1 -5
- data/lib/gray_logger/logger.rb +62 -0
- data/lib/gray_logger/message.rb +0 -1
- data/lib/gray_logger/rack.rb +100 -0
- data/lib/gray_logger/rails_modules.rb +1 -2
- data/lib/gray_logger/railtie.rb +1 -1
- metadata +7 -6
- data/lib/gray_logger/message_store.rb +0 -42
- data/lib/gray_logger/middleware.rb +0 -43
data/lib/gray_logger.rb
CHANGED
@@ -2,12 +2,12 @@ require 'singleton'
|
|
2
2
|
require 'gelf'
|
3
3
|
|
4
4
|
require 'gray_logger/support'
|
5
|
+
require 'gray_logger/bucket'
|
5
6
|
require 'gray_logger/message'
|
6
|
-
require 'gray_logger/
|
7
|
-
require 'gray_logger/
|
7
|
+
require 'gray_logger/logger'
|
8
|
+
require 'gray_logger/rack'
|
8
9
|
require 'gray_logger/helper_methods'
|
9
10
|
|
10
|
-
|
11
11
|
if defined?(Rails)
|
12
12
|
require 'gray_logger/rails_modules'
|
13
13
|
require 'gray_logger/railtie' if defined?(Rails::Railtie)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module GrayLogger
|
2
|
+
|
3
|
+
class Bucket < Hash
|
4
|
+
alias_method :<<, :merge!
|
5
|
+
|
6
|
+
def to_message(name=nil)
|
7
|
+
self[:gray_logger_bucket] = name if name
|
8
|
+
GrayLogger::Message.new(self)
|
9
|
+
end
|
10
|
+
|
11
|
+
def append_to(field_name, value)
|
12
|
+
self[field_name.to_sym] ||= ""
|
13
|
+
self[field_name.to_sym] << "#{value}\n"
|
14
|
+
end
|
15
|
+
|
16
|
+
protected
|
17
|
+
def method_missing(method_name, args, &block)
|
18
|
+
if method_name.to_s.end_with?("=")
|
19
|
+
|
20
|
+
# def method_name=(value)
|
21
|
+
# self[:method_name] = value
|
22
|
+
# end
|
23
|
+
instance_eval <<-EOMEVAL
|
24
|
+
def #{method_name}(value)
|
25
|
+
self[:#{method_name.to_s.chop}] = value
|
26
|
+
end
|
27
|
+
EOMEVAL
|
28
|
+
|
29
|
+
send(method_name, args)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -1,11 +1,7 @@
|
|
1
1
|
module GrayLogger
|
2
2
|
module HelperMethods
|
3
3
|
def gray_logger
|
4
|
-
|
5
|
-
env["rack.gray_logger.message_store"]
|
6
|
-
else
|
7
|
-
request.env["rack.gray_logger.message_store"]
|
8
|
-
end
|
4
|
+
Rack::GrayLogger.proxy.gray_logger
|
9
5
|
end
|
10
6
|
protected :gray_logger
|
11
7
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module GrayLogger
|
2
|
+
|
3
|
+
class Logger < GELF::Logger
|
4
|
+
include ::GrayLogger::Support
|
5
|
+
attr_reader :buckets
|
6
|
+
|
7
|
+
def initialize(configuration={})
|
8
|
+
defaults = {
|
9
|
+
:size => "WAN",
|
10
|
+
:facility => "facility-not-defined"
|
11
|
+
}
|
12
|
+
|
13
|
+
config = symbolize_keys(configuration)
|
14
|
+
config = defaults.merge(config)
|
15
|
+
|
16
|
+
super(config.delete(:host), config.delete(:port), config.delete(:size), config)
|
17
|
+
|
18
|
+
@buckets = {}
|
19
|
+
end
|
20
|
+
|
21
|
+
# logger.after_request_log << {:my_field => 'field content'}
|
22
|
+
# logger.after_request_log.my_field = 'field content'
|
23
|
+
def after_request_log
|
24
|
+
bucket(:_request)
|
25
|
+
end
|
26
|
+
|
27
|
+
# logger.bucket(:my_bucket) << {:my_field => 'field content'}
|
28
|
+
# logger.bucket(:my_bucket).my_field = 'field content'
|
29
|
+
def bucket(name)
|
30
|
+
@buckets[name.to_sym] ||= GrayLogger::Bucket.new
|
31
|
+
end
|
32
|
+
|
33
|
+
# flush all buckets
|
34
|
+
def flush
|
35
|
+
@buckets.keys.each do |bucket_name|
|
36
|
+
flush_bucket(bucket_name)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
# flush a specific bucket
|
41
|
+
def flush_bucket(name)
|
42
|
+
return false if get_bucket(name).nil?
|
43
|
+
message = get_bucket(name).to_message(name)
|
44
|
+
self.notify!(message)
|
45
|
+
@buckets.delete(name.to_sym)
|
46
|
+
end
|
47
|
+
|
48
|
+
def log_exception(exception)
|
49
|
+
if exception
|
50
|
+
after_request_log.short_message = "Error: #{exception.inspect}"
|
51
|
+
after_request_log.exception_backtrace = exception.backtrace.join("\n")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
def get_bucket(name)
|
57
|
+
@buckets[name.to_sym]
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
data/lib/gray_logger/message.rb
CHANGED
@@ -0,0 +1,100 @@
|
|
1
|
+
module Rack
|
2
|
+
module GrayLogger
|
3
|
+
class Middleware
|
4
|
+
include ::GrayLogger::Support
|
5
|
+
|
6
|
+
attr_accessor :gray_logger
|
7
|
+
|
8
|
+
def initialize(app, options={})
|
9
|
+
@app = app
|
10
|
+
|
11
|
+
configuration = symbolize_keys(options.delete(:configuration))
|
12
|
+
self.gray_logger = ::GrayLogger::Logger.new(configuration)
|
13
|
+
|
14
|
+
::Rack::GrayLogger.proxy.gray_logger = gray_logger if ::Rack::GrayLogger.proxy
|
15
|
+
end
|
16
|
+
|
17
|
+
def call(env)
|
18
|
+
|
19
|
+
begin
|
20
|
+
status, headers, body = @app.call(env)
|
21
|
+
rescue => e
|
22
|
+
gray_logger.log_exception(e)
|
23
|
+
raise
|
24
|
+
ensure
|
25
|
+
req = Rack::Request.new(env)
|
26
|
+
gray_logger.log_exception(env['rack.exception'])
|
27
|
+
gray_logger.after_request_log.status_code = status.to_i
|
28
|
+
gray_logger.after_request_log.short_message = "Request: #{req.path} (#{status.to_i})" if gray_logger.after_request_log[:short_message].nil?
|
29
|
+
gray_logger.flush
|
30
|
+
[status, headers, body]
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
class Proxy
|
38
|
+
attr_accessor :proxied_logger, :gray_logger
|
39
|
+
|
40
|
+
def initialize(attributes={})
|
41
|
+
self.proxied_logger = attributes[:proxied_logger]
|
42
|
+
self.gray_logger = attributes[:gray_logger]
|
43
|
+
end
|
44
|
+
|
45
|
+
# def debug(*args)
|
46
|
+
# if proxied_logger.nil?
|
47
|
+
# super(*args)
|
48
|
+
# else
|
49
|
+
# after_request_log.append_to(:log_file, "[debug] #{args[0]}") unless gray_logger.nil?
|
50
|
+
# proxied_logger.send(:debug, *args)
|
51
|
+
# end
|
52
|
+
# end
|
53
|
+
GELF::Levels.constants.each do |const|
|
54
|
+
class_eval <<-EOT, __FILE__, __LINE__ + 1
|
55
|
+
def #{const.downcase}(*args)
|
56
|
+
if proxied_logger.nil?
|
57
|
+
gray_logger.send(:#{const.downcase}, *args)
|
58
|
+
else
|
59
|
+
gray_logger.after_request_log.append_to(:log_file, "[#{const.downcase}] \#{args[0]}") unless gray_logger.nil?
|
60
|
+
proxied_logger.send(:#{const.downcase}, *args)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
EOT
|
64
|
+
end
|
65
|
+
private
|
66
|
+
def method_missing(method_name, *args, &block)
|
67
|
+
unless gray_logger.nil?
|
68
|
+
begin
|
69
|
+
gray_logger.send(method_name, *args, &block)
|
70
|
+
rescue => e
|
71
|
+
gray_logger.handle_exception(e)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
unless proxied_logger.nil?
|
75
|
+
begin
|
76
|
+
proxied_logger.send(method_name, *args, &block)
|
77
|
+
rescue => e
|
78
|
+
proxied_logger.error(e.backtrace.join("\n"))
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
end
|
84
|
+
|
85
|
+
# config.logger = Rack::GrayLogger.after_request_proxy(SysLogger.new)
|
86
|
+
def self.after_request_proxy(proxied_logger)
|
87
|
+
self.proxy = Rack::GrayLogger::Proxy.new(:proxied_logger => proxied_logger)
|
88
|
+
proxy
|
89
|
+
end
|
90
|
+
|
91
|
+
def self.proxy= proxy
|
92
|
+
@proxy = proxy
|
93
|
+
end
|
94
|
+
|
95
|
+
def self.proxy
|
96
|
+
@proxy
|
97
|
+
end
|
98
|
+
|
99
|
+
end
|
100
|
+
end
|
@@ -13,8 +13,7 @@ module GrayLogger
|
|
13
13
|
# Overrides the rescue_action method in ActionController::Base, but does not inhibit
|
14
14
|
# any custom processing that is defined with Rails 2's exception helpers.
|
15
15
|
def rescue_action_with_gray_logger(exception)
|
16
|
-
gray_logger.
|
17
|
-
gray_logger.short_message = "Error: #{exception.inspect}"
|
16
|
+
gray_logger.handle_exception(exception)
|
18
17
|
rescue_action_without_gray_logger(exception)
|
19
18
|
end
|
20
19
|
end
|
data/lib/gray_logger/railtie.rb
CHANGED
@@ -5,7 +5,7 @@ module GrayLogger
|
|
5
5
|
begin
|
6
6
|
initializer "gray_logger.configure_rails_initialization" do |app|
|
7
7
|
configuration = YAML.load(File.read(Rails.root.join('config/gray_logger.yml')))[Rails.env]
|
8
|
-
app.middleware.insert_after "ActionDispatch::ShowExceptions", "GrayLogger::Middleware", :configuration => configuration
|
8
|
+
app.middleware.insert_after "ActionDispatch::ShowExceptions", "Rack::GrayLogger::Middleware", :configuration => configuration
|
9
9
|
end
|
10
10
|
rescue => e
|
11
11
|
$stderr.puts("GrayLogger not configured. Please add config/gray_logger.yml")
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gray_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 49
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 9
|
9
|
-
-
|
10
|
-
version: 0.9.
|
9
|
+
- 5
|
10
|
+
version: 0.9.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Benjamin Behr
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2012-11-
|
18
|
+
date: 2012-11-16 00:00:00 Z
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: gelf
|
@@ -40,10 +40,11 @@ extensions: []
|
|
40
40
|
extra_rdoc_files: []
|
41
41
|
|
42
42
|
files:
|
43
|
+
- lib/gray_logger/bucket.rb
|
43
44
|
- lib/gray_logger/helper_methods.rb
|
45
|
+
- lib/gray_logger/logger.rb
|
44
46
|
- lib/gray_logger/message.rb
|
45
|
-
- lib/gray_logger/
|
46
|
-
- lib/gray_logger/middleware.rb
|
47
|
+
- lib/gray_logger/rack.rb
|
47
48
|
- lib/gray_logger/rails_modules.rb
|
48
49
|
- lib/gray_logger/railtie.rb
|
49
50
|
- lib/gray_logger/support.rb
|
@@ -1,42 +0,0 @@
|
|
1
|
-
module GrayLogger
|
2
|
-
|
3
|
-
class MessageStore
|
4
|
-
attr_reader :store
|
5
|
-
|
6
|
-
def initialize(store={})
|
7
|
-
@store = store
|
8
|
-
end
|
9
|
-
|
10
|
-
# gets a hash with fields
|
11
|
-
def add(field_set)
|
12
|
-
field_set.each_pair do |field, value|
|
13
|
-
@store[field.to_sym] = value
|
14
|
-
end
|
15
|
-
@store
|
16
|
-
end
|
17
|
-
alias_method :<<, :add
|
18
|
-
|
19
|
-
def to_message
|
20
|
-
GrayLogger::Message.new(@store)
|
21
|
-
end
|
22
|
-
|
23
|
-
protected
|
24
|
-
def method_missing(method_name, args, &block)
|
25
|
-
if method_name.to_s.end_with?("=")
|
26
|
-
|
27
|
-
# def method_name=(value)
|
28
|
-
# @store[:method_name] = value
|
29
|
-
# end
|
30
|
-
instance_eval <<-EOMEVAL
|
31
|
-
def #{method_name}(value)
|
32
|
-
@store[:#{method_name.to_s.chop}] = value
|
33
|
-
end
|
34
|
-
EOMEVAL
|
35
|
-
|
36
|
-
send(method_name, args)
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
end
|
@@ -1,43 +0,0 @@
|
|
1
|
-
module GrayLogger
|
2
|
-
|
3
|
-
class Middleware
|
4
|
-
include GrayLogger::Support
|
5
|
-
|
6
|
-
attr_accessor :gray_logger
|
7
|
-
|
8
|
-
def initialize(app, options={})
|
9
|
-
@app = app
|
10
|
-
configuration = symbolize_keys(options.delete(:configuration))
|
11
|
-
self.gray_logger = if configuration && configuration[:host] && configuration[:port]
|
12
|
-
size = ENV['GRAYLOGGER_SIZE'] || configuration.delete(:size) || "WAN"
|
13
|
-
GELF::Logger.new(configuration.delete(:host), configuration.delete(:port), size, configuration)
|
14
|
-
else
|
15
|
-
options.delete(:logger)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def call(env)
|
20
|
-
|
21
|
-
begin
|
22
|
-
message_store = env["rack.gray_logger.message_store"] = GrayLogger::MessageStore.new(:level => GELF::INFO)
|
23
|
-
status, headers, body = @app.call(env)
|
24
|
-
rescue => e
|
25
|
-
message_store.short_message = "Error: #{e.inspect}"
|
26
|
-
message_store.exception_backtrace = e.backtrace.join("\n")
|
27
|
-
raise
|
28
|
-
ensure
|
29
|
-
error = env['rack.exception']
|
30
|
-
if error
|
31
|
-
message_store.short_message = "Error: #{error.inspect}"
|
32
|
-
message_store.exception_backtrace = error.backtrace.join("\n")
|
33
|
-
end
|
34
|
-
message_store.status_code = status.to_i
|
35
|
-
gray_logger.notify!(message_store.to_message) unless gray_logger.nil?
|
36
|
-
[status, headers, body]
|
37
|
-
end
|
38
|
-
|
39
|
-
end
|
40
|
-
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|