semantic_logger 0.11.1 → 0.11.2
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/semantic_logger.rb +1 -0
- data/lib/semantic_logger/logger.rb +53 -37
- data/lib/semantic_logger/railtie.rb +4 -2
- data/lib/semantic_logger/version.rb +1 -1
- metadata +3 -3
data/lib/semantic_logger.rb
CHANGED
@@ -31,16 +31,10 @@
|
|
31
31
|
#
|
32
32
|
module SemanticLogger
|
33
33
|
class Logger < Base
|
34
|
-
|
35
|
-
|
36
|
-
# Add or remove logging appenders to the appenders Array
|
34
|
+
# Add or remove logging appenders to the thread-safe appenders Array
|
37
35
|
# Appenders will be written to in the order that they appear in this list
|
38
|
-
|
39
|
-
|
40
|
-
@@appender_thread = Thread.new { appender_thread }
|
41
|
-
|
42
|
-
# Thread safe appenders array
|
43
|
-
ThreadSafe::Array.new
|
36
|
+
def self.appenders
|
37
|
+
@@appenders
|
44
38
|
end
|
45
39
|
|
46
40
|
# Returns a Logger instance
|
@@ -84,9 +78,9 @@ module SemanticLogger
|
|
84
78
|
# Flush all queued log entries disk, database, etc.
|
85
79
|
# All queued log messages are written and then each appender is flushed in turn
|
86
80
|
def self.flush
|
87
|
-
return false unless
|
81
|
+
return false unless appender_thread_active?
|
88
82
|
|
89
|
-
logger.debug "
|
83
|
+
logger.debug "Flushing appenders with #{queue_size} log messages on the queue"
|
90
84
|
reply_queue = Queue.new
|
91
85
|
queue << { :command => :flush, :reply_queue => reply_queue }
|
92
86
|
reply_queue.pop
|
@@ -117,16 +111,21 @@ module SemanticLogger
|
|
117
111
|
@@lag_threshold_s = time_threshold_s
|
118
112
|
end
|
119
113
|
|
120
|
-
#
|
121
|
-
|
122
|
-
|
114
|
+
# Allow the internal logger to be overridden from its default to STDERR
|
115
|
+
# Can be replaced with another Ruby logger or Rails logger, but never to
|
116
|
+
# SemanticLogger::Logger itself since it is for reporting problems
|
117
|
+
# while trying to log to the various appenders
|
118
|
+
def self.logger=(logger)
|
119
|
+
@@logger = logger
|
123
120
|
end
|
124
121
|
|
122
|
+
|
125
123
|
############################################################################
|
126
124
|
protected
|
127
125
|
|
126
|
+
@@appenders = ThreadSafe::Array.new
|
128
127
|
@@appender_thread = nil
|
129
|
-
@@queue
|
128
|
+
@@queue = Queue.new
|
130
129
|
|
131
130
|
# Queue to hold messages that need to be logged to the various appenders
|
132
131
|
def self.queue
|
@@ -136,19 +135,31 @@ module SemanticLogger
|
|
136
135
|
# Place log request on the queue for the Appender thread to write to each
|
137
136
|
# appender in the order that they were registered
|
138
137
|
def log(log)
|
139
|
-
self.class.queue << log if
|
138
|
+
self.class.queue << log if @@appender_thread
|
140
139
|
end
|
141
140
|
|
142
141
|
# Internal logger for SemanticLogger
|
143
142
|
# For example when an appender is not working etc..
|
144
143
|
# By default logs to STDERR
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
144
|
+
def self.logger
|
145
|
+
@@logger ||= begin
|
146
|
+
l = SemanticLogger::Appender::File.new(STDERR, :warn)
|
147
|
+
l.name = self.class.name
|
148
|
+
l
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# Start the appender thread
|
153
|
+
def self.start_appender_thread
|
154
|
+
return false if appender_thread_active?
|
155
|
+
@@appender_thread = Thread.new { appender_thread }
|
156
|
+
raise "Failed to start Appender Thread" unless @@appender_thread
|
157
|
+
true
|
158
|
+
end
|
159
|
+
|
160
|
+
# Returns true if the appender_thread is active
|
161
|
+
def self.appender_thread_active?
|
162
|
+
@@appender_thread && @@appender_thread.alive?
|
152
163
|
end
|
153
164
|
|
154
165
|
# Separate appender thread responsible for reading log messages and
|
@@ -159,7 +170,7 @@ module SemanticLogger
|
|
159
170
|
#
|
160
171
|
# Should any appender fail to log or flush, the exception is logged and
|
161
172
|
# other appenders will still be called
|
162
|
-
logger.
|
173
|
+
logger.debug "V#{VERSION} Appender thread active"
|
163
174
|
begin
|
164
175
|
count = 0
|
165
176
|
while message = queue.pop
|
@@ -168,14 +179,14 @@ module SemanticLogger
|
|
168
179
|
begin
|
169
180
|
appender.log(message)
|
170
181
|
rescue Exception => exc
|
171
|
-
logger.error "
|
182
|
+
logger.error "Appender thread: Failed to log to appender: #{appender.inspect}", exc
|
172
183
|
end
|
173
184
|
end
|
174
185
|
count += 1
|
175
186
|
# Check every few log messages whether this appender thread is falling behind
|
176
187
|
if count > lag_check_interval
|
177
188
|
if (diff = Time.now - message.time) > lag_threshold_s
|
178
|
-
logger.warn "
|
189
|
+
logger.warn "Appender thread has fallen behind by #{diff} seconds with #{queue_size} messages queued up. Consider reducing the log level or changing the appenders"
|
179
190
|
end
|
180
191
|
count = 0
|
181
192
|
end
|
@@ -184,32 +195,37 @@ module SemanticLogger
|
|
184
195
|
when :flush
|
185
196
|
appenders.each do |appender|
|
186
197
|
begin
|
187
|
-
logger.info "
|
198
|
+
logger.info "Appender thread: Flushing appender: #{appender.name}"
|
188
199
|
appender.flush
|
189
200
|
rescue Exception => exc
|
190
|
-
logger.error "
|
201
|
+
logger.error "Appender thread: Failed to flush appender: #{appender.inspect}", exc
|
191
202
|
end
|
192
203
|
end
|
193
204
|
|
194
205
|
message[:reply_queue] << true if message[:reply_queue]
|
195
|
-
logger.info "
|
206
|
+
logger.info "Appender thread: All appenders flushed"
|
196
207
|
else
|
197
|
-
logger.warn "
|
208
|
+
logger.warn "Appender thread: Ignoring unknown command: #{message[:command]}"
|
198
209
|
end
|
199
210
|
end
|
200
211
|
end
|
201
212
|
rescue Exception => exception
|
202
|
-
logger.error "
|
213
|
+
logger.error "Appender thread restarting due to exception", exception
|
203
214
|
retry
|
204
215
|
ensure
|
205
|
-
logger.debug "
|
216
|
+
logger.debug "Appender thread has stopped"
|
217
|
+
@@appender_thread = nil
|
206
218
|
end
|
207
219
|
end
|
208
220
|
|
209
|
-
|
210
|
-
|
221
|
+
# Flush all appenders at exit, waiting for outstanding messages on the queue
|
222
|
+
# to be written first
|
223
|
+
at_exit do
|
224
|
+
flush
|
225
|
+
end
|
211
226
|
|
212
|
-
|
213
|
-
|
227
|
+
# Start appender thread on load to workaround intermittent startup issues
|
228
|
+
# with JRuby 1.8.6 under Trinidad in 1.9 mode
|
229
|
+
start_appender_thread
|
230
|
+
end
|
214
231
|
end
|
215
|
-
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'logger'
|
1
2
|
module SemanticLogger #:nodoc:
|
2
3
|
class Railtie < Rails::Railtie #:nodoc:
|
3
4
|
# Make the SemanticLogger config available in the Rails application config
|
@@ -40,11 +41,12 @@ module SemanticLogger #:nodoc:
|
|
40
41
|
|
41
42
|
# Set internal logger to log to file only, in case another appender
|
42
43
|
# experiences logging problems
|
43
|
-
|
44
|
+
appender = SemanticLogger::Appender::File.new(path)
|
45
|
+
appender.name = "SemanticLogger::Logger"
|
46
|
+
SemanticLogger::Logger.logger = appender
|
44
47
|
|
45
48
|
# Add the log file to the list of appenders
|
46
49
|
SemanticLogger::Logger.appenders << SemanticLogger::Appender::File.new(path)
|
47
|
-
|
48
50
|
SemanticLogger::Logger.new(Rails)
|
49
51
|
rescue StandardError
|
50
52
|
# If not able to log to file, log to standard error with warning level only
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: semantic_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.11.
|
4
|
+
version: 0.11.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-10-
|
12
|
+
date: 2012-10-31 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: sync_attr
|
@@ -108,7 +108,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
108
108
|
version: '0'
|
109
109
|
segments:
|
110
110
|
- 0
|
111
|
-
hash:
|
111
|
+
hash: 225054469971419847
|
112
112
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
113
113
|
none: false
|
114
114
|
requirements:
|