semantic_logger 3.4.1 → 4.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +10 -0
  3. data/Rakefile +4 -8
  4. data/lib/semantic_logger.rb +2 -31
  5. data/lib/semantic_logger/appender.rb +76 -0
  6. data/lib/semantic_logger/appender/bugsnag.rb +3 -8
  7. data/lib/semantic_logger/appender/file.rb +1 -1
  8. data/lib/semantic_logger/appender/honeybadger.rb +1 -1
  9. data/lib/semantic_logger/appender/http.rb +1 -1
  10. data/lib/semantic_logger/appender/mongodb.rb +30 -28
  11. data/lib/semantic_logger/appender/sentry.rb +2 -2
  12. data/lib/semantic_logger/appender/splunk_http.rb +4 -4
  13. data/lib/semantic_logger/appender/syslog.rb +2 -2
  14. data/lib/semantic_logger/appender/tcp.rb +9 -5
  15. data/lib/semantic_logger/appender/udp.rb +1 -0
  16. data/lib/semantic_logger/base.rb +73 -140
  17. data/lib/semantic_logger/core_ext/thread.rb +4 -1
  18. data/lib/semantic_logger/formatters/color.rb +7 -0
  19. data/lib/semantic_logger/formatters/default.rb +7 -0
  20. data/lib/semantic_logger/formatters/syslog.rb +1 -1
  21. data/lib/semantic_logger/log.rb +115 -12
  22. data/lib/semantic_logger/logger.rb +6 -215
  23. data/lib/semantic_logger/metrics/new_relic.rb +1 -1
  24. data/lib/semantic_logger/metrics/statsd.rb +5 -1
  25. data/lib/semantic_logger/metrics/udp.rb +80 -0
  26. data/lib/semantic_logger/processor.rb +235 -0
  27. data/lib/semantic_logger/semantic_logger.rb +36 -65
  28. data/lib/semantic_logger/subscriber.rb +2 -2
  29. data/lib/semantic_logger/version.rb +1 -1
  30. data/test/appender/bugsnag_test.rb +10 -9
  31. data/test/appender/elasticsearch_test.rb +3 -2
  32. data/test/appender/graylog_test.rb +4 -3
  33. data/test/appender/honeybadger_test.rb +2 -2
  34. data/test/appender/http_test.rb +3 -2
  35. data/test/appender/mongodb_test.rb +24 -23
  36. data/test/appender/new_relic_test.rb +15 -8
  37. data/test/appender/sentry_test.rb +2 -2
  38. data/test/appender/splunk_http_test.rb +8 -7
  39. data/test/appender/splunk_test.rb +6 -5
  40. data/test/appender/tcp_test.rb +3 -4
  41. data/test/appender/udp_test.rb +4 -5
  42. data/test/appender/wrapper_test.rb +37 -38
  43. data/test/concerns/compatibility_test.rb +2 -2
  44. data/test/loggable_test.rb +1 -1
  45. data/test/logger_test.rb +149 -528
  46. data/test/measure_test.rb +249 -0
  47. data/test/semantic_logger_test.rb +257 -0
  48. metadata +24 -16
@@ -99,10 +99,10 @@ module SemanticLogger
99
99
  def extract_formatter(formatter, &block)
100
100
  case
101
101
  when formatter.is_a?(Symbol)
102
- SemanticLogger.constantize_symbol(formatter, 'SemanticLogger::Formatters').new
102
+ SemanticLogger::Appender.constantize_symbol(formatter, 'SemanticLogger::Formatters').new
103
103
  when formatter.is_a?(Hash) && formatter.size > 0
104
104
  fmt, options = formatter.first
105
- SemanticLogger.constantize_symbol(fmt.to_sym, 'SemanticLogger::Formatters').new(options)
105
+ SemanticLogger::Appender.constantize_symbol(fmt.to_sym, 'SemanticLogger::Formatters').new(options)
106
106
  when formatter.respond_to?(:call)
107
107
  formatter
108
108
  when block
@@ -1,3 +1,3 @@
1
1
  module SemanticLogger #:nodoc
2
- VERSION = '3.4.1'
2
+ VERSION = '4.0.0.beta1'
3
3
  end
@@ -5,7 +5,7 @@ module Appender
5
5
  class BugsnagTest < Minitest::Test
6
6
  describe SemanticLogger::Appender::Bugsnag do
7
7
  before do
8
- @appender = SemanticLogger::Appender::Bugsnag.new(:info)
8
+ @appender = SemanticLogger::Appender::Bugsnag.new(level: :info)
9
9
  @message = 'AppenderBugsnagTest log message'
10
10
  end
11
11
 
@@ -25,8 +25,8 @@ module Appender
25
25
  @appender.send(level, @message)
26
26
  end
27
27
  if [:trace, :debug].include?(level)
28
- assert_equal nil, exception
29
- assert_equal nil, hash
28
+ assert_nil exception
29
+ assert_nil hash
30
30
  else
31
31
  assert_equal 'RuntimeError', exception.class.to_s
32
32
  assert_equal @message, exception.message
@@ -40,13 +40,14 @@ module Appender
40
40
  @appender.send(level, @message, {key1: 1, key2: 'a'})
41
41
  end
42
42
  if [:trace, :debug].include?(level)
43
- assert_equal nil, exception
44
- assert_equal nil, hash
43
+ assert_nil exception
44
+ assert_nil hash
45
45
  else
46
46
  assert_equal 'RuntimeError', exception.class.to_s
47
47
  assert_equal @message, exception.message
48
- assert_equal 1, hash[:key1], hash
49
- assert_equal 'a', hash[:key2], hash
48
+ assert payload = hash[:payload], hash
49
+ assert_equal 1, payload[:key1], payload
50
+ assert_equal 'a', payload[:key2], payload
50
51
  end
51
52
  end
52
53
 
@@ -57,8 +58,8 @@ module Appender
57
58
  @appender.send(level, @message, error)
58
59
  end
59
60
  if [:trace, :debug].include?(level)
60
- assert_equal nil, exception
61
- assert_equal nil, hash
61
+ assert_nil exception
62
+ assert_nil hash
62
63
  else
63
64
  assert_equal error.class.to_s, exception.class.to_s
64
65
  assert_equal error.message, exception.message
@@ -64,8 +64,9 @@ module Appender
64
64
  assert_equal @message, message['message']
65
65
  assert_equal level.to_s, message['level']
66
66
  refute message['stack_trace']
67
- assert_equal(1, message['key1'], message)
68
- assert_equal('a', message['key2'], message)
67
+ assert payload = message['payload'], message
68
+ assert_equal 1, payload['key1'], message
69
+ assert_equal 'a', payload['key2'], message
69
70
  end
70
71
  end
71
72
 
@@ -21,7 +21,7 @@ module Appender
21
21
 
22
22
  it 'send exception notifications to Graylog with severity' do
23
23
  hash = nil
24
- exc = nil
24
+ exc = nil
25
25
  begin
26
26
  Uh oh
27
27
  rescue Exception => e
@@ -55,8 +55,9 @@ module Appender
55
55
  assert_equal @message, hash[:short_message]
56
56
  assert_equal 3, hash[:level]
57
57
  refute hash[:stack_trace]
58
- assert_equal(1, hash[:key1], hash)
59
- assert_equal('a', hash[:key2], hash)
58
+ assert payload = hash[:payload], hash
59
+ assert_equal 1, payload[:key1], payload
60
+ assert_equal 'a', payload[:key2], payload
60
61
  end
61
62
  end
62
63
  end
@@ -5,8 +5,8 @@ module Appender
5
5
  class HoneybadgerTest < Minitest::Test
6
6
  describe SemanticLogger::Appender::Honeybadger do
7
7
  before do
8
- @appender = SemanticLogger::Appender::Honeybadger.new(:trace)
9
- @message = 'AppenderHoneybadgerTest log message'
8
+ @appender = SemanticLogger::Appender::Honeybadger.new(:trace)
9
+ @message = 'AppenderHoneybadgerTest log message'
10
10
  SemanticLogger.backtrace_level = :error
11
11
  end
12
12
 
@@ -53,8 +53,9 @@ module Appender
53
53
  assert_equal @message, hash['message']
54
54
  assert_equal level.to_s, hash['level']
55
55
  refute hash['stack_trace']
56
- assert_equal 1, hash['key1'], hash
57
- assert_equal 'a', hash['key2'], hash
56
+ assert payload = hash['payload'], hash
57
+ assert_equal 1, payload['key1'], payload
58
+ assert_equal 'a', payload['key2'], payload
58
59
  end
59
60
 
60
61
  end
@@ -1,14 +1,12 @@
1
1
  require_relative '../test_helper'
2
2
 
3
3
  # Unit Test for SemanticLogger::Appender::MongoDB
4
- #
5
4
  module Appender
6
5
  class MongoDBTest < Minitest::Test
7
6
  describe SemanticLogger::Appender::MongoDB do
8
7
  before do
9
- @db = Mongo::Connection.new['test']
10
8
  @appender = SemanticLogger::Appender::MongoDB.new(
11
- db: @db,
9
+ uri: 'mongodb://127.0.0.1:27017/test',
12
10
  collection_size: 10*1024**2, # 10MB
13
11
  host: 'test',
14
12
  application: 'test_application',
@@ -25,27 +23,28 @@ module Appender
25
23
  describe 'format logs into documents' do
26
24
  it 'handle no arguments' do
27
25
  @appender.debug
28
- document = @appender.collection.find_one
26
+ document = @appender.collection.find.first
29
27
  assert_equal :debug, document['level']
30
- assert_equal nil, document['message']
28
+ assert_nil document['message']
31
29
  assert_equal 'thread', document['thread']
32
30
  assert document['time'].is_a?(Time)
33
- assert_equal nil, document['payload']
31
+ assert_nil document['payload']
34
32
  assert_equal $$, document['pid']
35
33
  assert_equal 'test', document['host']
36
34
  assert_equal 'test_application', document['application']
37
35
  end
38
36
 
39
- it 'handle hash message' do
40
- @appender.debug(@hash)
37
+ it 'handle named parameters' do
38
+ @appender.debug(payload: @hash)
41
39
 
42
- document = @appender.collection.find_one
40
+ document = @appender.collection.find.first
43
41
  assert_equal :debug, document['level']
44
- assert_equal nil, document['message']
42
+ assert_nil document['message']
45
43
  assert_equal 'thread', document['thread']
46
44
  assert document['time'].is_a?(Time)
47
- assert_equal 12345, document['tracking_number']
48
- assert_equal 'HSSKLEU@JDK767', document['session_id']
45
+ assert payload = document['payload']
46
+ assert_equal 12345, payload['tracking_number'], payload
47
+ assert_equal 'HSSKLEU@JDK767', payload['session_id']
49
48
  assert_equal $$, document['pid']
50
49
  assert_equal 'test', document['host']
51
50
  assert_equal 'test_application', document['application']
@@ -54,13 +53,14 @@ module Appender
54
53
  it 'handle message and payload' do
55
54
  @appender.debug('hello world', @hash)
56
55
 
57
- document = @appender.collection.find_one
56
+ document = @appender.collection.find.first
58
57
  assert_equal :debug, document['level']
59
58
  assert_equal 'hello world', document['message']
60
59
  assert_equal 'thread', document['thread']
61
60
  assert document['time'].is_a?(Time)
62
- assert_equal 12345, document['tracking_number']
63
- assert_equal 'HSSKLEU@JDK767', document['session_id']
61
+ assert payload = document['payload']
62
+ assert_equal 12345, payload['tracking_number'], payload
63
+ assert_equal 'HSSKLEU@JDK767', payload['session_id']
64
64
  assert_equal $$, document['pid']
65
65
  assert_equal 'test', document['host']
66
66
  assert_equal 'test_application', document['application']
@@ -69,7 +69,7 @@ module Appender
69
69
  it 'handle message without payload' do
70
70
  @appender.debug('hello world')
71
71
 
72
- document = @appender.collection.find_one
72
+ document = @appender.collection.find.first
73
73
  assert_equal :debug, document['level']
74
74
  assert_equal 'hello world', document['message']
75
75
  assert_equal 'thread', document['thread']
@@ -80,18 +80,19 @@ module Appender
80
80
  end
81
81
  end
82
82
 
83
- describe 'for each log level' do
84
- # Ensure that any log level can be logged
85
- SemanticLogger::LEVELS.each do |level|
86
- it 'log #{level} information' do
83
+ # Ensure that any log level can be logged
84
+ SemanticLogger::LEVELS.each do |level|
85
+ describe "##{level}" do
86
+ it 'logs' do
87
87
  @appender.send(level, 'hello world -- Calculations', @hash)
88
- document = @appender.collection.find_one
88
+ document = @appender.collection.find.first
89
89
  assert_equal level, document['level']
90
90
  assert_equal 'hello world -- Calculations', document['message']
91
91
  assert_equal 'thread', document['thread']
92
92
  assert document['time'].is_a?(Time)
93
- assert_equal 12345, document['tracking_number']
94
- assert_equal 'HSSKLEU@JDK767', document['session_id']
93
+ assert payload = document['payload']
94
+ assert_equal 12345, payload['tracking_number'], payload
95
+ assert_equal 'HSSKLEU@JDK767', payload['session_id']
95
96
  assert_equal $$, document['pid']
96
97
  assert_equal 'test', document['host'], document.ai
97
98
  assert_equal 'test_application', document['application']
@@ -44,9 +44,9 @@ module Appender
44
44
  it 'send notification to New Relic with custom attributes' do
45
45
  exception = hash = nil
46
46
  NewRelic::Agent.stub(:notice_error, -> exc, h { exception = exc; hash = h }) do
47
- @appender.tagged('test') do
48
- @appender.with_payload({key1: 1, key2: 'a'}) do
49
- @appender.measure(:error, @message) do
47
+ SemanticLogger.tagged('test') do
48
+ SemanticLogger.named_tagged(key1: 1, key2: 'a') do
49
+ @appender.measure_error(message: @message, payload: {key3: 4}) do
50
50
  sleep 0.001
51
51
  end
52
52
  end
@@ -54,11 +54,18 @@ module Appender
54
54
  end
55
55
  assert_equal 'RuntimeError', exception.class.to_s
56
56
  assert_equal @message, exception.message
57
- assert_equal ['test'], hash[:custom_params][:tags], hash
58
- assert_equal 1, hash[:custom_params][:key1], hash
59
- assert_equal 'a', hash[:custom_params][:key2], hash
60
- assert hash[:custom_params][:duration], hash
61
- assert hash[:custom_params][:thread], hash
57
+ assert params = hash[:custom_params], hash
58
+ assert params[:duration], params
59
+ assert params[:thread], params
60
+
61
+ assert_equal ['test'], params[:tags], params
62
+
63
+ assert named_tags = params[:named_tags], params
64
+ assert_equal 1, named_tags[:key1], named_tags
65
+ assert_equal 'a', named_tags[:key2], named_tags
66
+
67
+ assert payload = params[:payload], params
68
+ assert_equal 4, payload[:key3], payload
62
69
  end
63
70
  end
64
71
  end
@@ -5,8 +5,8 @@ module Appender
5
5
  class SentryTest < Minitest::Test
6
6
  describe SemanticLogger::Appender::Sentry do
7
7
  before do
8
- @appender = SemanticLogger::Appender::Sentry.new(:trace)
9
- @message = 'AppenderRavenTest log message'
8
+ @appender = SemanticLogger::Appender::Sentry.new(:trace)
9
+ @message = 'AppenderRavenTest log message'
10
10
  SemanticLogger.backtrace_level = :error
11
11
  end
12
12
 
@@ -13,7 +13,7 @@ module Appender
13
13
  token: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
14
14
  )
15
15
  end
16
- @message = 'AppenderSplunkHttpTest log message'
16
+ @message = 'AppenderSplunkHttpTest log message'
17
17
  end
18
18
 
19
19
  SemanticLogger::LEVELS.each do |level|
@@ -57,12 +57,13 @@ module Appender
57
57
  end
58
58
  body = decompress_data(request.body)
59
59
  message = JSON.parse(body)
60
- assert message['event'], message.ai
61
- assert_equal @message, message['event']['message']
62
- assert_equal level.to_s, message['event']['level']
63
- refute message['event']['stack_trace']
64
- assert_equal(1, message['event']['key1'], message)
65
- assert_equal('a', message['event']['key2'], message)
60
+ assert event = message['event'], message.ai
61
+ assert_equal @message, event['message']
62
+ assert_equal level.to_s, event['level']
63
+ refute event['stack_trace']
64
+ assert payload = event['payload'], event
65
+ assert_equal(1, payload['key1'], message)
66
+ assert_equal('a', payload['key2'], message)
66
67
  end
67
68
  end
68
69
 
@@ -61,11 +61,12 @@ module Appender
61
61
  end
62
62
  assert_equal @message, mock.message
63
63
 
64
- assert mock.event[:event], mock.event.ai
65
- assert_equal level, mock.event[:event][:level]
66
- refute mock.event[:event][:stack_trace]
67
- assert_equal(1, mock.event[:event][:key1], mock.event)
68
- assert_equal('a', mock.event[:event][:key2], mock.event)
64
+ assert event = mock.event[:event], mock.event.ai
65
+ assert_equal level, event[:level]
66
+ refute event[:stack_trace]
67
+ assert payload = event[:payload]
68
+ assert_equal(1, payload[:key1], payload)
69
+ assert_equal('a', payload[:key2], payload)
69
70
  end
70
71
  end
71
72
 
@@ -3,8 +3,6 @@ require_relative '../test_helper'
3
3
  # Unit Test for SemanticLogger::Appender::Tcp
4
4
  module Appender
5
5
  class TcpTest < Minitest::Test
6
- response_mock = Struct.new(:code, :body)
7
-
8
6
  describe SemanticLogger::Appender::Tcp do
9
7
  before do
10
8
  Net::TCPClient.stub_any_instance(:connect, true) do
@@ -58,8 +56,9 @@ module Appender
58
56
  assert_equal @message, hash['message']
59
57
  assert_equal level.to_s, hash['level']
60
58
  refute hash['stack_trace']
61
- assert_equal 1, hash['key1'], hash
62
- assert_equal 'a', hash['key2'], hash
59
+ assert payload = hash['payload'], hash
60
+ assert_equal 1, payload['key1'], payload
61
+ assert_equal 'a', payload['key2'], payload
63
62
  end
64
63
 
65
64
  end
@@ -3,12 +3,10 @@ require_relative '../test_helper'
3
3
  # Unit Test for SemanticLogger::Appender::Tcp
4
4
  module Appender
5
5
  class UdpTest < Minitest::Test
6
- response_mock = Struct.new(:code, :body)
7
-
8
6
  describe SemanticLogger::Appender::Udp do
9
7
  before do
10
8
  @appender = SemanticLogger::Appender::Udp.new(server: 'localhost:8088')
11
- @message = 'AppenderUdpTest log message'
9
+ @message = 'AppenderUdpTest log message'
12
10
  end
13
11
 
14
12
  SemanticLogger::LEVELS.each do |level|
@@ -51,8 +49,9 @@ module Appender
51
49
  assert_equal @message, hash['message']
52
50
  assert_equal level.to_s, hash['level']
53
51
  refute hash['stack_trace']
54
- assert_equal 1, hash['key1'], hash
55
- assert_equal 'a', hash['key2'], hash
52
+ assert payload = hash['payload'], hash
53
+ assert_equal 1, payload['key1'], payload
54
+ assert_equal 'a', payload['key2'], payload
56
55
  end
57
56
 
58
57
  end
@@ -6,59 +6,58 @@ module Appender
6
6
  class WrapperTest < Minitest::Test
7
7
  describe SemanticLogger::Appender::Wrapper do
8
8
  before do
9
- @time = Time.new
10
- @mock_logger = MockLogger.new
11
- @appender = SemanticLogger::Appender::Wrapper.new(@mock_logger)
12
- @hash = {session_id: 'HSSKLEU@JDK767', tracking_number: 12345}
13
- @hash_str = @hash.inspect.sub("{", "\\{").sub("}", "\\}")
9
+ SemanticLogger.default_level = :trace
10
+ SemanticLogger.backtrace_level = :trace
11
+
12
+ @time = Time.new
13
+ @mock_logger = MockLogger.new
14
+ @appender = SemanticLogger::Appender::Wrapper.new(@mock_logger)
15
+ @hash = {session_id: 'HSSKLEU@JDK767', tracking_number: 12345}
16
+ @hash_str = @hash.inspect.sub("{", "\\{").sub("}", "\\}")
17
+ @thread_name = Thread.current.name
18
+ @file_name_reg_exp = ' wrapper_test.rb:\d+'
14
19
  end
15
20
 
16
21
  describe 'format logs into text form' do
17
- it 'handle nil name, message and payload' do
18
- log = SemanticLogger::Log.new
19
- log.time = Time.now
20
- log.level = :debug
21
- @appender.log(log)
22
- assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:\] /, @mock_logger.message)
22
+ it 'logs blank data' do
23
+ @appender.debug
24
+ assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:#{@thread_name}#{@file_name_reg_exp}\] SemanticLogger::Appender::Wrapper/, @mock_logger.message)
23
25
  end
24
26
 
25
- it 'handle nil message and payload' do
26
- log = SemanticLogger::Log.new
27
- log.time = Time.now
28
- log.level = :debug
29
- log.name = 'class'
30
- @appender.log(log)
31
- assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:\] class/, @mock_logger.message)
27
+ it 'logs message' do
28
+ @appender.debug('hello world')
29
+ assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:#{@thread_name}#{@file_name_reg_exp}\] SemanticLogger::Appender::Wrapper -- hello world/, @mock_logger.message)
32
30
  end
33
31
 
34
- it 'handle nil payload' do
35
- log = SemanticLogger::Log.new
36
- log.time = Time.now
37
- log.level = :debug
38
- log.name = 'class'
39
- log.message = 'hello world'
40
- @appender.log(log)
41
- assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:\] class -- hello world/, @mock_logger.message)
32
+ it 'logs message and payload' do
33
+ @appender.debug('hello world', @hash)
34
+ assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:#{@thread_name}#{@file_name_reg_exp}\] SemanticLogger::Appender::Wrapper -- hello world -- #{@hash_str}/, @mock_logger.message)
42
35
  end
43
36
 
44
- it 'handle payload' do
45
- log = SemanticLogger::Log.new
46
- log.time = Time.now
47
- log.level = :debug
48
- log.name = 'class'
49
- log.message = 'hello world'
50
- log.payload = @hash
51
- @appender.log(log)
52
- assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:\] class -- hello world -- #{@hash_str}/, @mock_logger.message)
37
+ it 'logs named parameters' do
38
+ @appender.debug(message: 'hello world', payload: @hash)
39
+ assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:#{@thread_name}#{@file_name_reg_exp}\] SemanticLogger::Appender::Wrapper -- hello world -- #{@hash_str}/, @mock_logger.message)
53
40
  end
54
41
  end
55
42
 
56
43
  describe 'for each log level' do
44
+ before do
45
+ @appender = SemanticLogger.add_appender(logger: @mock_logger)
46
+ @logger = SemanticLogger[WrapperTest]
47
+ end
48
+
49
+ after do
50
+ SemanticLogger.remove_appender(@appender)
51
+ end
52
+
57
53
  # Ensure that any log level can be logged
58
54
  Logger::Severity.constants.each do |level|
59
- it "log #{level.downcase.to_sym} info" do
60
- @appender.log SemanticLogger::Log.new(level.downcase.to_sym, 'thread', 'class', 'hello world', @hash, Time.now)
61
- assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ \w \[\d+:thread\] class -- hello world -- #{@hash_str}/, @mock_logger.message)
55
+ it "log #{level.downcase.to_sym}" do
56
+ level_char = level[0].upcase
57
+ level_char = 'E' if level_char == 'U'
58
+ @logger.send(level.downcase.to_sym, 'hello world', @hash)
59
+ SemanticLogger.flush
60
+ assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ #{level_char} \[\d+:#{@thread_name}#{@file_name_reg_exp}\] Appender::WrapperTest -- hello world -- #{@hash_str}/, @mock_logger.message)
62
61
  end
63
62
  end
64
63
  end