semantic_logger 4.0.0 → 4.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +55 -8
- data/lib/semantic_logger.rb +1 -2
- data/lib/semantic_logger/ansi_colors.rb +1 -2
- data/lib/semantic_logger/appender.rb +17 -15
- data/lib/semantic_logger/appender/bugsnag.rb +5 -4
- data/lib/semantic_logger/appender/elasticsearch.rb +102 -16
- data/lib/semantic_logger/appender/elasticsearch_http.rb +76 -0
- data/lib/semantic_logger/appender/file.rb +9 -25
- data/lib/semantic_logger/appender/graylog.rb +43 -38
- data/lib/semantic_logger/appender/honeybadger.rb +3 -5
- data/lib/semantic_logger/appender/http.rb +12 -15
- data/lib/semantic_logger/appender/kafka.rb +183 -0
- data/lib/semantic_logger/appender/mongodb.rb +3 -3
- data/lib/semantic_logger/appender/new_relic.rb +3 -7
- data/lib/semantic_logger/appender/sentry.rb +2 -5
- data/lib/semantic_logger/appender/splunk.rb +7 -10
- data/lib/semantic_logger/appender/splunk_http.rb +16 -16
- data/lib/semantic_logger/appender/syslog.rb +43 -122
- data/lib/semantic_logger/appender/tcp.rb +28 -9
- data/lib/semantic_logger/appender/udp.rb +4 -7
- data/lib/semantic_logger/appender/wrapper.rb +3 -7
- data/lib/semantic_logger/base.rb +47 -7
- data/lib/semantic_logger/formatters/base.rb +29 -10
- data/lib/semantic_logger/formatters/color.rb +75 -45
- data/lib/semantic_logger/formatters/default.rb +53 -28
- data/lib/semantic_logger/formatters/json.rb +7 -8
- data/lib/semantic_logger/formatters/raw.rb +97 -1
- data/lib/semantic_logger/formatters/syslog.rb +46 -80
- data/lib/semantic_logger/formatters/syslog_cee.rb +57 -0
- data/lib/semantic_logger/log.rb +17 -67
- data/lib/semantic_logger/logger.rb +17 -27
- data/lib/semantic_logger/processor.rb +70 -46
- data/lib/semantic_logger/semantic_logger.rb +130 -69
- data/lib/semantic_logger/subscriber.rb +18 -32
- data/lib/semantic_logger/version.rb +1 -1
- data/test/appender/elasticsearch_http_test.rb +75 -0
- data/test/appender/elasticsearch_test.rb +34 -27
- data/test/appender/file_test.rb +2 -2
- data/test/appender/honeybadger_test.rb +1 -1
- data/test/appender/kafka_test.rb +36 -0
- data/test/appender/new_relic_test.rb +1 -1
- data/test/appender/sentry_test.rb +1 -1
- data/test/appender/syslog_test.rb +2 -2
- data/test/appender/wrapper_test.rb +1 -1
- data/test/formatters/color_test.rb +154 -0
- data/test/formatters/default_test.rb +176 -0
- data/test/loggable_test.rb +1 -1
- data/test/logger_test.rb +47 -4
- data/test/measure_test.rb +2 -2
- data/test/semantic_logger_test.rb +34 -6
- data/test/test_helper.rb +8 -0
- metadata +14 -3
@@ -2,9 +2,105 @@ require 'json'
|
|
2
2
|
module SemanticLogger
|
3
3
|
module Formatters
|
4
4
|
class Raw < Base
|
5
|
+
|
6
|
+
# Fields are added by populating this hash.
|
7
|
+
attr_accessor :hash, :log, :logger
|
8
|
+
|
9
|
+
# Host name
|
10
|
+
def host
|
11
|
+
hash[:host] = logger.host if log_host && logger.host
|
12
|
+
end
|
13
|
+
|
14
|
+
# Application name
|
15
|
+
def application
|
16
|
+
hash[:application] = logger.application if log_application && logger.application
|
17
|
+
end
|
18
|
+
|
19
|
+
# Date & time
|
20
|
+
def time
|
21
|
+
hash[:time] = log.time
|
22
|
+
end
|
23
|
+
|
24
|
+
# Log level
|
25
|
+
def level
|
26
|
+
hash[:level] = log.level
|
27
|
+
hash[:level_index] = log.level_index
|
28
|
+
end
|
29
|
+
|
30
|
+
# Process info
|
31
|
+
def process_info
|
32
|
+
hash[:pid] = $$
|
33
|
+
hash[:thread] = log.thread_name
|
34
|
+
|
35
|
+
file, line = log.file_name_and_line
|
36
|
+
if file
|
37
|
+
hash[:file] = file
|
38
|
+
hash[:line] = line.to_i
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# Tags
|
43
|
+
def tags
|
44
|
+
hash[:tags] = log.tags if log.tags && !log.tags.empty?
|
45
|
+
end
|
46
|
+
|
47
|
+
# Named Tags
|
48
|
+
def named_tags
|
49
|
+
hash[:named_tags] = log.named_tags if log.named_tags && !log.named_tags.empty?
|
50
|
+
end
|
51
|
+
|
52
|
+
# Duration
|
53
|
+
def duration
|
54
|
+
return unless log.duration
|
55
|
+
|
56
|
+
hash[:duration_ms] = log.duration
|
57
|
+
hash[:duration] = log.duration_human
|
58
|
+
end
|
59
|
+
|
60
|
+
# Class / app name
|
61
|
+
def name
|
62
|
+
hash[:name] = log.name
|
63
|
+
end
|
64
|
+
|
65
|
+
# Log message
|
66
|
+
def message
|
67
|
+
hash[:message] = log.cleansed_message if log.message
|
68
|
+
end
|
69
|
+
|
70
|
+
# Payload
|
71
|
+
def payload
|
72
|
+
hash[:payload] = log.payload if log.payload && log.payload.respond_to?(:empty?) && !log.payload.empty?
|
73
|
+
end
|
74
|
+
|
75
|
+
# Exception
|
76
|
+
def exception
|
77
|
+
return unless log.exception
|
78
|
+
root = hash
|
79
|
+
log.each_exception do |exception, i|
|
80
|
+
name = i == 0 ? :exception : :cause
|
81
|
+
root[name] = {
|
82
|
+
name: exception.class.name,
|
83
|
+
message: exception.message,
|
84
|
+
stack_trace: exception.backtrace
|
85
|
+
}
|
86
|
+
root = root[name]
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Metric
|
91
|
+
def metric
|
92
|
+
hash[:metric] = log.metric if log.metric
|
93
|
+
hash[:metric_amount] = log.metric_amount if log.metric_amount
|
94
|
+
end
|
95
|
+
|
5
96
|
# Returns log messages in Hash format
|
6
97
|
def call(log, logger)
|
7
|
-
|
98
|
+
self.hash = {}
|
99
|
+
self.log = log
|
100
|
+
self.logger = logger
|
101
|
+
|
102
|
+
host; application; time; level; process_info; duration; tags; named_tags; name; message; payload; exception; metric
|
103
|
+
hash
|
8
104
|
end
|
9
105
|
|
10
106
|
end
|
@@ -7,112 +7,78 @@ end
|
|
7
7
|
module SemanticLogger
|
8
8
|
module Formatters
|
9
9
|
class Syslog < Default
|
10
|
-
attr_accessor :level_map, :
|
10
|
+
attr_accessor :level_map, :facility
|
11
11
|
|
12
|
-
# Default
|
12
|
+
# Default level map for every log level
|
13
13
|
#
|
14
|
+
# :fatal => ::Syslog::LOG_CRIT - "A critical condition has occurred"
|
15
|
+
# :error => ::Syslog::LOG_ERR - "An error occurred"
|
16
|
+
# :warning =>::Syslog::LOG_WARNING - "Warning of a possible problem"
|
17
|
+
# :info => ::Syslog::LOG_NOTICE - "A normal but significant condition occurred"
|
18
|
+
# :debug => ::Syslog::LOG_INFO - "Informational message"
|
19
|
+
# :trace => ::Syslog::LOG_DEBUG - "Debugging information"
|
20
|
+
#
|
21
|
+
# The following levels are not used by default.
|
14
22
|
# ::Syslog::LOG_EMERG - "System is unusable"
|
15
23
|
# ::Syslog::LOG_ALERT - "Action needs to be taken immediately"
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
class LevelMap
|
25
|
+
attr_accessor :trace, :debug, :info, :warn, :error, :fatal
|
26
|
+
|
27
|
+
def initialize(trace: ::Syslog::LOG_DEBUG, debug: ::Syslog::LOG_INFO, info: ::Syslog::LOG_NOTICE, warn: ::Syslog::LOG_WARNING, error: ::Syslog::LOG_ERR, fatal: ::Syslog::LOG_CRIT)
|
28
|
+
@trace = trace
|
29
|
+
@debug = debug
|
30
|
+
@info = info
|
31
|
+
@warn = warn
|
32
|
+
@error = error
|
33
|
+
@fatal = fatal
|
34
|
+
end
|
35
|
+
|
36
|
+
def [](level)
|
37
|
+
public_send(level)
|
38
|
+
end
|
39
|
+
end
|
30
40
|
|
31
41
|
# Create a Syslog Log Formatter
|
32
42
|
#
|
33
43
|
# Parameters:
|
34
|
-
# options: [Integer]
|
35
|
-
# Default: ::Syslog::LOG_PID | ::Syslog::LOG_CONS
|
36
|
-
# Any of the following (options can be logically OR'd together)
|
37
|
-
# ::Syslog::LOG_CONS
|
38
|
-
# ::Syslog::LOG_NDELAY
|
39
|
-
# ::Syslog::LOG_NOWAIT
|
40
|
-
# ::Syslog::LOG_ODELAY
|
41
|
-
# ::Syslog::LOG_PERROR
|
42
|
-
# ::Syslog::LOG_PID
|
43
|
-
#
|
44
44
|
# facility: [Integer]
|
45
45
|
# Default: ::Syslog::LOG_USER
|
46
|
-
# Type of program (can be logically OR'd together)
|
47
|
-
# ::Syslog::LOG_AUTH
|
48
|
-
# ::Syslog::LOG_AUTHPRIV
|
49
|
-
# ::Syslog::LOG_CONSOLE
|
50
|
-
# ::Syslog::LOG_CRON
|
51
|
-
# ::Syslog::LOG_DAEMON
|
52
|
-
# ::Syslog::LOG_FTP
|
53
|
-
# ::Syslog::LOG_KERN
|
54
|
-
# ::Syslog::LOG_LRP
|
55
|
-
# ::Syslog::LOG_MAIL
|
56
|
-
# ::Syslog::LOG_NEWS
|
57
|
-
# ::Syslog::LOG_NTP
|
58
|
-
# ::Syslog::LOG_SECURITY
|
59
|
-
# ::Syslog::LOG_SYSLOG
|
60
|
-
# ::Syslog::LOG_USER
|
61
|
-
# ::Syslog::LOG_UUCP
|
62
|
-
# ::Syslog::LOG_LOCAL0
|
63
|
-
# ::Syslog::LOG_LOCAL1
|
64
|
-
# ::Syslog::LOG_LOCAL2
|
65
|
-
# ::Syslog::LOG_LOCAL3
|
66
|
-
# ::Syslog::LOG_LOCAL4
|
67
|
-
# ::Syslog::LOG_LOCAL5
|
68
|
-
# ::Syslog::LOG_LOCAL6
|
69
|
-
# ::Syslog::LOG_LOCAL7
|
70
46
|
#
|
71
|
-
# level_map: [Hash]
|
47
|
+
# level_map: [Hash | SemanticLogger::Formatters::Syslog::LevelMap]
|
72
48
|
# Supply a custom map of SemanticLogger levels to syslog levels.
|
73
|
-
#
|
74
|
-
#
|
75
|
-
#
|
76
|
-
#
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
#
|
84
|
-
|
85
|
-
|
86
|
-
def initialize(options = {})
|
87
|
-
options = options.dup
|
88
|
-
@options = options.delete(:options) || (::Syslog::LOG_PID | ::Syslog::LOG_CONS)
|
89
|
-
@facility = options.delete(:facility) || ::Syslog::LOG_USER
|
90
|
-
@level_map = DEFAULT_LEVEL_MAP.dup
|
91
|
-
if level_map = options.delete(:level_map)
|
92
|
-
@level_map.update(level_map)
|
93
|
-
end
|
94
|
-
# Time is already part of Syslog packet
|
95
|
-
options[:time_format] = nil unless options.has_key?(:time_format)
|
96
|
-
super(options)
|
49
|
+
#
|
50
|
+
# Example:
|
51
|
+
# # Change the warn level to LOG_NOTICE level instead of a the default of LOG_WARNING.
|
52
|
+
# SemanticLogger.add_appender(appender: :syslog, level_map: {warn: ::Syslog::LOG_NOTICE})
|
53
|
+
def initialize(facility: ::Syslog::LOG_USER, level_map: LevelMap.new)
|
54
|
+
@facility = facility
|
55
|
+
@level_map = level_map.is_a?(LevelMap) ? level_map : LevelMap.new(level_map)
|
56
|
+
super()
|
57
|
+
end
|
58
|
+
|
59
|
+
# Time is part of the syslog packet and is not included in the formatted message.
|
60
|
+
def time
|
61
|
+
nil
|
97
62
|
end
|
98
63
|
|
99
64
|
def call(log, logger)
|
100
65
|
message = super(log, logger)
|
101
|
-
create_syslog_packet(
|
66
|
+
create_syslog_packet(message)
|
102
67
|
end
|
103
68
|
|
69
|
+
private
|
70
|
+
|
104
71
|
# Create Syslog Packet
|
105
|
-
def create_syslog_packet(
|
72
|
+
def create_syslog_packet(message)
|
106
73
|
packet = SyslogProtocol::Packet.new
|
107
|
-
packet.hostname = host
|
74
|
+
packet.hostname = logger.host
|
108
75
|
packet.facility = facility
|
109
|
-
packet.tag = application.gsub(' ', '')
|
76
|
+
packet.tag = logger.application.gsub(' ', '')
|
110
77
|
packet.content = message
|
111
78
|
packet.time = log.time
|
112
79
|
packet.severity = level_map[log.level]
|
113
80
|
packet.to_s
|
114
81
|
end
|
115
|
-
|
116
82
|
end
|
117
83
|
end
|
118
84
|
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
begin
|
2
|
+
require 'syslog_protocol'
|
3
|
+
rescue LoadError
|
4
|
+
raise 'Gem syslog_protocol is required for remote logging using the Syslog protol. Please add the gem "syslog_protocol" to your Gemfile.'
|
5
|
+
end
|
6
|
+
|
7
|
+
module SemanticLogger
|
8
|
+
module Formatters
|
9
|
+
class SyslogCee < Raw
|
10
|
+
attr_accessor :level_map, :facility
|
11
|
+
|
12
|
+
# CEE JSON Syslog format
|
13
|
+
# Untested prototype code. Based on documentation only.
|
14
|
+
# If this works for you, please let us know by opening an issue.
|
15
|
+
#
|
16
|
+
# Parameters:
|
17
|
+
# facility: [Integer]
|
18
|
+
# Default: ::Syslog::LOG_USER
|
19
|
+
#
|
20
|
+
# level_map: [Hash | SemanticLogger::Formatters::Syslog::LevelMap]
|
21
|
+
# Supply a custom map of SemanticLogger levels to syslog levels.
|
22
|
+
#
|
23
|
+
# Example:
|
24
|
+
# # Log via udp to a remote syslog server on host: `server1` and port `8514`, using the CEE format.
|
25
|
+
# SemanticLogger.add_appender(appender: :syslog, formatter: syslog_cee, url: 'udp://server1:8514')
|
26
|
+
def initialize(facility: ::Syslog::LOG_USER, level_map: SemanticLogger::Formatters::Syslog::LevelMap.new)
|
27
|
+
@facility = facility
|
28
|
+
@level_map = level_map.is_a?(SemanticLogger::Formatters::Syslog::LevelMap) ? level_map : SemanticLogger::Formatters::Syslog::LevelMap.new(level_map)
|
29
|
+
super()
|
30
|
+
end
|
31
|
+
|
32
|
+
# Time is part of the syslog packet and is not included in the formatted message.
|
33
|
+
def time
|
34
|
+
end
|
35
|
+
|
36
|
+
def call(log, logger)
|
37
|
+
hash = super(log, logger)
|
38
|
+
create_syslog_packet("@cee: #{hash.to_json}")
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
# Create Syslog Packet
|
44
|
+
def create_syslog_packet(message)
|
45
|
+
packet = SyslogProtocol::Packet.new
|
46
|
+
packet.hostname = logger.host
|
47
|
+
packet.facility = facility
|
48
|
+
packet.tag = logger.application.gsub(' ', '')
|
49
|
+
packet.content = message
|
50
|
+
packet.time = log.time
|
51
|
+
packet.severity = level_map[log.level]
|
52
|
+
packet.to_s
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
data/lib/semantic_logger/log.rb
CHANGED
@@ -43,8 +43,11 @@ module SemanticLogger
|
|
43
43
|
# metric_amount [Numeric]
|
44
44
|
# Used for numeric or counter metrics.
|
45
45
|
# For example, the number of inquiries or, the amount purchased etc.
|
46
|
+
#
|
47
|
+
# context [Hash]
|
48
|
+
# Named contexts that were captured when the log entry was created.
|
46
49
|
class Log
|
47
|
-
attr_accessor :level, :thread_name, :name, :message, :payload, :time, :duration, :tags, :level_index, :exception, :metric, :backtrace, :metric_amount, :named_tags
|
50
|
+
attr_accessor :level, :thread_name, :name, :message, :payload, :time, :duration, :tags, :level_index, :exception, :metric, :backtrace, :metric_amount, :named_tags, :context
|
48
51
|
|
49
52
|
def initialize(name, level, index = nil)
|
50
53
|
@level = level
|
@@ -180,7 +183,7 @@ module SemanticLogger
|
|
180
183
|
# Returns [String] duration of the log entry as a string
|
181
184
|
# Returns nil if their is no duration
|
182
185
|
# Java time precision does not include microseconds
|
183
|
-
if
|
186
|
+
if Formatters::Base::PRECISION == 3
|
184
187
|
def duration_to_s
|
185
188
|
"#{duration.to_i}ms" if duration
|
186
189
|
end
|
@@ -256,75 +259,22 @@ module SemanticLogger
|
|
256
259
|
!(payload.nil? || (payload.respond_to?(:empty?) && payload.empty?))
|
257
260
|
end
|
258
261
|
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
# DEPRECATED
|
263
|
-
def formatted_time
|
264
|
-
"#{time.strftime('%Y-%m-%d %H:%M:%S')}.#{'%03d' % (time.usec/1000)}"
|
265
|
-
end
|
266
|
-
else
|
267
|
-
# Return the Time as a formatted string
|
268
|
-
# Ruby MRI supports micro seconds
|
269
|
-
# DEPRECATED
|
270
|
-
def formatted_time
|
271
|
-
"#{time.strftime('%Y-%m-%d %H:%M:%S')}.#{'%06d' % (time.usec)}"
|
272
|
-
end
|
262
|
+
# DEPRECATED
|
263
|
+
def formatted_time
|
264
|
+
time.strftime(Formatters::Base::TIME_FORMAT)
|
273
265
|
end
|
274
266
|
|
275
|
-
|
276
|
-
def to_h(host = SemanticLogger.host, application = SemanticLogger.application)
|
277
|
-
# Header
|
278
|
-
h = {
|
279
|
-
name: name,
|
280
|
-
pid: $$,
|
281
|
-
thread: thread_name,
|
282
|
-
time: time,
|
283
|
-
level: level,
|
284
|
-
level_index: level_index,
|
285
|
-
}
|
286
|
-
h[:host] = host if host
|
287
|
-
h[:application] = application if application
|
288
|
-
file, line = file_name_and_line
|
289
|
-
if file
|
290
|
-
h[:file] = file
|
291
|
-
h[:line] = line.to_i
|
292
|
-
end
|
293
|
-
|
294
|
-
# Tags
|
295
|
-
h[:tags] = tags if tags && !tags.empty?
|
296
|
-
h[:named_tags] = named_tags if named_tags && !named_tags.empty?
|
267
|
+
DeprecatedLogger = Struct.new(:host, :application)
|
297
268
|
|
298
|
-
|
299
|
-
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
# Log message
|
305
|
-
h[:message] = cleansed_message if message
|
306
|
-
|
307
|
-
# Payload
|
308
|
-
h[:payload] = payload if payload && payload.respond_to?(:empty?) && !payload.empty?
|
309
|
-
|
310
|
-
# Exceptions
|
311
|
-
if exception
|
312
|
-
root = h
|
313
|
-
each_exception do |exception, i|
|
314
|
-
name = i == 0 ? :exception : :cause
|
315
|
-
root[name] = {
|
316
|
-
name: exception.class.name,
|
317
|
-
message: exception.message,
|
318
|
-
stack_trace: exception.backtrace
|
319
|
-
}
|
320
|
-
root = root[name]
|
321
|
-
end
|
322
|
-
end
|
269
|
+
# DEPRECATED: Use SemanticLogger::Formatters::Raw
|
270
|
+
def to_h(host = SemanticLogger.host, application = SemanticLogger.application)
|
271
|
+
logger = DeprecatedLogger.new(host, application)
|
272
|
+
SemanticLogger::Formatters::Raw.new.call(self, logger)
|
273
|
+
end
|
323
274
|
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
h
|
275
|
+
# Lazy initializes the context hash and assigns a key value pair.
|
276
|
+
def set_context(key, value)
|
277
|
+
(self.context ||= {})[key] = value
|
328
278
|
end
|
329
279
|
|
330
280
|
private
|
@@ -13,7 +13,7 @@ module SemanticLogger
|
|
13
13
|
# logger = SemanticLogger::Logger.new('MyClass')
|
14
14
|
#
|
15
15
|
# Parameters:
|
16
|
-
#
|
16
|
+
# klass
|
17
17
|
# A class, module or a string with the application/class name
|
18
18
|
# to be used in the logger
|
19
19
|
#
|
@@ -26,47 +26,37 @@ module SemanticLogger
|
|
26
26
|
# regular expression. All other messages will be ignored
|
27
27
|
# Proc: Only include log messages where the supplied Proc returns true
|
28
28
|
# The Proc must return true or false
|
29
|
-
def initialize(klass, level=nil, filter=nil)
|
30
|
-
super
|
29
|
+
def initialize(klass, level = nil, filter = nil)
|
30
|
+
super(klass, level, filter)
|
31
31
|
end
|
32
32
|
|
33
|
-
#
|
34
|
-
#
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
33
|
+
# Place log request on the queue for the Appender thread to write to each
|
34
|
+
# appender in the order that they were registered
|
35
|
+
def log(log, message = nil, progname = nil, &block)
|
36
|
+
# Compatibility with ::Logger
|
37
|
+
return add(log, message, progname, &block) unless log.is_a?(SemanticLogger::Log)
|
38
|
+
Processor << log
|
39
|
+
end
|
40
|
+
|
41
|
+
# DEPRECATED
|
40
42
|
def self.queue_size
|
41
43
|
Processor.queue_size
|
42
44
|
end
|
43
45
|
|
44
|
-
#
|
45
|
-
# All queued log messages are written and then each appender is flushed in turn
|
46
|
+
# DEPRECATED
|
46
47
|
def self.flush
|
47
|
-
Processor.
|
48
|
+
Processor.flush
|
48
49
|
end
|
49
50
|
|
50
|
-
#
|
51
|
+
# DEPRECATED
|
51
52
|
def self.close
|
52
|
-
Processor.
|
53
|
+
Processor.close
|
53
54
|
end
|
54
55
|
|
55
|
-
#
|
56
|
-
# Can be replaced with another Ruby logger or Rails logger, but never to
|
57
|
-
# SemanticLogger::Logger itself since it is for reporting problems
|
58
|
-
# while trying to log to the various appenders
|
56
|
+
# DEPRECATED
|
59
57
|
def self.logger=(logger)
|
60
58
|
Processor.logger = logger
|
61
59
|
end
|
62
60
|
|
63
|
-
# Place log request on the queue for the Appender thread to write to each
|
64
|
-
# appender in the order that they were registered
|
65
|
-
def log(log, message = nil, progname = nil, &block)
|
66
|
-
# Compatibility with ::Logger
|
67
|
-
return add(log, message, progname, &block) unless log.is_a?(SemanticLogger::Log)
|
68
|
-
Processor << log
|
69
|
-
end
|
70
|
-
|
71
61
|
end
|
72
62
|
end
|