semantic_logger 4.3.1 → 4.4.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.
Files changed (62) hide show
  1. checksums.yaml +4 -4
  2. data/lib/semantic_logger.rb +7 -1
  3. data/lib/semantic_logger/appender.rb +3 -0
  4. data/lib/semantic_logger/appender/async.rb +29 -10
  5. data/lib/semantic_logger/appender/rabbitmq.rb +120 -0
  6. data/lib/semantic_logger/appenders.rb +89 -0
  7. data/lib/semantic_logger/base.rb +3 -3
  8. data/lib/semantic_logger/concerns/compatibility.rb +2 -2
  9. data/lib/semantic_logger/formatters.rb +1 -0
  10. data/lib/semantic_logger/formatters/base.rb +28 -6
  11. data/lib/semantic_logger/formatters/color.rb +4 -3
  12. data/lib/semantic_logger/formatters/fluentd.rb +37 -0
  13. data/lib/semantic_logger/formatters/json.rb +4 -2
  14. data/lib/semantic_logger/formatters/raw.rb +2 -2
  15. data/lib/semantic_logger/formatters/signalfx.rb +4 -3
  16. data/lib/semantic_logger/levels.rb +38 -0
  17. data/lib/semantic_logger/log.rb +11 -6
  18. data/lib/semantic_logger/loggable.rb +1 -1
  19. data/lib/semantic_logger/logger.rb +43 -1
  20. data/lib/semantic_logger/processor.rb +10 -130
  21. data/lib/semantic_logger/reporters/minitest.rb +49 -0
  22. data/lib/semantic_logger/semantic_logger.rb +40 -75
  23. data/lib/semantic_logger/version.rb +1 -1
  24. metadata +9 -81
  25. data/test/appender/async_batch_test.rb +0 -60
  26. data/test/appender/async_test.rb +0 -44
  27. data/test/appender/bugsnag_test.rb +0 -81
  28. data/test/appender/elasticsearch_http_test.rb +0 -74
  29. data/test/appender/elasticsearch_test.rb +0 -248
  30. data/test/appender/file_test.rb +0 -120
  31. data/test/appender/graylog_test.rb +0 -82
  32. data/test/appender/honeybadger_test.rb +0 -45
  33. data/test/appender/http_test.rb +0 -63
  34. data/test/appender/kafka_test.rb +0 -35
  35. data/test/appender/mongodb_test.rb +0 -104
  36. data/test/appender/new_relic_test.rb +0 -80
  37. data/test/appender/newrelic_rpm.rb +0 -14
  38. data/test/appender/sentry_test.rb +0 -47
  39. data/test/appender/splunk_http_test.rb +0 -79
  40. data/test/appender/splunk_test.rb +0 -83
  41. data/test/appender/syslog_test.rb +0 -61
  42. data/test/appender/tcp_test.rb +0 -66
  43. data/test/appender/udp_test.rb +0 -59
  44. data/test/appender/wrapper_test.rb +0 -95
  45. data/test/concerns/compatibility_test.rb +0 -117
  46. data/test/debug_as_trace_logger_test.rb +0 -81
  47. data/test/formatters/color_test.rb +0 -153
  48. data/test/formatters/default_test.rb +0 -175
  49. data/test/formatters/one_line_test.rb +0 -60
  50. data/test/formatters/signalfx_test.rb +0 -197
  51. data/test/formatters_test.rb +0 -36
  52. data/test/in_memory_appender.rb +0 -8
  53. data/test/in_memory_appender_helper.rb +0 -43
  54. data/test/in_memory_batch_appender.rb +0 -8
  55. data/test/in_memory_metrics_appender.rb +0 -13
  56. data/test/loggable_test.rb +0 -103
  57. data/test/logger_test.rb +0 -334
  58. data/test/measure_test.rb +0 -346
  59. data/test/metric/new_relic_test.rb +0 -35
  60. data/test/metric/signalfx_test.rb +0 -77
  61. data/test/semantic_logger_test.rb +0 -303
  62. data/test/test_helper.rb +0 -31
@@ -1,79 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- # Unit Test for SemanticLogger::Appender::SplunkHttp
4
- module Appender
5
- class SplunkHttpTest < Minitest::Test
6
- response_mock = Struct.new(:code, :body)
7
-
8
- describe SemanticLogger::Appender::SplunkHttp do
9
- before do
10
- Net::HTTP.stub_any_instance(:start, true) do
11
- @appender = SemanticLogger::Appender::SplunkHttp.new(
12
- url: 'http://localhost:8088/path',
13
- token: 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx'
14
- )
15
- end
16
- @message = 'AppenderSplunkHttpTest log message'
17
- end
18
-
19
- SemanticLogger::LEVELS.each do |level|
20
- it "send #{level}" do
21
- request = nil
22
- @appender.http.stub(:request, ->(r) { request = r; response_mock.new('200', 'ok') }) do
23
- @appender.send(level, @message)
24
- end
25
- body = decompress_data(request.body)
26
- message = JSON.parse(body)
27
- assert_equal @message, message['event']['message']
28
- assert_equal level.to_s, message['event']['level']
29
- refute message['event']['exception']
30
- end
31
-
32
- it "sends #{level} exceptions" do
33
- exc = nil
34
- begin
35
- Uh oh
36
- rescue Exception => e
37
- exc = e
38
- end
39
- request = nil
40
- @appender.http.stub(:request, ->(r) { request = r; response_mock.new('200', 'ok') }) do
41
- @appender.send(level, 'Reading File', exc)
42
- end
43
- body = decompress_data(request.body)
44
- hash = JSON.parse(body)
45
- assert 'Reading File', hash['message']
46
- assert exception = hash['event']['exception']
47
- assert 'NameError', exception['name']
48
- assert 'undefined local variable or method', exception['message']
49
- assert_equal level.to_s, hash['event']['level']
50
- assert exception['stack_trace'].first.include?(__FILE__), exception
51
- end
52
-
53
- it "sends #{level} custom attributes" do
54
- request = nil
55
- @appender.http.stub(:request, ->(r) { request = r; response_mock.new('200', 'ok') }) do
56
- @appender.send(level, @message, key1: 1, key2: 'a')
57
- end
58
- body = decompress_data(request.body)
59
- message = JSON.parse(body)
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)
67
- end
68
- end
69
-
70
- def decompress_data(data)
71
- str = StringIO.new(data)
72
- gz = Zlib::GzipReader.new(str)
73
- raw = gz.read
74
- gz.close
75
- raw
76
- end
77
- end
78
- end
79
- end
@@ -1,83 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- # Unit Test for SemanticLogger::Appender::Splunk
4
- #
5
- module Appender
6
- class SplunkTest < Minitest::Test
7
- class Mock
8
- attr_accessor :message, :event
9
-
10
- def submit(message, event)
11
- self.message = message
12
- self.event = event
13
- end
14
- end
15
-
16
- describe SemanticLogger::Appender::Splunk do
17
- before do
18
- SemanticLogger::Appender::Splunk.stub_any_instance(:reopen, nil) do
19
- @appender = SemanticLogger::Appender::Splunk.new
20
- end
21
- @message = 'AppenderSplunkTest log message'
22
- end
23
-
24
- SemanticLogger::LEVELS.each do |level|
25
- it "send #{level}" do
26
- mock = Mock.new
27
- @appender.stub(:service_index, mock) do
28
- @appender.send(level, @message)
29
- end
30
- assert_equal @message, mock.message
31
- assert_equal level, mock.event[:event][:level]
32
- refute mock.event[:event][:exception]
33
- end
34
-
35
- it "sends #{level} exceptions" do
36
- exc = nil
37
- begin
38
- Uh oh
39
- rescue Exception => e
40
- exc = e
41
- end
42
-
43
- mock = Mock.new
44
- @appender.stub(:service_index, mock) do
45
- @appender.send(level, @message, exc)
46
- end
47
- assert_equal @message, mock.message
48
-
49
- assert exception = mock.event[:event][:exception]
50
- assert 'NameError', exception[:name]
51
- assert 'undefined local variable or method', exception[:message]
52
- assert_equal level, mock.event[:event][:level]
53
- assert exception[:stack_trace].first.include?(__FILE__), exception
54
- end
55
-
56
- it "sends #{level} custom attributes" do
57
- mock = Mock.new
58
- @appender.stub(:service_index, mock) do
59
- @appender.send(level, @message, key1: 1, key2: 'a')
60
- end
61
- assert_equal @message, mock.message
62
-
63
- assert event = mock.event[:event], mock.event.ai
64
- assert_equal level, event[:level]
65
- refute event[:stack_trace]
66
- assert payload = event[:payload]
67
- assert_equal(1, payload[:key1], payload)
68
- assert_equal('a', payload[:key2], payload)
69
- end
70
- end
71
-
72
- it 'does not send :trace notifications to Splunk when set to :error' do
73
- mock = Mock.new
74
- @appender.level = :error
75
- @appender.stub(:service_index, mock) do
76
- @appender.trace('AppenderSplunkTest trace message')
77
- end
78
- assert_nil mock.event
79
- assert_nil mock.message
80
- end
81
- end
82
- end
83
- end
@@ -1,61 +0,0 @@
1
- require_relative '../test_helper'
2
- require 'net/tcp_client'
3
-
4
- # Unit Test for SemanticLogger::Appender::Syslog
5
- #
6
- module Appender
7
- class SyslogTest < Minitest::Test
8
- describe SemanticLogger::Appender::Syslog do
9
- it 'handle local syslog' do
10
- message = nil
11
- Syslog.stub(:open, nil) do
12
- Syslog.stub(:log, ->(_level, msg) { message = msg }) do
13
- syslog_appender = SemanticLogger::Appender::Syslog.new(level: :debug)
14
- syslog_appender.debug 'AppenderSyslogTest log message'
15
- end
16
- end
17
- assert_match(/D (.*?) SemanticLogger::Appender::Syslog -- AppenderSyslogTest log message/, message)
18
- end
19
-
20
- it 'handle remote syslog over TCP' do
21
- message = nil
22
- Net::TCPClient.stub_any_instance(:closed?, false) do
23
- Net::TCPClient.stub_any_instance(:connect, nil) do
24
- syslog_appender = SemanticLogger::Appender::Syslog.new(url: 'tcp://localhost:88888', level: :debug)
25
- syslog_appender.remote_syslog.stub(:write, proc { |data| message = data }) do
26
- syslog_appender.debug 'AppenderSyslogTest log message'
27
- end
28
- end
29
- end
30
- assert_match(/<70>(.*?)SemanticLogger::Appender::Syslog -- AppenderSyslogTest log message\r\n/, message)
31
- end
32
-
33
- it 'handle remote syslog over UDP' do
34
- message = nil
35
- syslog_appender = SemanticLogger::Appender::Syslog.new(url: 'udp://localhost:88888', level: :debug)
36
- UDPSocket.stub_any_instance(:send, ->(msg, _num, _host, _port) { message = msg }) do
37
- syslog_appender.debug 'AppenderSyslogTest log message'
38
- end
39
- assert_match(/<70>(.*?)SemanticLogger::Appender::Syslog -- AppenderSyslogTest log message/, message)
40
- end
41
-
42
- # Should be able to log each level.
43
- SemanticLogger::LEVELS.each do |level|
44
- it "log #{level} information" do
45
- Syslog.stub(:open, nil) do
46
- Syslog.stub(:log, nil) do
47
- syslog_appender = SemanticLogger::Appender::Syslog.new
48
- syslog_appender.send(level, "AppenderSyslogTest #{level} message")
49
- end
50
- end
51
- end
52
- end
53
-
54
- it 'allow logging with %' do
55
- message = 'AppenderSyslogTest %test'
56
- syslog_appender = SemanticLogger::Appender::Syslog.new
57
- syslog_appender.debug(message)
58
- end
59
- end
60
- end
61
- end
@@ -1,66 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- # Unit Test for SemanticLogger::Appender::Tcp
4
- module Appender
5
- class TcpTest < Minitest::Test
6
- describe SemanticLogger::Appender::Tcp do
7
- before do
8
- Net::TCPClient.stub_any_instance(:connect, true) do
9
- @appender = SemanticLogger::Appender::Tcp.new(server: 'localhost:8088')
10
- end
11
- @appender.tcp_client.instance_eval do
12
- def retry_on_connection_failure
13
- yield
14
- end
15
- end
16
- @message = 'AppenderTcpTest log message'
17
- end
18
-
19
- SemanticLogger::LEVELS.each do |level|
20
- it "send #{level}" do
21
- data = nil
22
- @appender.tcp_client.stub(:write, ->(d) { data = d }) do
23
- @appender.send(level, @message)
24
- end
25
- hash = JSON.parse(data)
26
- assert_equal @message, hash['message']
27
- assert_equal level.to_s, hash['level']
28
- refute hash['stack_trace']
29
- end
30
-
31
- it "send #{level} exceptions" do
32
- exc = nil
33
- begin
34
- Uh oh
35
- rescue Exception => e
36
- exc = e
37
- end
38
- data = nil
39
- @appender.tcp_client.stub(:write, ->(d) { data = d }) do
40
- @appender.send(level, 'Reading File', exc)
41
- end
42
- hash = JSON.parse(data)
43
- assert 'Reading File', hash['message']
44
- assert 'NameError', hash['exception']['name']
45
- assert 'undefined local variable or method', hash['exception']['message']
46
- assert_equal level.to_s, hash['level'], 'Should be error level (3)'
47
- assert hash['exception']['stack_trace'].first.include?(__FILE__), hash['exception']
48
- end
49
-
50
- it "send #{level} custom attributes" do
51
- data = nil
52
- @appender.tcp_client.stub(:write, ->(d) { data = d }) do
53
- @appender.send(level, @message, key1: 1, key2: 'a')
54
- end
55
- hash = JSON.parse(data)
56
- assert_equal @message, hash['message']
57
- assert_equal level.to_s, hash['level']
58
- refute hash['stack_trace']
59
- assert payload = hash['payload'], hash
60
- assert_equal 1, payload['key1'], payload
61
- assert_equal 'a', payload['key2'], payload
62
- end
63
- end
64
- end
65
- end
66
- end
@@ -1,59 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- # Unit Test for SemanticLogger::Appender::Tcp
4
- module Appender
5
- class UdpTest < Minitest::Test
6
- describe SemanticLogger::Appender::Udp do
7
- before do
8
- @appender = SemanticLogger::Appender::Udp.new(server: 'localhost:8088')
9
- @message = 'AppenderUdpTest log message'
10
- end
11
-
12
- SemanticLogger::LEVELS.each do |level|
13
- it "send #{level}" do
14
- data = nil
15
- @appender.socket.stub(:send, ->(d, _flags) { data = d }) do
16
- @appender.send(level, @message)
17
- end
18
- hash = JSON.parse(data)
19
- assert_equal @message, hash['message']
20
- assert_equal level.to_s, hash['level']
21
- refute hash['stack_trace']
22
- end
23
-
24
- it "send #{level} exceptions" do
25
- exc = nil
26
- begin
27
- Uh oh
28
- rescue Exception => e
29
- exc = e
30
- end
31
- data = nil
32
- @appender.socket.stub(:send, ->(d, _flags) { data = d }) do
33
- @appender.send(level, 'Reading File', exc)
34
- end
35
- hash = JSON.parse(data)
36
- assert 'Reading File', hash['message']
37
- assert 'NameError', hash['exception']['name']
38
- assert 'undefined local variable or method', hash['exception']['message']
39
- assert_equal level.to_s, hash['level'], 'Should be error level (3)'
40
- assert hash['exception']['stack_trace'].first.include?(__FILE__), hash['exception']
41
- end
42
-
43
- it "send #{level} custom attributes" do
44
- data = nil
45
- @appender.socket.stub(:send, ->(d, _flags) { data = d }) do
46
- @appender.send(level, @message, key1: 1, key2: 'a')
47
- end
48
- hash = JSON.parse(data)
49
- assert_equal @message, hash['message']
50
- assert_equal level.to_s, hash['level']
51
- refute hash['stack_trace']
52
- assert payload = hash['payload'], hash
53
- assert_equal 1, payload['key1'], payload
54
- assert_equal 'a', payload['key2'], payload
55
- end
56
- end
57
- end
58
- end
59
- end
@@ -1,95 +0,0 @@
1
- require_relative '../test_helper'
2
-
3
- # Unit Test for SemanticLogger::Appender::Wrapper
4
- #
5
- module Appender
6
- class WrapperTest < Minitest::Test
7
- # Looks like a standard Ruby Logger or Rails Logger
8
- # Except that it stores the last logged entry in the instance variable: message
9
- class MockLogger
10
- attr_accessor :message
11
-
12
- Logger::Severity.constants.each do |level|
13
- class_eval <<-EOT, __FILE__, __LINE__
14
- def #{level.downcase}(message = nil, progname = nil)
15
- if message
16
- self.message = message
17
- elsif block_given?
18
- self.message = yield
19
- else
20
- self.message = progname
21
- end
22
- self.message
23
- end
24
-
25
- def #{level}?
26
- @true
27
- end
28
- EOT
29
- end
30
-
31
- def flush
32
- true
33
- end
34
- end
35
-
36
- describe SemanticLogger::Appender::Wrapper do
37
- before do
38
- SemanticLogger.default_level = :trace
39
- SemanticLogger.backtrace_level = :trace
40
-
41
- @time = Time.new
42
- @mock_logger = MockLogger.new
43
- @appender = SemanticLogger::Appender::Wrapper.new(logger: @mock_logger)
44
- @hash = {session_id: 'HSSKLEU@JDK767', tracking_number: 12_345}
45
- @hash_str = @hash.inspect.sub('{', '\\{').sub('}', '\\}')
46
- @thread_name = Thread.current.name
47
- @file_name_reg_exp = ' wrapper_test.rb:\d+'
48
- end
49
-
50
- describe 'format logs into text form' do
51
- it 'logs blank data' do
52
- @appender.debug
53
- assert_match(/\d+-\d+-\d+ \d+:\d+:\d+.\d+ D \[\d+:#{@thread_name}#{@file_name_reg_exp}\] SemanticLogger::Appender::Wrapper/, @mock_logger.message)
54
- end
55
-
56
- it 'logs message' do
57
- @appender.debug('hello world')
58
- 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)
59
- end
60
-
61
- it 'logs message and payload' do
62
- @appender.debug('hello world', @hash)
63
- 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)
64
- end
65
-
66
- it 'logs named parameters' do
67
- @appender.debug(message: 'hello world', payload: @hash)
68
- 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)
69
- end
70
- end
71
-
72
- describe 'for each log level' do
73
- before do
74
- @appender = SemanticLogger.add_appender(logger: @mock_logger)
75
- @logger = SemanticLogger[WrapperTest]
76
- end
77
-
78
- after do
79
- SemanticLogger.remove_appender(@appender)
80
- end
81
-
82
- # Ensure that any log level can be logged
83
- Logger::Severity.constants.each do |level|
84
- it "log #{level.downcase.to_sym}" do
85
- level_char = level[0].upcase
86
- level_char = 'E' if level_char == 'U'
87
- @logger.send(level.downcase.to_sym, 'hello world', @hash)
88
- SemanticLogger.flush
89
- 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)
90
- end
91
- end
92
- end
93
- end
94
- end
95
- end