semantic_logger 2.10.0 → 2.11.0
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.
- checksums.yaml +4 -4
- data/README.md +6 -4
- data/lib/semantic_logger/appender/mongodb.rb +13 -10
- data/lib/semantic_logger/appender/splunk.rb +28 -25
- data/lib/semantic_logger/appender/syslog.rb +45 -37
- data/lib/semantic_logger/base.rb +24 -9
- data/lib/semantic_logger/version.rb +1 -1
- data/test/appender_file_test.rb +3 -9
- data/test/appender_mongodb_test.rb +23 -38
- data/test/appender_new_relic_test.rb +40 -37
- data/test/appender_splunk_test.rb +8 -17
- data/test/appender_syslog_test.rb +35 -32
- data/test/appender_wrapper_test.rb +2 -10
- data/test/loggable_test.rb +3 -10
- data/test/logger_test.rb +38 -33
- data/test/newrelic_rpm.rb +0 -13
- data/test/test_helper.rb +13 -0
- metadata +11 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d8ef6f216370a6763f9cd28aa1c5a098c1cc584e
|
4
|
+
data.tar.gz: c02264af59deef219f5970e8ec51b4af852ed48e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e5bf5e189ddccbcf52c57be758a53d8224777ec4a35c2beea4502a3c271cb15e82078ca67ab1aec4da5f5d80a1cf01ef4e8ccea20d9623c442eba0bc272a39b0
|
7
|
+
data.tar.gz: 4299412a428431a41126a3e6ba47ea6a3c19867c2393162dd61e02d8c6cda8ca5b084405cb1203bb7fc25044d5a47b6cf9e790ddf34fdccbd7b538d57903c1d0
|
data/README.md
CHANGED
@@ -7,19 +7,21 @@ Next generation logging system for Ruby to support highly concurrent, high throu
|
|
7
7
|
|
8
8
|
## Documentation
|
9
9
|
|
10
|
-
|
10
|
+
[Semantic Logger Guide](http://reidmorrison.github.io/semantic_logger)
|
11
|
+
|
12
|
+
API Documentation: [](https://www.omniref.com/ruby/gems/semantic_logger)
|
11
13
|
|
12
14
|
## Dependencies
|
13
15
|
|
14
16
|
Semantic Logger supports the following Ruby platforms:
|
15
|
-
- Ruby 1.9.3, 2.
|
17
|
+
- Ruby 1.9.3, 2.x
|
16
18
|
- JRuby 1.7
|
17
19
|
|
18
20
|
The following gems are only required when their corresponding appenders are being used,
|
19
21
|
and are therefore not automatically included by this gem:
|
20
22
|
- MongoDB Appender: gem 'mongo' 1.9.2 or above
|
21
23
|
- Syslog Appender: gem 'syslog_protocol' 0.9.2 or above
|
22
|
-
- Syslog Appender to a remote syslogng server over TCP or UDP: gem '
|
24
|
+
- Syslog Appender to a remote syslogng server over TCP or UDP: gem 'net_tcp_client'
|
23
25
|
- Splunk Appender: gem 'splunk-sdk-ruby'
|
24
26
|
|
25
27
|
## Install
|
@@ -58,7 +60,7 @@ This project uses [Semantic Versioning](http://semver.org/).
|
|
58
60
|
|
59
61
|
## License
|
60
62
|
|
61
|
-
Copyright 2012, 2013, 2014 Reid Morrison
|
63
|
+
Copyright 2012, 2013, 2014, 2015 Reid Morrison
|
62
64
|
|
63
65
|
Licensed under the Apache License, Version 2.0 (the "License");
|
64
66
|
you may not use this file except in compliance with the License.
|
@@ -30,7 +30,7 @@ module SemanticLogger
|
|
30
30
|
# }
|
31
31
|
#
|
32
32
|
class MongoDB < SemanticLogger::Appender::Base
|
33
|
-
attr_reader :db, :collection_name
|
33
|
+
attr_reader :db, :collection_name, :collection
|
34
34
|
attr_accessor :host_name, :write_concern, :application
|
35
35
|
|
36
36
|
# Create a MongoDB Appender instance
|
@@ -52,7 +52,7 @@ module SemanticLogger
|
|
52
52
|
# :write_concern [Integer]
|
53
53
|
# Write concern to use
|
54
54
|
# see: http://docs.mongodb.org/manual/reference/write-concern/
|
55
|
-
# Default:
|
55
|
+
# Default: 1
|
56
56
|
#
|
57
57
|
# :application [String]
|
58
58
|
# Name of the application to include in the document written to mongo
|
@@ -83,7 +83,7 @@ module SemanticLogger
|
|
83
83
|
@db = params[:db] || raise('Missing mandatory parameter :db')
|
84
84
|
@collection_name = params[:collection_name] || 'semantic_logger'
|
85
85
|
@host_name = params[:host_name] || Socket.gethostname.split('.').first
|
86
|
-
@write_concern = params[:write_concern] ||
|
86
|
+
@write_concern = params[:write_concern] || 1
|
87
87
|
@application = params[:application]
|
88
88
|
filter = params[:filter]
|
89
89
|
|
@@ -91,6 +91,8 @@ module SemanticLogger
|
|
91
91
|
@collection_size = params[:collection_size] || 1024**3
|
92
92
|
@collection_max = params[:collection_max]
|
93
93
|
|
94
|
+
reopen
|
95
|
+
|
94
96
|
# Create the collection and necessary indexes
|
95
97
|
create_indexes
|
96
98
|
|
@@ -98,6 +100,12 @@ module SemanticLogger
|
|
98
100
|
super(params[:level], filter, &block)
|
99
101
|
end
|
100
102
|
|
103
|
+
# After forking an active process call #reopen to re-open
|
104
|
+
# open the handles to resources
|
105
|
+
def reopen
|
106
|
+
@collection = db[@collection_name]
|
107
|
+
end
|
108
|
+
|
101
109
|
# Create the required capped collection
|
102
110
|
# Features of capped collection:
|
103
111
|
# * No indexes by default (not even on _id)
|
@@ -111,7 +119,7 @@ module SemanticLogger
|
|
111
119
|
options = {:capped => true, :size => @collection_size}
|
112
120
|
options[:max] = @collection_max if @collection_max
|
113
121
|
db.create_collection(collection_name, options)
|
114
|
-
|
122
|
+
db[@collection_name].ensure_index('tags')
|
115
123
|
end
|
116
124
|
|
117
125
|
# Purge all data from the capped collection by dropping the collection
|
@@ -123,11 +131,6 @@ module SemanticLogger
|
|
123
131
|
create_indexes
|
124
132
|
end
|
125
133
|
|
126
|
-
# Return the collection being used to write the log document to
|
127
|
-
def collection
|
128
|
-
@collection ||= db[collection_name]
|
129
|
-
end
|
130
|
-
|
131
134
|
# Flush all pending logs to disk.
|
132
135
|
# Waits for all sent documents to be written to disk
|
133
136
|
def flush
|
@@ -182,7 +185,7 @@ module SemanticLogger
|
|
182
185
|
return false if (level_index > (log.level_index || 0)) || !include_message?(log)
|
183
186
|
|
184
187
|
# Insert log entry into Mongo
|
185
|
-
collection.insert(formatter.call(log), :
|
188
|
+
collection.insert(formatter.call(log), w: @write_concern)
|
186
189
|
true
|
187
190
|
end
|
188
191
|
|
@@ -1,8 +1,6 @@
|
|
1
1
|
require 'splunk-sdk-ruby'
|
2
2
|
|
3
|
-
|
4
|
-
# Recommended not to use the colorized formatter.
|
5
|
-
|
3
|
+
# Note: Not recommended to use the colorized formatter.
|
6
4
|
class SemanticLogger::Appender::Splunk < SemanticLogger::Appender::Base
|
7
5
|
attr_reader :config, :index, :service, :service_index
|
8
6
|
|
@@ -12,17 +10,22 @@ class SemanticLogger::Appender::Splunk < SemanticLogger::Appender::Base
|
|
12
10
|
# Parse input options for setting up splunk connection
|
13
11
|
parse_options(options)
|
14
12
|
|
13
|
+
reopen
|
14
|
+
|
15
|
+
# Pass on the level and custom formatter if supplied
|
16
|
+
super(level, &block)
|
17
|
+
end
|
18
|
+
|
19
|
+
# After forking an active process call #reopen to re-open
|
20
|
+
# open the handles to resources
|
21
|
+
def reopen
|
15
22
|
# Connect to splunk. Connect is a synonym for creating a Service by hand and calling login.
|
16
23
|
@service = Splunk::connect(@config)
|
17
24
|
|
18
25
|
# The index we are logging to
|
19
26
|
@service_index = @service.indexes[@index]
|
20
|
-
|
21
|
-
# Pass on the level and custom formatter if supplied
|
22
|
-
super(level, &block)
|
23
27
|
end
|
24
28
|
|
25
|
-
|
26
29
|
# Log the message to Splunk
|
27
30
|
def log(log)
|
28
31
|
# Ensure minimum log level is met, and check filter
|
@@ -34,23 +37,23 @@ class SemanticLogger::Appender::Splunk < SemanticLogger::Appender::Base
|
|
34
37
|
|
35
38
|
private
|
36
39
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
end
|
40
|
+
def parse_options(options)
|
41
|
+
@config = {
|
42
|
+
scheme: options[:scheme] || :https,
|
43
|
+
host: options[:host] || 'localhost',
|
44
|
+
port: options[:port] || 8089,
|
45
|
+
username: options[:username],
|
46
|
+
password: options[:password]
|
47
|
+
}
|
48
|
+
|
49
|
+
@index = options[:index]
|
50
|
+
|
51
|
+
if @config[:username].nil?
|
52
|
+
raise ArgumentError, 'Must supply a username.'
|
53
|
+
elsif @config[:password].nil?
|
54
|
+
raise ArgumentError, 'Must supply a password.'
|
55
|
+
elsif @index.nil?
|
56
|
+
raise ArgumentError, 'Must supply an index.'
|
55
57
|
end
|
58
|
+
end
|
56
59
|
end
|
@@ -139,29 +139,28 @@ module SemanticLogger
|
|
139
139
|
# :tcp_client [Hash]
|
140
140
|
# Default: {}
|
141
141
|
# Only used with the TCP protocol.
|
142
|
-
# Specify custom parameters to pass into
|
143
|
-
# For a list of options see the
|
144
|
-
# https://
|
142
|
+
# Specify custom parameters to pass into Net::TCPClient.new
|
143
|
+
# For a list of options see the net_tcp_client documentation:
|
144
|
+
# https://www.omniref.com/ruby/gems/net_tcp_client/1.0.0/symbols/Net::TCPClient/initialize
|
145
145
|
def initialize(params = {}, &block)
|
146
|
-
params
|
147
|
-
@ident
|
148
|
-
options
|
149
|
-
@facility
|
150
|
-
filter
|
151
|
-
level
|
152
|
-
level_map
|
153
|
-
@level_map
|
146
|
+
params = params.dup
|
147
|
+
@ident = params.delete(:ident) || 'ruby'
|
148
|
+
@options = params.delete(:options) || (::Syslog::LOG_PID | ::Syslog::LOG_CONS)
|
149
|
+
@facility = params.delete(:facility) || ::Syslog::LOG_USER
|
150
|
+
filter = params.delete(:filter)
|
151
|
+
level = params.delete(:level)
|
152
|
+
level_map = params.delete(:level_map)
|
153
|
+
@level_map = DEFAULT_LEVEL_MAP.dup
|
154
154
|
@level_map.update(level_map) if level_map
|
155
|
-
@server
|
156
|
-
uri
|
157
|
-
@host
|
158
|
-
@protocol
|
155
|
+
@server = params.delete(:server) || 'syslog://localhost'
|
156
|
+
uri = URI(@server)
|
157
|
+
@host = uri.host || 'localhost'
|
158
|
+
@protocol = (uri.scheme || :syslog).to_sym
|
159
159
|
raise "Unknown protocol #{@protocol}!" unless [:syslog, :tcp, :udp].include?(@protocol)
|
160
|
-
@host
|
161
|
-
@port
|
162
|
-
|
163
|
-
@
|
164
|
-
tcp_client_options = params.delete(:tcp_client)
|
160
|
+
@host = 'localhost' if @protocol == :syslog
|
161
|
+
@port = URI(@server).port || 514
|
162
|
+
@local_hostname = params.delete(:local_hostname) || Socket.gethostname || `hostname`.strip
|
163
|
+
@tcp_client_options = params.delete(:tcp_client)
|
165
164
|
|
166
165
|
# Warn about any unknown configuration options.
|
167
166
|
params.each_pair { |key,val| SemanticLogger::Logger.logger.warn "Ignoring unknown configuration option: #{key.inspect} => #{val.inspect}" }
|
@@ -173,30 +172,39 @@ module SemanticLogger
|
|
173
172
|
rescue LoadError
|
174
173
|
raise 'Missing gem: syslog_protocol. This gem is required when logging over TCP or UDP. To fix this error: gem install syslog_protocol'
|
175
174
|
end
|
175
|
+
|
176
|
+
# The net_tcp_client gem is required when logging over TCP.
|
177
|
+
if protocol == :tcp
|
178
|
+
@tcp_client_options ||= {}
|
179
|
+
@tcp_client_options[:server] = "#{@host}:#{@port}"
|
180
|
+
begin
|
181
|
+
require 'net/tcp_client'
|
182
|
+
rescue LoadError
|
183
|
+
raise 'Missing gem: net_tcp_client. This gem is required when logging over TCP. To fix this error: gem install net_tcp_client'
|
184
|
+
end
|
185
|
+
end
|
176
186
|
end
|
177
187
|
|
188
|
+
reopen
|
189
|
+
|
190
|
+
super(level, filter, &block)
|
191
|
+
end
|
192
|
+
|
193
|
+
# After forking an active process call #reopen to re-open
|
194
|
+
# open the handles to resources
|
195
|
+
def reopen
|
178
196
|
case @protocol
|
179
197
|
when :syslog
|
180
|
-
::Syslog.open(@ident, options, @facility)
|
198
|
+
::Syslog.open(@ident, @options, @facility)
|
181
199
|
when :tcp
|
182
|
-
# The resilient_socket gem is required when logging over TCP.
|
183
|
-
begin
|
184
|
-
require 'resilient_socket'
|
185
|
-
rescue LoadError
|
186
|
-
raise 'Missing gem: resilient_socket. This gem is required when logging over TCP. To fix this error: gem install resilient_socket'
|
187
|
-
end
|
188
|
-
options = tcp_client_options || {}
|
189
|
-
options[:server] = "#{@host}:#{@port}"
|
190
|
-
@remote_syslog = ResilientSocket::TCPClient.new(options)
|
191
200
|
# Use the local logger for @remote_syslog so errors with the remote logger can be recorded locally.
|
192
|
-
@
|
201
|
+
@tcp_client_options[:logger] = SemanticLogger::Logger.logger
|
202
|
+
@remote_syslog = Net::TCPClient.new(@tcp_client_options)
|
193
203
|
when :udp
|
194
204
|
@remote_syslog = UDPSocket.new
|
195
205
|
else
|
196
|
-
raise "Unsupported protocol: #{protocol}"
|
206
|
+
raise "Unsupported protocol: #{@protocol}"
|
197
207
|
end
|
198
|
-
|
199
|
-
super(level, filter, &block)
|
200
208
|
end
|
201
209
|
|
202
210
|
# Write the log using the specified protocol and host.
|
@@ -221,7 +229,7 @@ module SemanticLogger
|
|
221
229
|
|
222
230
|
# Flush is called by the semantic_logger during shutdown.
|
223
231
|
def flush
|
224
|
-
|
232
|
+
@remote_syslog.flush if @remote_syslog && @remote_syslog.respond_to?(:flush)
|
225
233
|
end
|
226
234
|
|
227
235
|
# Custom log formatter for syslog
|
@@ -245,8 +253,8 @@ module SemanticLogger
|
|
245
253
|
packet.hostname = @local_hostname
|
246
254
|
packet.facility = @facility
|
247
255
|
packet.severity = @level_map[log.level]
|
248
|
-
packet.tag
|
249
|
-
packet.content
|
256
|
+
packet.tag = @ident
|
257
|
+
packet.content = default_formatter.call(log)
|
250
258
|
packet.to_s
|
251
259
|
end
|
252
260
|
end
|
data/lib/semantic_logger/base.rb
CHANGED
@@ -320,11 +320,12 @@ module SemanticLogger
|
|
320
320
|
ensure
|
321
321
|
end_time = Time.now
|
322
322
|
# Extract options after block completes so that block can modify any of the options
|
323
|
-
log_exception
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
323
|
+
log_exception = params[:log_exception] || :partial
|
324
|
+
on_exception_level = params[:on_exception_level]
|
325
|
+
min_duration = params[:min_duration] || 0.0
|
326
|
+
payload = params[:payload]
|
327
|
+
metric = params[:metric]
|
328
|
+
duration = if block_given?
|
328
329
|
1000.0 * (end_time - start)
|
329
330
|
else
|
330
331
|
params[:duration] || raise("Mandatory block missing when :duration option is not supplied")
|
@@ -335,14 +336,28 @@ module SemanticLogger
|
|
335
336
|
payload = payload.nil? ? self.payload : self.payload.merge(payload)
|
336
337
|
end
|
337
338
|
if exception
|
339
|
+
logged_exception = exception
|
338
340
|
case log_exception
|
339
341
|
when :full
|
340
|
-
|
341
|
-
|
342
|
+
# On exception change the log level
|
343
|
+
if on_exception_level
|
344
|
+
level = on_exception_level
|
345
|
+
index = SemanticLogger.level_to_index(level)
|
346
|
+
end
|
342
347
|
when :partial
|
343
|
-
|
344
|
-
|
348
|
+
# On exception change the log level
|
349
|
+
if on_exception_level
|
350
|
+
level = on_exception_level
|
351
|
+
index = SemanticLogger.level_to_index(level)
|
352
|
+
end
|
353
|
+
message = "#{message} -- Exception: #{exception.class}: #{exception.message}"
|
354
|
+
logged_exception = nil
|
355
|
+
else
|
356
|
+
# Log the message with its duration but leave out the exception that was raised
|
357
|
+
logged_exception = nil
|
345
358
|
end
|
359
|
+
struct = Log.new(level, Thread.current.name, name, message, payload, end_time, duration, tags, index, logged_exception, metric)
|
360
|
+
log(struct) if include_message?(struct)
|
346
361
|
raise exception
|
347
362
|
elsif duration >= min_duration
|
348
363
|
# Only log if the block took longer than 'min_duration' to complete
|
data/test/appender_file_test.rb
CHANGED
@@ -1,16 +1,10 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'shoulda'
|
7
|
-
require 'logger'
|
8
|
-
require 'semantic_logger'
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
2
|
+
require 'test_helper'
|
9
3
|
require 'stringio'
|
10
4
|
|
11
5
|
# Unit Test for SemanticLogger::Appender::File
|
12
6
|
#
|
13
|
-
class AppenderFileTest < Test
|
7
|
+
class AppenderFileTest < Minitest::Test
|
14
8
|
context SemanticLogger::Appender::File do
|
15
9
|
setup do
|
16
10
|
SemanticLogger.default_level = :trace
|
@@ -1,26 +1,21 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'shoulda'
|
7
|
-
require 'mongo'
|
8
|
-
require 'semantic_logger'
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
2
|
+
require 'test_helper'
|
9
3
|
|
10
4
|
# Unit Test for SemanticLogger::Appender::MongoDB
|
11
5
|
#
|
12
|
-
class AppenderMongoDBTest < Test
|
6
|
+
class AppenderMongoDBTest < Minitest::Test
|
13
7
|
context SemanticLogger::Appender::MongoDB do
|
14
8
|
setup do
|
15
9
|
@db = Mongo::Connection.new['test']
|
16
10
|
@appender = SemanticLogger::Appender::MongoDB.new(
|
17
|
-
:
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
11
|
+
db: @db,
|
12
|
+
collection_size: 10*1024**2, # 10MB
|
13
|
+
host_name: 'test',
|
14
|
+
application: 'test_application',
|
15
|
+
level: :trace
|
21
16
|
)
|
22
17
|
@hash = { :tracking_number => 12345, :session_id => 'HSSKLEU@JDK767'}
|
23
|
-
|
18
|
+
Thread.current.name = 'thread'
|
24
19
|
end
|
25
20
|
|
26
21
|
teardown do
|
@@ -30,12 +25,12 @@ class AppenderMongoDBTest < Test::Unit::TestCase
|
|
30
25
|
context "format logs into documents" do
|
31
26
|
|
32
27
|
should "handle nil name, message and hash" do
|
33
|
-
@appender.
|
28
|
+
@appender.debug
|
34
29
|
document = @appender.collection.find_one
|
35
30
|
assert_equal :debug, document['level']
|
36
31
|
assert_equal nil, document['message']
|
37
|
-
assert_equal
|
38
|
-
|
32
|
+
assert_equal 'thread', document['thread_name']
|
33
|
+
assert document['time'].is_a?(Time)
|
39
34
|
assert_equal nil, document['payload']
|
40
35
|
assert_equal $$, document['pid']
|
41
36
|
assert_equal 'test', document['host_name']
|
@@ -43,34 +38,27 @@ class AppenderMongoDBTest < Test::Unit::TestCase
|
|
43
38
|
end
|
44
39
|
|
45
40
|
should "handle nil message and payload" do
|
46
|
-
|
47
|
-
log.payload = @hash
|
48
|
-
@appender.log(log)
|
41
|
+
@appender.debug(@hash)
|
49
42
|
|
50
43
|
document = @appender.collection.find_one
|
51
44
|
assert_equal :debug, document['level']
|
52
|
-
assert_equal
|
53
|
-
assert_equal
|
54
|
-
|
55
|
-
|
45
|
+
assert_equal @hash.inspect, document['message']
|
46
|
+
assert_equal 'thread', document['thread_name']
|
47
|
+
assert document['time'].is_a?(Time)
|
48
|
+
assert_nil document['payload']
|
56
49
|
assert_equal $$, document['pid']
|
57
50
|
assert_equal 'test', document['host_name']
|
58
51
|
assert_equal 'test_application', document['application']
|
59
52
|
end
|
60
53
|
|
61
54
|
should "handle message and payload" do
|
62
|
-
|
63
|
-
log.message = 'hello world'
|
64
|
-
log.payload = @hash
|
65
|
-
log.thread_name = 'thread'
|
66
|
-
log.time = @time
|
67
|
-
@appender.log(log)
|
55
|
+
@appender.debug('hello world', @hash)
|
68
56
|
|
69
57
|
document = @appender.collection.find_one
|
70
58
|
assert_equal :debug, document['level']
|
71
59
|
assert_equal 'hello world', document['message']
|
72
60
|
assert_equal 'thread', document['thread_name']
|
73
|
-
|
61
|
+
assert document['time'].is_a?(Time)
|
74
62
|
assert_equal({ "tracking_number" => 12345, "session_id" => 'HSSKLEU@JDK767'}, document['payload'])
|
75
63
|
assert_equal $$, document['pid']
|
76
64
|
assert_equal 'test', document['host_name']
|
@@ -79,16 +67,13 @@ class AppenderMongoDBTest < Test::Unit::TestCase
|
|
79
67
|
|
80
68
|
should "handle message without payload" do
|
81
69
|
log = SemanticLogger::Base::Log.new(:debug)
|
82
|
-
|
83
|
-
log.thread_name = 'thread'
|
84
|
-
log.time = @time
|
85
|
-
@appender.log(log)
|
70
|
+
@appender.debug('hello world')
|
86
71
|
|
87
72
|
document = @appender.collection.find_one
|
88
73
|
assert_equal :debug, document['level']
|
89
74
|
assert_equal 'hello world', document['message']
|
90
75
|
assert_equal 'thread', document['thread_name']
|
91
|
-
|
76
|
+
assert document['time'].is_a?(Time)
|
92
77
|
assert_equal nil, document['payload']
|
93
78
|
assert_equal $$, document['pid']
|
94
79
|
assert_equal 'test', document['host_name']
|
@@ -100,12 +85,12 @@ class AppenderMongoDBTest < Test::Unit::TestCase
|
|
100
85
|
# Ensure that any log level can be logged
|
101
86
|
SemanticLogger::LEVELS.each do |level|
|
102
87
|
should "log #{level} information" do
|
103
|
-
@appender.
|
88
|
+
@appender.send(level, 'hello world -- Calculations', @hash)
|
104
89
|
document = @appender.collection.find_one
|
105
90
|
assert_equal level, document['level']
|
106
91
|
assert_equal 'hello world -- Calculations', document['message']
|
107
92
|
assert_equal 'thread', document['thread_name']
|
108
|
-
|
93
|
+
assert document['time'].is_a?(Time)
|
109
94
|
assert_equal({ "tracking_number" => 12345, "session_id" => 'HSSKLEU@JDK767'}, document['payload'])
|
110
95
|
assert_equal $$, document['pid']
|
111
96
|
assert_equal 'test', document['host_name']
|
@@ -1,22 +1,13 @@
|
|
1
|
-
# Allow test to be run in-place without requiring a gem install
|
2
|
-
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
3
|
-
# Load mocked newrelic_rpm from test directory
|
4
1
|
$LOAD_PATH.unshift File.dirname(__FILE__)
|
5
|
-
|
6
|
-
|
7
|
-
require 'rubygems'
|
8
|
-
require 'test/unit'
|
9
|
-
require 'shoulda'
|
10
|
-
require 'mocha/setup'
|
11
|
-
require 'semantic_logger'
|
2
|
+
require 'test_helper'
|
12
3
|
|
13
4
|
# Unit Test for SemanticLogger::Appender::NewRelic
|
14
5
|
#
|
15
|
-
class AppenderNewRelicTest < Test
|
6
|
+
class AppenderNewRelicTest < Minitest::Test
|
16
7
|
context SemanticLogger::Appender::NewRelic do
|
17
8
|
|
18
9
|
setup do
|
19
|
-
@appender = SemanticLogger::Appender::NewRelic.new
|
10
|
+
@appender = SemanticLogger::Appender::NewRelic.new(:error)
|
20
11
|
@message = 'AppenderNewRelicTest log message'
|
21
12
|
@multi_line_message = <<-EOSTR
|
22
13
|
|
@@ -31,48 +22,60 @@ class AppenderNewRelicTest < Test::Unit::TestCase
|
|
31
22
|
|
32
23
|
(SemanticLogger::LEVELS - [:error, :fatal]).each do |level|
|
33
24
|
should "not send :#{level.to_s} notifications to New Relic" do
|
34
|
-
|
35
|
-
|
25
|
+
message = hash = nil
|
26
|
+
NewRelic::Agent.stub(:notice_error, -> msg, h { message = msg; hash = h }) do
|
27
|
+
@appender.tagged('test') do
|
28
|
+
@appender.send(level, "AppenderNewRelicTest #{level.to_s} message")
|
29
|
+
end
|
36
30
|
end
|
37
|
-
assert_nil
|
38
|
-
assert_nil
|
31
|
+
assert_nil message
|
32
|
+
assert_nil hash
|
39
33
|
end
|
40
34
|
end
|
41
35
|
|
42
36
|
[:error, :fatal].each do |level|
|
43
37
|
should "send :#{level.to_s} notifications to New Relic" do
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
38
|
+
message = hash = nil
|
39
|
+
NewRelic::Agent.stub(:notice_error, -> msg, h { message = msg; hash = h }) do
|
40
|
+
@appender.tagged('test') do
|
41
|
+
@appender.send(level, @message)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
assert_equal @message, message
|
45
|
+
assert_equal ['test'], hash[:custom_params][:tags]
|
46
|
+
assert_equal "SemanticLogger::Appender::NewRelic/#{@message}", hash[:metric]
|
47
|
+
assert_nil hash[:custom_params][:duration]
|
48
|
+
assert hash[:custom_params][:thread_name], hash.inspect
|
52
49
|
end
|
53
50
|
end
|
54
51
|
|
55
52
|
should 'send notification to New Relic with custom attributes' do
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
53
|
+
message = hash = nil
|
54
|
+
NewRelic::Agent.stub(:notice_error, -> msg, h { message = msg; hash = h }) do
|
55
|
+
@appender.tagged('test') do
|
56
|
+
@appender.with_payload({:key1 => 1, :key2 => 'a'}) do
|
57
|
+
@appender.benchmark(:error, @message) do
|
58
|
+
sleep 0.001
|
59
|
+
end
|
60
60
|
end
|
61
61
|
end
|
62
62
|
end
|
63
|
-
assert_equal @message,
|
64
|
-
assert_equal ['test'],
|
65
|
-
assert_equal "SemanticLogger::Appender::NewRelic/#{@message}",
|
66
|
-
assert_equal({:key1 => 1, :key2 => 'a'},
|
67
|
-
|
68
|
-
|
63
|
+
assert_equal @message, message
|
64
|
+
assert_equal ['test'], hash[:custom_params][:tags], hash
|
65
|
+
assert_equal "SemanticLogger::Appender::NewRelic/#{@message}", hash[:metric]
|
66
|
+
assert_equal({:key1 => 1, :key2 => 'a'}, hash[:custom_params][:payload], hash)
|
67
|
+
assert hash[:custom_params][:duration], hash
|
68
|
+
assert hash[:custom_params][:thread_name], hash
|
69
69
|
end
|
70
70
|
|
71
71
|
should 'use the first non-blank line for a multi-line message' do
|
72
|
-
|
73
|
-
|
72
|
+
message = hash = nil
|
73
|
+
NewRelic::Agent.stub(:notice_error, -> msg, h { message = msg; hash = h }) do
|
74
|
+
@appender.tagged('test') do
|
75
|
+
@appender.error @multi_line_message
|
76
|
+
end
|
74
77
|
end
|
75
|
-
assert_equal 'first non-blank line',
|
78
|
+
assert_equal 'first non-blank line', message
|
76
79
|
end
|
77
80
|
|
78
81
|
end
|
@@ -1,16 +1,9 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'mocha/setup'
|
7
|
-
require 'shoulda'
|
8
|
-
require 'logger'
|
9
|
-
require 'semantic_logger'
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
2
|
+
require 'test_helper'
|
10
3
|
|
11
4
|
# Unit Test for SemanticLogger::Appender::Splunk
|
12
5
|
#
|
13
|
-
class AppenderSplunkTest < Test
|
6
|
+
class AppenderSplunkTest < Minitest::Test
|
14
7
|
context SemanticLogger::Appender::Splunk do
|
15
8
|
|
16
9
|
context '#parse_options' do
|
@@ -41,14 +34,12 @@ class AppenderSplunkTest < Test::Unit::TestCase
|
|
41
34
|
end
|
42
35
|
|
43
36
|
context 'set default values' do
|
44
|
-
# Stub the splunk connect call, and index call.
|
45
|
-
setup do
|
46
|
-
Splunk.expects(:connect).returns(Splunk::Service.new({}))
|
47
|
-
Splunk::Service.any_instance.expects(:indexes).returns({})
|
48
|
-
end
|
49
|
-
|
50
37
|
should 'have default values' do
|
51
|
-
appender =
|
38
|
+
appender = Splunk.stub(:connect, Splunk::Service.new({})) do
|
39
|
+
Splunk::Service.stub_any_instance(:indexes, {}) do
|
40
|
+
SemanticLogger::Appender::Splunk.new(username: 'username', password: 'password', index: 'index')
|
41
|
+
end
|
42
|
+
end
|
52
43
|
config = appender.config
|
53
44
|
# Default host
|
54
45
|
assert_equal 'localhost', config[:host]
|
@@ -1,58 +1,61 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'shoulda'
|
7
|
-
require 'mocha/setup'
|
8
|
-
require 'semantic_logger'
|
9
|
-
require 'socket'
|
10
|
-
require 'resilient_socket'
|
11
|
-
require 'syslog_protocol'
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
2
|
+
require 'test_helper'
|
3
|
+
require 'net/tcp_client'
|
12
4
|
|
13
5
|
# Unit Test for SemanticLogger::Appender::Syslog
|
14
6
|
#
|
15
|
-
class AppenderSyslogTest < Test
|
7
|
+
class AppenderSyslogTest < Minitest::Test
|
16
8
|
context SemanticLogger::Appender::Syslog do
|
17
9
|
|
18
10
|
should 'handle local syslog' do
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
11
|
+
message = nil
|
12
|
+
Syslog.stub(:open, nil) do
|
13
|
+
Syslog.stub(:log, -> level, msg { message = msg }) do
|
14
|
+
syslog_appender = SemanticLogger::Appender::Syslog.new(level: :debug)
|
15
|
+
syslog_appender.debug 'AppenderSyslogTest log message'
|
16
|
+
end
|
17
|
+
end
|
18
|
+
assert_match /D (.*?) SemanticLogger::Appender::Syslog -- AppenderSyslogTest log message/, message
|
23
19
|
end
|
24
20
|
|
25
21
|
should 'handle remote syslog over TCP' do
|
26
|
-
|
27
|
-
::
|
28
|
-
|
29
|
-
|
30
|
-
|
22
|
+
message = nil
|
23
|
+
Net::TCPClient.stub_any_instance(:closed?, false) do
|
24
|
+
Net::TCPClient.stub_any_instance(:connect, nil) do
|
25
|
+
syslog_appender = SemanticLogger::Appender::Syslog.new(server: 'tcp://localhost:88888', level: :debug)
|
26
|
+
syslog_appender.remote_syslog.stub(:write, Proc.new { |data| message = data }) do
|
27
|
+
syslog_appender.debug 'AppenderSyslogTest log message'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
assert_match /<70>(.*?)SemanticLogger::Appender::Syslog -- AppenderSyslogTest log message\r\n/, message
|
31
32
|
end
|
32
33
|
|
33
34
|
should 'handle remote syslog over UDP' do
|
34
|
-
|
35
|
-
syslog_appender = SemanticLogger::Appender::Syslog.new(:
|
36
|
-
|
35
|
+
message = nil
|
36
|
+
syslog_appender = SemanticLogger::Appender::Syslog.new(server: 'udp://localhost:88888', level: :debug)
|
37
|
+
UDPSocket.stub_any_instance(:send, -> msg, num, host, port { message = msg }) do
|
38
|
+
syslog_appender.debug 'AppenderSyslogTest log message'
|
39
|
+
end
|
40
|
+
assert_match /<70>(.*?)SemanticLogger::Appender::Syslog -- AppenderSyslogTest log message/, message
|
37
41
|
end
|
38
42
|
|
39
43
|
# Should be able to log each level.
|
40
44
|
SemanticLogger::LEVELS.each do |level|
|
41
45
|
should "log #{level} information" do
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
+
Syslog.stub(:open, nil) do
|
47
|
+
Syslog.stub(:log, nil) do
|
48
|
+
syslog_appender = SemanticLogger::Appender::Syslog.new
|
49
|
+
syslog_appender.send(level, 'AppenderSyslogTest #{level.to_s} message')
|
50
|
+
end
|
51
|
+
end
|
46
52
|
end
|
47
53
|
end
|
48
54
|
|
49
55
|
should "allow logging with %" do
|
50
56
|
message = "AppenderSyslogTest %test"
|
51
57
|
syslog_appender = SemanticLogger::Appender::Syslog.new
|
52
|
-
|
53
|
-
assert_nothing_raised ArgumentError do
|
54
|
-
syslog_appender.debug(message)
|
55
|
-
end
|
58
|
+
syslog_appender.debug(message)
|
56
59
|
end
|
57
60
|
|
58
61
|
end
|
@@ -1,17 +1,9 @@
|
|
1
|
-
# Allow test to be run in-place without requiring a gem install
|
2
|
-
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
3
1
|
$LOAD_PATH.unshift File.dirname(__FILE__)
|
4
|
-
|
5
|
-
require 'rubygems'
|
6
|
-
require 'test/unit'
|
7
|
-
require 'shoulda'
|
8
|
-
require 'logger'
|
9
|
-
require 'semantic_logger'
|
10
|
-
require 'mock_logger'
|
2
|
+
require 'test_helper'
|
11
3
|
|
12
4
|
# Unit Test for SemanticLogger::Appender::Wrapper
|
13
5
|
#
|
14
|
-
class AppenderWrapperTest < Test
|
6
|
+
class AppenderWrapperTest < Minitest::Test
|
15
7
|
context SemanticLogger::Appender::Wrapper do
|
16
8
|
setup do
|
17
9
|
@time = Time.new
|
data/test/loggable_test.rb
CHANGED
@@ -1,21 +1,14 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'shoulda'
|
7
|
-
require 'logger'
|
8
|
-
require 'semantic_logger'
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
2
|
+
require 'test_helper'
|
9
3
|
require 'stringio'
|
10
4
|
|
11
5
|
class TestAttribute
|
12
6
|
include SemanticLogger::Loggable
|
13
7
|
end
|
14
8
|
|
15
|
-
|
16
9
|
# Unit Test for SemanticLogger::Appender::File
|
17
10
|
#
|
18
|
-
class AppenderFileTest < Test
|
11
|
+
class AppenderFileTest < Minitest::Test
|
19
12
|
context SemanticLogger::Loggable do
|
20
13
|
setup do
|
21
14
|
@time = Time.new
|
data/test/logger_test.rb
CHANGED
@@ -1,14 +1,8 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
require 'rubygems'
|
5
|
-
require 'test/unit'
|
6
|
-
require 'shoulda'
|
7
|
-
require 'logger'
|
8
|
-
require 'semantic_logger'
|
1
|
+
$LOAD_PATH.unshift File.dirname(__FILE__)
|
2
|
+
require 'test_helper'
|
9
3
|
|
10
4
|
# Unit Test for SemanticLogger::Logger
|
11
|
-
class LoggerTest < Test
|
5
|
+
class LoggerTest < Minitest::Test
|
12
6
|
context SemanticLogger::Logger do
|
13
7
|
# Test each filter
|
14
8
|
[ nil, /\ALogger/, Proc.new{|l| (/\AExclude/ =~ l.message).nil? } ].each do |filter|
|
@@ -41,11 +35,13 @@ class LoggerTest < Test::Unit::TestCase
|
|
41
35
|
|
42
36
|
# Ensure that any log level can be logged
|
43
37
|
SemanticLogger::LEVELS.each do |level|
|
38
|
+
level_char = level.to_s.upcase[0]
|
39
|
+
|
44
40
|
context level do
|
45
41
|
should "log" do
|
46
42
|
@logger.send(level, 'hello world', @hash) { "Calculations" }
|
47
43
|
SemanticLogger.flush
|
48
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
44
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] LoggerTest -- hello world -- Calculations -- #{@hash_str}/, @mock_logger.message
|
49
45
|
end
|
50
46
|
|
51
47
|
should "exclude log messages using Proc filter" do
|
@@ -73,7 +69,7 @@ class LoggerTest < Test::Unit::TestCase
|
|
73
69
|
@logger.tagged('12345', 'DJHSFK') do
|
74
70
|
@logger.info('Hello world')
|
75
71
|
SemanticLogger.flush
|
76
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
72
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:.+\] \[12345\] \[DJHSFK\] LoggerTest -- Hello world/, @mock_logger.message
|
77
73
|
end
|
78
74
|
end
|
79
75
|
|
@@ -82,7 +78,7 @@ class LoggerTest < Test::Unit::TestCase
|
|
82
78
|
@logger.tagged('Second Level') do
|
83
79
|
@logger.info('Hello world')
|
84
80
|
SemanticLogger.flush
|
85
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
81
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:.+\] \[First Level\] \[tags\] \[Second Level\] LoggerTest -- Hello world/, @mock_logger.message
|
86
82
|
end
|
87
83
|
assert_equal 2, @logger.tags.count, @logger.tags
|
88
84
|
assert_equal 'First Level', @logger.tags.first
|
@@ -97,7 +93,7 @@ class LoggerTest < Test::Unit::TestCase
|
|
97
93
|
@logger.with_payload(:even => 2, :more => 'data') do
|
98
94
|
@logger.info('Hello world')
|
99
95
|
SemanticLogger.flush
|
100
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
96
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:.+\] LoggerTest -- Hello world -- #{hash_str}/, @mock_logger.message
|
101
97
|
end
|
102
98
|
end
|
103
99
|
end
|
@@ -119,18 +115,19 @@ class LoggerTest < Test::Unit::TestCase
|
|
119
115
|
context "benchmark" do
|
120
116
|
# Ensure that any log level can be benchmarked and logged
|
121
117
|
SemanticLogger::LEVELS.each do |level|
|
118
|
+
level_char = level.to_s.upcase[0]
|
122
119
|
|
123
120
|
context 'direct method' do
|
124
121
|
should "log #{level} info" do
|
125
122
|
assert_equal "result", @logger.send("benchmark_#{level}".to_sym, 'hello world') { "result" } # Measure duration of the supplied block
|
126
123
|
SemanticLogger.flush
|
127
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
124
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world/, @mock_logger.message
|
128
125
|
end
|
129
126
|
|
130
127
|
should "log #{level} info with payload" do
|
131
|
-
assert_equal "result", @logger.send("benchmark_#{level}".to_sym, 'hello world', :
|
128
|
+
assert_equal "result", @logger.send("benchmark_#{level}".to_sym, 'hello world', payload: @hash) { "result" } # Measure duration of the supplied block
|
132
129
|
SemanticLogger.flush
|
133
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
130
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message
|
134
131
|
end
|
135
132
|
|
136
133
|
should "not log #{level} info when block is faster than :min_duration" do
|
@@ -140,24 +137,32 @@ class LoggerTest < Test::Unit::TestCase
|
|
140
137
|
end
|
141
138
|
|
142
139
|
should "log #{level} info when block duration exceeds :min_duration" do
|
143
|
-
assert_equal "result", @logger.send("benchmark_#{level}".to_sym, 'hello world', :min_duration => 200, :
|
140
|
+
assert_equal "result", @logger.send("benchmark_#{level}".to_sym, 'hello world', :min_duration => 200, payload: @hash) { sleep 0.5; "result" } # Measure duration of the supplied block
|
144
141
|
SemanticLogger.flush
|
145
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
142
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message
|
146
143
|
end
|
147
144
|
|
148
145
|
should "log #{level} info with an exception" do
|
149
|
-
|
150
|
-
@logger.send("benchmark_#{level}", 'hello world', :
|
146
|
+
assert_raises RuntimeError do
|
147
|
+
@logger.send("benchmark_#{level}", 'hello world', payload: @hash) { raise RuntimeError.new("Test") } # Measure duration of the supplied block
|
148
|
+
end
|
149
|
+
SemanticLogger.flush
|
150
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world -- Exception: RuntimeError: Test -- #{@hash_str}/, @mock_logger.message
|
151
|
+
end
|
152
|
+
|
153
|
+
should "change log #{level} info with an exception" do
|
154
|
+
assert_raises RuntimeError do
|
155
|
+
@logger.send("benchmark_#{level}", 'hello world', payload: @hash, on_exception_level: :fatal) { raise RuntimeError.new("Test") } # Measure duration of the supplied block
|
151
156
|
end
|
152
157
|
SemanticLogger.flush
|
153
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
158
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ F \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world -- Exception: RuntimeError: Test -- #{@hash_str}/, @mock_logger.message
|
154
159
|
end
|
155
160
|
|
156
161
|
should "log #{level} info with metric" do
|
157
162
|
metric_name = '/my/custom/metric'
|
158
163
|
assert_equal "result", @logger.send("benchmark_#{level}".to_sym, 'hello world', :metric => metric_name) { "result" } # Measure duration of the supplied block
|
159
164
|
SemanticLogger.flush
|
160
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
165
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world/, @mock_logger.message
|
161
166
|
assert metric_name, $last_metric.metric
|
162
167
|
end
|
163
168
|
end
|
@@ -166,13 +171,13 @@ class LoggerTest < Test::Unit::TestCase
|
|
166
171
|
should "log #{level} info" do
|
167
172
|
assert_equal "result", @logger.benchmark(level, 'hello world') { "result" } # Measure duration of the supplied block
|
168
173
|
SemanticLogger.flush
|
169
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
174
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world/, @mock_logger.message
|
170
175
|
end
|
171
176
|
|
172
177
|
should "log #{level} info with payload" do
|
173
|
-
assert_equal "result", @logger.benchmark(level, 'hello world', :
|
178
|
+
assert_equal "result", @logger.benchmark(level, 'hello world', payload: @hash) { "result" } # Measure duration of the supplied block
|
174
179
|
SemanticLogger.flush
|
175
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
180
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message
|
176
181
|
end
|
177
182
|
|
178
183
|
should "not log #{level} info when block is faster than :min_duration" do
|
@@ -182,24 +187,24 @@ class LoggerTest < Test::Unit::TestCase
|
|
182
187
|
end
|
183
188
|
|
184
189
|
should "log #{level} info when block duration exceeds :min_duration" do
|
185
|
-
assert_equal "result", @logger.benchmark(level, 'hello world', :min_duration => 200, :
|
190
|
+
assert_equal "result", @logger.benchmark(level, 'hello world', :min_duration => 200, payload: @hash) { sleep 0.5; "result" } # Measure duration of the supplied block
|
186
191
|
SemanticLogger.flush
|
187
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
192
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message
|
188
193
|
end
|
189
194
|
|
190
195
|
should "log #{level} info with an exception" do
|
191
|
-
|
192
|
-
@logger.benchmark(level, 'hello world', :
|
196
|
+
assert_raises RuntimeError do
|
197
|
+
@logger.benchmark(level, 'hello world', payload: @hash) { raise RuntimeError.new("Test") } # Measure duration of the supplied block
|
193
198
|
end
|
194
199
|
SemanticLogger.flush
|
195
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
200
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world -- Exception: RuntimeError: Test -- #{@hash_str}/, @mock_logger.message
|
196
201
|
end
|
197
202
|
|
198
203
|
should "log #{level} info with metric" do
|
199
204
|
metric_name = '/my/custom/metric'
|
200
205
|
assert_equal "result", @logger.benchmark(level, 'hello world', :metric => metric_name) { "result" } # Measure duration of the supplied block
|
201
206
|
SemanticLogger.flush
|
202
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
207
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world/, @mock_logger.message
|
203
208
|
assert metric_name, $last_metric.metric
|
204
209
|
end
|
205
210
|
end
|
@@ -208,7 +213,7 @@ class LoggerTest < Test::Unit::TestCase
|
|
208
213
|
should "log when the block performs a return" do
|
209
214
|
assert_equal "Good", function_with_return(@logger)
|
210
215
|
SemanticLogger.flush
|
211
|
-
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+
|
216
|
+
assert_match /\d+-\d+-\d+ \d+:\d+:\d+.\d+ I \[\d+:.+\] \(\d+\.\dms\) LoggerTest -- hello world -- #{@hash_str}/, @mock_logger.message
|
212
217
|
end
|
213
218
|
end
|
214
219
|
end
|
@@ -219,7 +224,7 @@ class LoggerTest < Test::Unit::TestCase
|
|
219
224
|
# Make sure that benchmark still logs when a block uses return to return from
|
220
225
|
# a function
|
221
226
|
def function_with_return(logger)
|
222
|
-
logger.benchmark_info('hello world', :
|
227
|
+
logger.benchmark_info('hello world', payload: @hash) do
|
223
228
|
return "Good"
|
224
229
|
end
|
225
230
|
"Bad"
|
data/test/newrelic_rpm.rb
CHANGED
@@ -2,20 +2,7 @@
|
|
2
2
|
|
3
3
|
module NewRelic
|
4
4
|
module Agent
|
5
|
-
@@message = nil
|
6
|
-
@@hash = nil
|
7
|
-
|
8
5
|
def self.notice_error(message, hash)
|
9
|
-
@@message = message
|
10
|
-
@@hash = hash
|
11
|
-
end
|
12
|
-
|
13
|
-
def self.message
|
14
|
-
@@message
|
15
|
-
end
|
16
|
-
|
17
|
-
def self.hash
|
18
|
-
@@hash
|
19
6
|
end
|
20
7
|
end
|
21
8
|
end
|
data/test/test_helper.rb
ADDED
@@ -0,0 +1,13 @@
|
|
1
|
+
# Allow test to be run in-place without requiring a gem install
|
2
|
+
$LOAD_PATH.unshift File.dirname(__FILE__) + '/../lib'
|
3
|
+
|
4
|
+
#require 'rubygems'
|
5
|
+
require 'minitest/autorun'
|
6
|
+
require 'minitest/reporters'
|
7
|
+
require 'minitest/stub_any_instance'
|
8
|
+
require 'shoulda/context'
|
9
|
+
require 'semantic_logger'
|
10
|
+
require 'logger'
|
11
|
+
require 'mock_logger'
|
12
|
+
|
13
|
+
Minitest::Reporters.use! Minitest::Reporters::SpecReporter.new
|
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: semantic_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.
|
4
|
+
version: 2.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sync_attr
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '1.0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: thread_safe
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
31
|
+
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.1
|
33
|
+
version: '0.1'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- - "
|
38
|
+
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.1
|
40
|
+
version: '0.1'
|
41
41
|
description: Next generation logging system for Ruby to support highly concurrent,
|
42
42
|
high throughput, low latency systems
|
43
43
|
email:
|
@@ -73,6 +73,7 @@ files:
|
|
73
73
|
- test/logger_test.rb
|
74
74
|
- test/mock_logger.rb
|
75
75
|
- test/newrelic_rpm.rb
|
76
|
+
- test/test_helper.rb
|
76
77
|
homepage: https://github.com/reidmorrison/semantic_logger
|
77
78
|
licenses:
|
78
79
|
- Apache License V2.0
|
@@ -93,7 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
93
94
|
version: '0'
|
94
95
|
requirements: []
|
95
96
|
rubyforge_project:
|
96
|
-
rubygems_version: 2.
|
97
|
+
rubygems_version: 2.4.5
|
97
98
|
signing_key:
|
98
99
|
specification_version: 4
|
99
100
|
summary: Scalable, next generation logging for Ruby
|
@@ -108,3 +109,4 @@ test_files:
|
|
108
109
|
- test/logger_test.rb
|
109
110
|
- test/mock_logger.rb
|
110
111
|
- test/newrelic_rpm.rb
|
112
|
+
- test/test_helper.rb
|