brontes3d-production_log_analyzer 2009022403 → 2009072100
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.
@@ -0,0 +1,57 @@
|
|
1
|
+
class RackLoggingPerProc
|
2
|
+
|
3
|
+
def self.logger_mutex
|
4
|
+
@@logger_mutex ||= Mutex.new
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.logs
|
8
|
+
@@logs ||= []
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.clear_logs
|
12
|
+
@@logs = []
|
13
|
+
end
|
14
|
+
|
15
|
+
def initialize app, log_path_prefix
|
16
|
+
@app = app
|
17
|
+
@log_path_prefix = log_path_prefix
|
18
|
+
@process_logger = false
|
19
|
+
end
|
20
|
+
|
21
|
+
def call env
|
22
|
+
RackLoggingPerProc.logger_mutex.synchronize do
|
23
|
+
unless @process_logger
|
24
|
+
@process_logger = ActiveSupport::BufferedLogger.new(@log_path_prefix + "_#{Process.pid}" + ".log")
|
25
|
+
@process_logger.debug("\nProcess logging started")
|
26
|
+
RAILS_DEFAULT_LOGGER.instance_eval do
|
27
|
+
class << self
|
28
|
+
def add(severity, message = nil, progname = nil, &block)
|
29
|
+
to_return = super
|
30
|
+
if to_return
|
31
|
+
RackLoggingPerProc.logger_mutex.synchronize do
|
32
|
+
RackLoggingPerProc.logs << [severity, to_return.strip]
|
33
|
+
end
|
34
|
+
end
|
35
|
+
to_return
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
start_time = Time.now
|
43
|
+
@app.call(env)
|
44
|
+
ensure
|
45
|
+
RackLoggingPerProc.logger_mutex.synchronize do
|
46
|
+
@process_logger.info("RECEIVE_REQUEST (#{Process.pid}) #{env['REQUEST_METHOD']} #{env['REQUEST_URI']} #{start_time}")
|
47
|
+
RackLoggingPerProc.logs.each do |to_log|
|
48
|
+
@process_logger.add(to_log[0], to_log[1])
|
49
|
+
end
|
50
|
+
@process_logger.info("#{Time.now} (#{Process.pid}) RESPONSE_SENT")
|
51
|
+
@process_logger.info("\n")
|
52
|
+
@process_logger.flush
|
53
|
+
RackLoggingPerProc.clear_logs
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
@@ -2,12 +2,11 @@ require File.dirname(__FILE__) + '/test_helper'
|
|
2
2
|
|
3
3
|
require 'rubygems'
|
4
4
|
require 'active_support'
|
5
|
-
require 'phusion_passenger/rack/request_handler'
|
6
5
|
|
7
|
-
require '
|
6
|
+
require 'rack_logging_per_proc'
|
8
7
|
|
9
|
-
SCRATCH_DIR = File.join(Dir.tmpdir, "
|
10
|
-
RAILS_LOG_LOCATION = File.join(SCRATCH_DIR, "
|
8
|
+
SCRATCH_DIR = File.join(Dir.tmpdir, "rack_logging_proc_test")
|
9
|
+
RAILS_LOG_LOCATION = File.join(SCRATCH_DIR, "test_rack_rails.log")
|
11
10
|
RAILS_DEFAULT_LOGGER = ActiveSupport::BufferedLogger.new(RAILS_LOG_LOCATION)
|
12
11
|
|
13
12
|
class TestPassengerLogPerProc < Test::Unit::TestCase
|
@@ -21,32 +20,33 @@ class TestPassengerLogPerProc < Test::Unit::TestCase
|
|
21
20
|
FileUtils.rm_rf(SCRATCH_DIR)
|
22
21
|
end
|
23
22
|
|
24
|
-
def run_a_request(count = 1)
|
23
|
+
def run_a_request(app, count = 1)
|
25
24
|
Process.fork do
|
26
25
|
count.times do |i|
|
27
|
-
r, w = IO.pipe
|
28
|
-
req_handler = PhusionPassenger::Rack::RequestHandler.new(w, Proc.new{
|
29
|
-
RAILS_DEFAULT_LOGGER.debug("hi #{i} from #{Process.pid}")
|
30
|
-
[200, {}, "hi"] })
|
31
26
|
env = {}
|
32
27
|
env["PATH_INFO"] = "/"
|
33
|
-
|
34
|
-
|
28
|
+
env["count"] = i
|
29
|
+
app.call(env)
|
35
30
|
end
|
36
31
|
end
|
37
32
|
end
|
38
33
|
|
39
|
-
def test_todo
|
40
|
-
|
34
|
+
def test_todo
|
35
|
+
app = lambda do |env|
|
36
|
+
RAILS_DEFAULT_LOGGER.debug("hi #{env['count']} from #{Process.pid}")
|
37
|
+
[200, {}, "hi"]
|
38
|
+
end
|
39
|
+
|
40
|
+
pid_before = run_a_request(app)
|
41
41
|
|
42
42
|
Process.waitpid(pid_before)
|
43
43
|
|
44
|
-
per_proc_logs_dir = File.join(SCRATCH_DIR, "
|
44
|
+
per_proc_logs_dir = File.join(SCRATCH_DIR, "per_proc")
|
45
45
|
FileUtils.mkdir_p(per_proc_logs_dir)
|
46
|
-
|
47
|
-
|
48
|
-
pid_after1 = run_a_request(2)
|
49
|
-
pid_after2 = run_a_request(2)
|
46
|
+
middleware_instance = RackLoggingPerProc.new(app, "#{per_proc_logs_dir}/test")
|
47
|
+
|
48
|
+
pid_after1 = run_a_request(middleware_instance, 2)
|
49
|
+
pid_after2 = run_a_request(middleware_instance, 2)
|
50
50
|
|
51
51
|
Process.waitpid(pid_after1)
|
52
52
|
Process.waitpid(pid_after2)
|
@@ -74,14 +74,14 @@ class TestPassengerLogPerProc < Test::Unit::TestCase
|
|
74
74
|
# puts "proc1_file_contents log: \n" + proc1_file_contents
|
75
75
|
proc1_log_lines = proc1_file_contents.split("\n").reject{|l| l.match(/RECEIVE_REQUEST/) || l.match(/RESPONSE_SENT/) }
|
76
76
|
|
77
|
-
assert_equal(["
|
77
|
+
assert_equal(["Process logging started", "hi 0 from #{pid_after1}", "", "hi 1 from #{pid_after1}"],
|
78
78
|
proc1_log_lines[1,5])
|
79
79
|
|
80
80
|
|
81
81
|
# puts "proc2_file_contents log: \n" + proc2_file_contents
|
82
82
|
proc2_log_lines = proc2_file_contents.split("\n").reject{|l| l.match(/RECEIVE_REQUEST/) || l.match(/RESPONSE_SENT/) }
|
83
83
|
|
84
|
-
assert_equal(["
|
84
|
+
assert_equal(["Process logging started", "hi 0 from #{pid_after2}", "", "hi 1 from #{pid_after2}"],
|
85
85
|
proc2_log_lines[1,5])
|
86
86
|
end
|
87
87
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: brontes3d-production_log_analyzer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: "
|
4
|
+
version: "2009072100"
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eric Hodel
|
@@ -61,8 +61,8 @@ files:
|
|
61
61
|
- test/test_analyzer.rb
|
62
62
|
- test/test_parser.rb
|
63
63
|
- test/test_helper.rb
|
64
|
-
- lib/
|
65
|
-
- test/
|
64
|
+
- lib/rack_logging_per_proc.rb
|
65
|
+
- test/test_rack_logging_per_proc.rb
|
66
66
|
- test/test_syslogs/test.syslog.0.14.x.log
|
67
67
|
- test/test_syslogs/test.syslog.1.2.shortname.log
|
68
68
|
- test/test_syslogs/test.syslog.empty.log
|
@@ -1,55 +0,0 @@
|
|
1
|
-
class PassengerLogPerProc
|
2
|
-
|
3
|
-
cattr_accessor :log_path_prefix
|
4
|
-
|
5
|
-
def self.logger_mutex
|
6
|
-
@@logger_mutex ||= Mutex.new
|
7
|
-
end
|
8
|
-
|
9
|
-
# with log_path_with_prefix like {RAILS_ROOT}/log/passenger/{RAILS_ENV}
|
10
|
-
# you will get logs like {RAILS_ROOT}/log/passenger/{RAILS_ENV}_{Pid}.log
|
11
|
-
def self.enable(log_path_with_prefix)
|
12
|
-
PassengerLogPerProc.log_path_prefix = log_path_with_prefix
|
13
|
-
PhusionPassenger::Rack::RequestHandler.class_eval do
|
14
|
-
cattr_accessor :process_logger
|
15
|
-
|
16
|
-
def process_request_with_extra_logging(env, input, output)
|
17
|
-
unless self.class.process_logger
|
18
|
-
PhusionPassenger::Rack::RequestHandler.process_logger = ActiveSupport::BufferedLogger.new(PassengerLogPerProc.log_path_prefix + "_#{Process.pid}" + ".log")
|
19
|
-
|
20
|
-
PhusionPassenger::Rack::RequestHandler.process_logger.debug("\nPassenger logging started")
|
21
|
-
|
22
|
-
RAILS_DEFAULT_LOGGER.instance_eval do
|
23
|
-
class << self
|
24
|
-
def add(severity, message = nil, progname = nil, &block)
|
25
|
-
to_return = super
|
26
|
-
if to_return
|
27
|
-
Thread.current[:passenger_logs] ||= []
|
28
|
-
Thread.current[:passenger_logs] << [severity, to_return.strip]
|
29
|
-
end
|
30
|
-
to_return
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
Thread.current[:passenger_logs] ||= []
|
37
|
-
start_time = Time.now
|
38
|
-
process_request_without_extra_logging(env, input, output)
|
39
|
-
ensure
|
40
|
-
PassengerLogPerProc.logger_mutex.synchronize do
|
41
|
-
PhusionPassenger::Rack::RequestHandler.process_logger.info("RECEIVE_REQUEST (#{Process.pid}) #{env['REQUEST_METHOD']} #{env['REQUEST_URI']} #{start_time}")
|
42
|
-
Thread.current[:passenger_logs].each do |to_log|
|
43
|
-
PhusionPassenger::Rack::RequestHandler.process_logger.add(to_log[0], to_log[1])
|
44
|
-
end
|
45
|
-
PhusionPassenger::Rack::RequestHandler.process_logger.info("#{Time.now} (#{Process.pid}) RESPONSE_SENT")
|
46
|
-
PhusionPassenger::Rack::RequestHandler.process_logger.info("\n")
|
47
|
-
Thread.current[:passenger_logs] = []
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
alias_method_chain :process_request, :extra_logging
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
end
|