td-logger 0.2.4 → 0.2.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/ChangeLog +9 -0
- data/README.rdoc +1 -1
- data/lib/td/logger/agent/access_log.rb +42 -34
- data/lib/td/logger/agent/rails/controller.rb +22 -16
- data/lib/td/logger/agent/rails/model.rb +74 -55
- data/lib/td/logger/agent/rails.rb +13 -29
- data/lib/td/logger/version.rb +1 -1
- metadata +4 -4
data/ChangeLog
CHANGED
@@ -1,4 +1,13 @@
|
|
1
1
|
|
2
|
+
== 2011-09-30 version 0.2.5
|
3
|
+
|
4
|
+
* Use HTTP_X_FORWARDED_FOR instead of REMOTE_ADDR if it's available
|
5
|
+
* Don't enable ActiveRecord extension unless defined?(ActiveRecord)
|
6
|
+
* Ignore OPTIONS method
|
7
|
+
* Use Symbol for keys of access log
|
8
|
+
* Removed defined?(RAILS_ENV) and defined?(RAILS_ROOT) to suppress wornings
|
9
|
+
|
10
|
+
|
2
11
|
== 2011-09-13 version 0.2.4
|
3
12
|
|
4
13
|
* Increase flush_interval from 10 sec to 5 mins gradually
|
data/README.rdoc
CHANGED
@@ -4,8 +4,8 @@ module Logger
|
|
4
4
|
module Agent
|
5
5
|
|
6
6
|
ACCESS_LOG_PARAM_ENV =
|
7
|
-
if defined? Rails
|
8
|
-
if Rails.respond_to?(:version) && Rails.version =~ /^3/
|
7
|
+
if defined? ::Rails
|
8
|
+
if ::Rails.respond_to?(:version) && ::Rails.version =~ /^3/
|
9
9
|
# Rails 3
|
10
10
|
'action_dispatch.request.path_parameters'
|
11
11
|
else
|
@@ -18,54 +18,62 @@ module Agent
|
|
18
18
|
end
|
19
19
|
|
20
20
|
ACCESS_LOG_PRESET_PARAM_KEYS = {
|
21
|
-
|
22
|
-
|
23
|
-
}
|
24
|
-
|
25
|
-
ACCESS_LOG_PRESET_ENV_KEYS = {
|
26
|
-
'ip' => 'REMOTE_ADDR',
|
27
|
-
'method' => 'REQUEST_METHOD',
|
28
|
-
'uri' => 'REQUEST_URI',
|
29
|
-
'referer' => 'HTTP_REFERER',
|
30
|
-
'ua' => 'HTTP_USER_AGENT'
|
21
|
+
:controller => :controller,
|
22
|
+
:action => :action,
|
31
23
|
}
|
32
24
|
|
33
25
|
def self.enable_access_log(tag)
|
34
26
|
Middleware.before do |env|
|
35
|
-
|
36
|
-
Thread.current['td.access_log'] =
|
37
|
-
env['td.access_log'] =
|
27
|
+
record = {}
|
28
|
+
Thread.current['td.access_log'] = record
|
29
|
+
env['td.access_log'] = record
|
38
30
|
env['td.access_time'] = Time.now
|
39
31
|
end
|
40
32
|
|
41
33
|
Middleware.after do |env,result|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
# add 'elapsed' column
|
46
|
-
if access_time
|
47
|
-
elapsed = Time.now - access_time
|
48
|
-
data['elapsed'] = elapsed
|
49
|
-
# set 'time' column to access time
|
50
|
-
data['time'] = access_time
|
34
|
+
req = env['action_dispatch.request']
|
35
|
+
if !req || !req.is_a?(Rack::Request)
|
36
|
+
req = Rack::Request.new(env)
|
51
37
|
end
|
52
38
|
|
53
|
-
|
54
|
-
|
55
|
-
|
39
|
+
# ignore OPTIONS request
|
40
|
+
if req.request_method != "OPTIONS"
|
41
|
+
record = env['td.access_log'] || {}
|
42
|
+
access_time = env['td.access_time']
|
43
|
+
|
44
|
+
# add 'elapsed' column
|
45
|
+
if access_time
|
46
|
+
elapsed = Time.now - access_time
|
47
|
+
record[:elapsed] = elapsed
|
48
|
+
# set 'time' column to access time
|
49
|
+
record[:time] = access_time
|
50
|
+
end
|
51
|
+
|
52
|
+
record[:method] ||= req.request_method
|
53
|
+
record[:ip] ||= (env['action_dispatch.remote_ip'] || req.ip).to_s
|
54
|
+
record[:uri] ||= env['REQUEST_URI'].to_s if env['REQUEST_URI']
|
55
|
+
record[:referer] ||= env['HTTP_REFERER'].to_s if env['HTTP_REFERER']
|
56
|
+
record[:ua] ||= env['HTTP_USER_AGENT'].to_s if env['HTTP_USER_AGENT']
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
58
|
+
m = env[ACCESS_LOG_PARAM_ENV]
|
59
|
+
ACCESS_LOG_PRESET_PARAM_KEYS.each_pair {|key,val|
|
60
|
+
record[key] ||= m[val] if m[val]
|
61
|
+
}
|
61
62
|
|
62
|
-
|
63
|
-
|
63
|
+
# result code
|
64
|
+
record[:status] ||= result[0].to_i
|
64
65
|
|
65
|
-
|
66
|
+
TreasureData.log(tag, record)
|
67
|
+
end
|
66
68
|
end
|
67
69
|
end
|
68
70
|
|
69
71
|
end
|
70
72
|
end
|
71
73
|
end
|
74
|
+
|
75
|
+
module TreasureData
|
76
|
+
def self.access_log
|
77
|
+
Thread.current['td.access_log']
|
78
|
+
end
|
79
|
+
end
|
@@ -4,29 +4,35 @@ module Agent
|
|
4
4
|
module Rails
|
5
5
|
|
6
6
|
def self.init_controller
|
7
|
-
|
8
|
-
modms = ControllerModuleMethods
|
9
|
-
ActionController::Base.class_eval do
|
10
|
-
include ms
|
11
|
-
extend modms
|
12
|
-
end
|
7
|
+
ActionController::Base.send(:include, ControllerExtension)
|
13
8
|
end
|
14
9
|
|
15
|
-
module
|
16
|
-
|
17
|
-
|
10
|
+
module ControllerExtension
|
11
|
+
if defined?(ActiveSupport::Concern)
|
12
|
+
# Rails 2
|
13
|
+
extend ActiveSupport::Concern
|
14
|
+
else
|
15
|
+
def self.included(mod)
|
16
|
+
im = InstanceMethods
|
17
|
+
cm = ClassMethods
|
18
|
+
mod.class_eval do
|
19
|
+
include im
|
20
|
+
extend cm
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
module InstanceMethods
|
26
|
+
def td_access_log
|
27
|
+
request.env['td.access_log'] ||= {}
|
28
|
+
end
|
18
29
|
end
|
19
|
-
end
|
20
30
|
|
21
|
-
|
31
|
+
module ClassMethods
|
32
|
+
end
|
22
33
|
end
|
23
34
|
|
24
35
|
end
|
25
36
|
end
|
26
37
|
end
|
27
|
-
|
28
|
-
def self.access_log
|
29
|
-
Thread.current['td.access_log']
|
30
|
-
end
|
31
|
-
|
32
38
|
end
|
@@ -4,75 +4,94 @@ module Agent
|
|
4
4
|
module Rails
|
5
5
|
|
6
6
|
def self.init_model
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
unless defined?(::ActiveRecord)
|
8
|
+
# disable model extension if Rails > 3 and
|
9
|
+
# ActiveRecord is not loaded (other ORM is used)
|
10
|
+
if ::Rails.respond_to?(:version) && ::Rails.version =~ /^3/
|
11
|
+
return
|
12
|
+
end
|
13
|
+
require 'active_record'
|
13
14
|
end
|
15
|
+
::ActiveRecord::Base.send(:include, ModelExtension)
|
14
16
|
end
|
15
17
|
|
16
|
-
module
|
17
|
-
|
18
|
+
module ModelExtension
|
19
|
+
if defined?(ActiveSupport::Concern)
|
20
|
+
# Rails 2
|
21
|
+
extend ActiveSupport::Concern
|
22
|
+
else
|
23
|
+
def self.included(mod)
|
24
|
+
im = InstanceMethods
|
25
|
+
cm = ClassMethods
|
26
|
+
mod.class_eval do
|
27
|
+
include im
|
28
|
+
extend cm
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
18
32
|
|
19
|
-
|
20
|
-
|
21
|
-
only = nil
|
22
|
-
except = nil
|
23
|
-
static = {}
|
33
|
+
module InstanceMethods
|
34
|
+
end
|
24
35
|
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
[o]
|
31
|
-
end.map {|e| e.to_s }
|
32
|
-
end
|
36
|
+
module ClassMethods
|
37
|
+
def td_enable_model_tracer(tag, options={})
|
38
|
+
only = nil
|
39
|
+
except = nil
|
40
|
+
static = {}
|
33
41
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
+
if o = options[:only]
|
43
|
+
only = case o
|
44
|
+
when Array
|
45
|
+
o
|
46
|
+
else
|
47
|
+
[o]
|
48
|
+
end.map {|e| e.to_s }
|
49
|
+
end
|
42
50
|
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
51
|
+
if o = options[:except]
|
52
|
+
except = case o
|
53
|
+
when Array
|
54
|
+
o
|
55
|
+
else
|
56
|
+
[o]
|
57
|
+
end.map {|e| e.to_s }
|
58
|
+
end
|
48
59
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
60
|
+
if o = options[:static]
|
61
|
+
o.each_pair {|k,v|
|
62
|
+
static[k.to_s] = v
|
63
|
+
}
|
64
|
+
end
|
65
|
+
|
66
|
+
if defined?(after_commit)
|
67
|
+
# Rails 3
|
68
|
+
m = :after_commit
|
69
|
+
else
|
70
|
+
# Rails 2
|
71
|
+
m = :after_save
|
72
|
+
end
|
56
73
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
74
|
+
__send__(m) do |record|
|
75
|
+
data = {}
|
76
|
+
record.attribute_names.each {|name|
|
77
|
+
name = name.to_s
|
78
|
+
if (!only || only.include?(name)) && (!except || !except.include?(name))
|
79
|
+
data[name] = record.read_attribute(name)
|
80
|
+
end
|
81
|
+
}
|
82
|
+
static.each_pair {|k,v|
|
83
|
+
data[k] = v
|
84
|
+
}
|
85
|
+
if time = data['updated_at'] && time.is_a?(Time)
|
86
|
+
data['time'] = time.to_i
|
87
|
+
data.delete('updated_at')
|
63
88
|
end
|
64
|
-
|
65
|
-
static.each_pair {|k,v|
|
66
|
-
data[k] = v
|
67
|
-
}
|
68
|
-
if time = data['updated_at'] && time.is_a?(Time)
|
69
|
-
data['time'] = time.to_i
|
70
|
-
data.delete('updated_at')
|
89
|
+
TreasureData.log(tag, data)
|
71
90
|
end
|
72
|
-
TreasureData.log(tag, data)
|
73
91
|
end
|
74
92
|
end
|
75
93
|
end
|
94
|
+
|
76
95
|
end
|
77
96
|
end
|
78
97
|
end
|
@@ -1,11 +1,6 @@
|
|
1
1
|
module TreasureData
|
2
2
|
module Logger
|
3
3
|
module Agent
|
4
|
-
require 'td/logger/agent/middleware'
|
5
|
-
require 'td/logger/agent/access_log'
|
6
|
-
require 'td/logger/agent/rails/controller'
|
7
|
-
require 'td/logger/agent/rails/model'
|
8
|
-
|
9
4
|
module Rails
|
10
5
|
|
11
6
|
CONFIG_PATH = 'config/treasure_data.yml'
|
@@ -28,22 +23,6 @@ production:
|
|
28
23
|
test:
|
29
24
|
EOF
|
30
25
|
|
31
|
-
def self.rails_env
|
32
|
-
if defined?(RAILS_ENV) && RAILS_ENV.to_s != ''
|
33
|
-
RAILS_ENV.to_s
|
34
|
-
else
|
35
|
-
::Rails.env
|
36
|
-
end
|
37
|
-
end
|
38
|
-
|
39
|
-
def self.rails_root
|
40
|
-
if defined?(RAILS_ROOT) && RAILS_ROOT.to_s != ''
|
41
|
-
RAILS_ROOT.to_s
|
42
|
-
else
|
43
|
-
::Rails.root
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
26
|
class Config
|
48
27
|
def initialize(conf)
|
49
28
|
if agent = conf['agent']
|
@@ -97,14 +76,14 @@ EOF
|
|
97
76
|
end
|
98
77
|
return Config.new({
|
99
78
|
'apikey' => apikey,
|
100
|
-
'database' => ENV['TREASURE_DATA_DB'] || "rails_#{
|
79
|
+
'database' => ENV['TREASURE_DATA_DB'] || "rails_#{::Rails.env}",
|
101
80
|
'access_log_table' => ENV['TREASURE_DATA_TABLE'] || 'web_access',
|
102
81
|
'auto_create_table' => true
|
103
82
|
})
|
104
83
|
end
|
105
84
|
|
106
85
|
begin
|
107
|
-
src = File.read("#{
|
86
|
+
src = File.read("#{::Rails.root}/#{CONFIG_PATH}")
|
108
87
|
yaml = ERB.new(src).result
|
109
88
|
env_conf = YAML.load(yaml)
|
110
89
|
rescue
|
@@ -115,9 +94,9 @@ EOF
|
|
115
94
|
return
|
116
95
|
end
|
117
96
|
|
118
|
-
conf = env_conf[
|
97
|
+
conf = env_conf[::Rails.env]
|
119
98
|
unless conf
|
120
|
-
logger.warn "#{CONFIG_PATH} doesn't include setting for current environment (#{
|
99
|
+
logger.warn "#{CONFIG_PATH} doesn't include setting for current environment (#{::Rails.env})."
|
121
100
|
logger.warn "Disabling Treasure Data logger."
|
122
101
|
return
|
123
102
|
end
|
@@ -132,6 +111,11 @@ EOF
|
|
132
111
|
end
|
133
112
|
|
134
113
|
def self.init(rails)
|
114
|
+
require 'td/logger/agent/middleware'
|
115
|
+
require 'td/logger/agent/access_log'
|
116
|
+
require 'td/logger/agent/rails/controller'
|
117
|
+
require 'td/logger/agent/rails/model'
|
118
|
+
|
135
119
|
c = read_config(rails)
|
136
120
|
return unless c
|
137
121
|
|
@@ -155,17 +139,17 @@ end
|
|
155
139
|
end
|
156
140
|
end
|
157
141
|
|
158
|
-
if defined? Rails
|
159
|
-
if Rails.respond_to?(:version) && Rails.version =~ /^3/
|
142
|
+
if defined? ::Rails
|
143
|
+
if ::Rails.respond_to?(:version) && ::Rails.version =~ /^3/
|
160
144
|
module TreasureData
|
161
|
-
class Railtie < Rails::Railtie
|
145
|
+
class Railtie < ::Rails::Railtie
|
162
146
|
initializer "treasure_data_agent.start_plugin" do |app|
|
163
147
|
TreasureData::Logger::Agent::Rails.init(app.config)
|
164
148
|
end
|
165
149
|
end
|
166
150
|
end
|
167
151
|
else
|
168
|
-
TreasureData::Logger::Agent::Rails.init(Rails.configuration)
|
152
|
+
TreasureData::Logger::Agent::Rails.init(::Rails.configuration)
|
169
153
|
end
|
170
154
|
end
|
171
155
|
|
data/lib/td/logger/version.rb
CHANGED
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: td-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 29
|
5
5
|
prerelease: false
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 2
|
9
|
-
-
|
10
|
-
version: 0.2.
|
9
|
+
- 5
|
10
|
+
version: 0.2.5
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Sadayuki Furuhashi
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-09-
|
18
|
+
date: 2011-09-30 00:00:00 +09:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|