semantic_logger 5.0.0 → 5.1.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 (43) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +9 -0
  3. data/Rakefile +29 -0
  4. data/docs/api.md +480 -0
  5. data/docs/appenders.md +990 -0
  6. data/docs/config.md +605 -0
  7. data/docs/index.md +197 -0
  8. data/docs/log.md +108 -0
  9. data/docs/metrics.md +168 -0
  10. data/docs/operations.md +400 -0
  11. data/docs/rails.md +816 -0
  12. data/docs/security.md +119 -0
  13. data/docs/testing.md +285 -0
  14. data/docs/upgrading.md +409 -0
  15. data/lib/semantic_logger/appender/cloudwatch_logs.rb +4 -2
  16. data/lib/semantic_logger/appender/elasticsearch.rb +2 -5
  17. data/lib/semantic_logger/appender/elasticsearch_base.rb +17 -17
  18. data/lib/semantic_logger/appender/elasticsearch_http.rb +14 -7
  19. data/lib/semantic_logger/appender/file.rb +5 -0
  20. data/lib/semantic_logger/appender/new_relic.rb +6 -0
  21. data/lib/semantic_logger/appender/new_relic_logs.rb +2 -1
  22. data/lib/semantic_logger/appender/open_telemetry.rb +2 -1
  23. data/lib/semantic_logger/appender/opensearch.rb +2 -1
  24. data/lib/semantic_logger/appender/rabbitmq.rb +4 -3
  25. data/lib/semantic_logger/appender/sentry.rb +5 -0
  26. data/lib/semantic_logger/appender/syslog.rb +6 -3
  27. data/lib/semantic_logger/appender/tcp.rb +4 -3
  28. data/lib/semantic_logger/appender/wrapper.rb +2 -1
  29. data/lib/semantic_logger/appender.rb +6 -3
  30. data/lib/semantic_logger/appenders.rb +2 -1
  31. data/lib/semantic_logger/base.rb +0 -2
  32. data/lib/semantic_logger/formatters/color.rb +5 -2
  33. data/lib/semantic_logger/formatters/default.rb +7 -2
  34. data/lib/semantic_logger/formatters/logfmt.rb +4 -2
  35. data/lib/semantic_logger/formatters/pattern.rb +3 -1
  36. data/lib/semantic_logger/formatters/syslog.rb +2 -1
  37. data/lib/semantic_logger/formatters/syslog_cee.rb +2 -1
  38. data/lib/semantic_logger/metric/signalfx.rb +4 -2
  39. data/lib/semantic_logger/queue_processor.rb +5 -2
  40. data/lib/semantic_logger/reporters/minitest.rb +4 -4
  41. data/lib/semantic_logger/test/capture_log_events.rb +1 -1
  42. data/lib/semantic_logger/version.rb +1 -1
  43. metadata +14 -3
@@ -151,7 +151,8 @@ module SemanticLogger
151
151
  require "syslog_protocol"
152
152
  rescue LoadError
153
153
  raise LoadError,
154
- "Missing gem: syslog_protocol. This gem is required when logging over TCP or UDP. To fix this error: gem install syslog_protocol"
154
+ "Missing gem: syslog_protocol. This gem is required when logging over TCP or UDP. " \
155
+ "To fix this error: gem install syslog_protocol"
155
156
  end
156
157
 
157
158
  # The net_tcp_client gem is required when logging over TCP.
@@ -160,7 +161,8 @@ module SemanticLogger
160
161
  require "net/tcp_client"
161
162
  rescue LoadError
162
163
  raise LoadError,
163
- "Missing gem: net_tcp_client. This gem is required when logging over TCP. To fix this error: gem install net_tcp_client"
164
+ "Missing gem: net_tcp_client. This gem is required when logging over TCP. " \
165
+ "To fix this error: gem install net_tcp_client"
164
166
  end
165
167
  end
166
168
  end
@@ -210,7 +212,8 @@ module SemanticLogger
210
212
  @remote_syslog.flush if @remote_syslog.respond_to?(:flush)
211
213
  end
212
214
 
213
- # Returns [SemanticLogger::Formatters::Base] default formatter for this Appender depending on the protocal selected
215
+ # Returns [SemanticLogger::Formatters::Base] default formatter for this Appender
216
+ # depending on the protocol selected
214
217
  def default_formatter
215
218
  if protocol == :syslog
216
219
  # Format is text output without the time.
@@ -183,8 +183,8 @@ module SemanticLogger
183
183
  # connect_retry_count: 5
184
184
  # )
185
185
  def initialize(separator: "\n",
186
- level: nil, formatter: nil, filter: nil, application: nil, environment: nil, host: nil, metrics: false,
187
- **tcp_client_args, &)
186
+ level: nil, formatter: nil, filter: nil, application: nil, environment: nil,
187
+ host: nil, metrics: false, **tcp_client_args, &)
188
188
  @separator = separator
189
189
  @tcp_client_args = tcp_client_args
190
190
 
@@ -192,7 +192,8 @@ module SemanticLogger
192
192
  Net::TCPClient.logger = logger
193
193
  Net::TCPClient.logger.name = "Net::TCPClient"
194
194
 
195
- super(level: level, formatter: formatter, filter: filter, application: application, environment: environment, host: host, metrics: metrics, &)
195
+ super(level: level, formatter: formatter, filter: filter, application: application,
196
+ environment: environment, host: host, metrics: metrics, &)
196
197
  reopen
197
198
  end
198
199
 
@@ -45,7 +45,8 @@ module SemanticLogger
45
45
  does_not_implement = LEVELS[1..].find { |i| !@logger.respond_to?(i) }
46
46
  if does_not_implement
47
47
  raise(ArgumentError,
48
- "Supplied logger does not implement:#{does_not_implement}. It must implement all of #{LEVELS[1..].inspect}")
48
+ "Supplied logger does not implement:#{does_not_implement}. " \
49
+ "It must implement all of #{LEVELS[1..].inspect}")
49
50
  end
50
51
 
51
52
  super(**args, &)
@@ -87,7 +87,8 @@ module SemanticLogger
87
87
  appender
88
88
  else
89
89
  raise(ArgumentError,
90
- "Parameter :appender must be either a Symbol or an object derived from SemanticLogger::Subscriber, not: #{appender.inspect}")
90
+ "Parameter :appender must be either a Symbol or an object derived from " \
91
+ "SemanticLogger::Subscriber, not: #{appender.inspect}")
91
92
  end
92
93
  elsif metric
93
94
  if metric.is_a?(Symbol)
@@ -96,11 +97,13 @@ module SemanticLogger
96
97
  metric
97
98
  else
98
99
  raise(ArgumentError,
99
- "Parameter :metric must be either a Symbol or an object derived from SemanticLogger::Subscriber, not: #{appender.inspect}")
100
+ "Parameter :metric must be either a Symbol or an object derived from " \
101
+ "SemanticLogger::Subscriber, not: #{appender.inspect}")
100
102
  end
101
103
  else
102
104
  raise(ArgumentError,
103
- "To create an appender it must supply one of the following: :io, :file_name, :appender, :metric, or :logger")
105
+ "To create an appender it must supply one of the following: " \
106
+ ":io, :file_name, :appender, :metric, or :logger")
104
107
  end
105
108
  end
106
109
 
@@ -14,7 +14,8 @@ module SemanticLogger
14
14
 
15
15
  stream = appender.respond_to?(:console_stream) && appender.console_stream
16
16
  if stream && console_streams.include?(stream)
17
- logger.warn "Ignoring attempt to add a second #{stream} console appender since it would result in duplicate console output."
17
+ logger.warn "Ignoring attempt to add a second #{stream} console appender since it " \
18
+ "would result in duplicate console output."
18
19
  return
19
20
  end
20
21
 
@@ -155,8 +155,6 @@ module SemanticLogger
155
155
  log.named_tags = (thread[:semantic_logger_named_tags] || {}).clone
156
156
  thread.backtrace
157
157
  end
158
- # TODO: Keep backtrace instead of transforming into a text message at this point
159
- # Maybe log_backtrace: true
160
158
  if backtrace
161
159
  message += "\n"
162
160
  message << backtrace.join("\n")
@@ -97,7 +97,9 @@ module SemanticLogger
97
97
  return if named_tags.nil? || named_tags.empty?
98
98
 
99
99
  list = []
100
- named_tags.each_pair { |name, value| list << "#{color}#{escape_control_characters(name)}: #{escape_control_characters(value)}#{color_map.clear}" }
100
+ named_tags.each_pair do |name, value|
101
+ list << "#{color}#{escape_control_characters(name)}: #{escape_control_characters(value)}#{color_map.clear}"
102
+ end
101
103
  "{#{list.join(', ')}}"
102
104
  end
103
105
 
@@ -126,7 +128,8 @@ module SemanticLogger
126
128
  def exception
127
129
  return unless log.exception
128
130
 
129
- "-- Exception: #{color}#{log.exception.class}: #{escape_control_characters(log.exception.message)}#{color_map.clear}\n#{log.backtrace_to_s}"
131
+ "-- Exception: #{color}#{log.exception.class}: " \
132
+ "#{escape_control_characters(log.exception.message)}#{color_map.clear}\n#{log.backtrace_to_s}"
130
133
  end
131
134
 
132
135
  def call(log, logger)
@@ -43,7 +43,9 @@ module SemanticLogger
43
43
  return if named_tags.nil? || named_tags.empty?
44
44
 
45
45
  list = []
46
- named_tags.each_pair { |name, value| list << "#{escape_control_characters(name)}: #{escape_control_characters(value)}" }
46
+ named_tags.each_pair do |name, value|
47
+ list << "#{escape_control_characters(name)}: #{escape_control_characters(value)}"
48
+ end
47
49
  "{#{list.join(', ')}}"
48
50
  end
49
51
 
@@ -72,7 +74,10 @@ module SemanticLogger
72
74
 
73
75
  # Exception
74
76
  def exception
75
- "-- Exception: #{log.exception.class}: #{escape_control_characters(log.exception.message)}\n#{log.backtrace_to_s}" if log.exception
77
+ return unless log.exception
78
+
79
+ "-- Exception: #{log.exception.class}: #{escape_control_characters(log.exception.message)}\n" \
80
+ "#{log.backtrace_to_s}"
76
81
  end
77
82
 
78
83
  # Default text log format
@@ -8,11 +8,13 @@ module SemanticLogger
8
8
  # :timestamp, :level, :name, :message, :duration, :tags, :named_tags
9
9
  #
10
10
  # E.g.
11
- # timestamp="2020-07-20T08:32:05.375276Z" level=info name="DefaultTest" base="breakfast" spaces="second breakfast" double_quotes="\"elevensies\"" single_quotes="'lunch'" tag="success"
11
+ # timestamp="2020-07-20T08:32:05.375276Z" level=info name="DefaultTest" base="breakfast"
12
+ # spaces="second breakfast" double_quotes="\"elevensies\"" single_quotes="'lunch'" tag="success"
12
13
  #
13
14
  # All timestamps are ISO8601 formatteed
14
15
  # All user supplied values are escaped and surrounded by double quotes to avoid ambiguious message delimeters
15
- # `tags` are treated as keys with boolean values. Tag names are not formatted or validated, ensure you use valid logfmt format for tag names.
16
+ # `tags` are treated as keys with boolean values. Tag names are not formatted or validated;
17
+ # ensure you use valid logfmt format for tag names.
16
18
  # `named_tags` are flattened are merged into the top level message field. Any conflicting fields are overridden.
17
19
  # `payload` values take precedence over `tags` and `named_tags`. Any conflicting fields are overridden.
18
20
  #
@@ -172,7 +172,9 @@ module SemanticLogger
172
172
  if key
173
173
  escape_control_characters(named[key.to_sym] || named[key.to_s])
174
174
  else
175
- named.map { |name, value| "#{escape_control_characters(name)}: #{escape_control_characters(value)}" }.join(", ")
175
+ named.map do |name, value|
176
+ "#{escape_control_characters(name)}: #{escape_control_characters(value)}"
177
+ end.join(", ")
176
178
  end
177
179
  end
178
180
 
@@ -2,7 +2,8 @@ begin
2
2
  require "syslog_protocol"
3
3
  rescue LoadError
4
4
  raise LoadError,
5
- 'Gem syslog_protocol is required for remote logging using the Syslog protocol. Please add the gem "syslog_protocol" to your Gemfile.'
5
+ "Gem syslog_protocol is required for remote logging using the Syslog protocol. " \
6
+ 'Please add the gem "syslog_protocol" to your Gemfile.'
6
7
  end
7
8
 
8
9
  module SemanticLogger
@@ -2,7 +2,8 @@ begin
2
2
  require "syslog_protocol"
3
3
  rescue LoadError
4
4
  raise LoadError,
5
- 'Gem syslog_protocol is required for remote logging using the Syslog protocol. Please add the gem "syslog_protocol" to your Gemfile.'
5
+ "Gem syslog_protocol is required for remote logging using the Syslog protocol. " \
6
+ 'Please add the gem "syslog_protocol" to your Gemfile.'
6
7
  end
7
8
 
8
9
  module SemanticLogger
@@ -66,8 +66,10 @@ module SemanticLogger
66
66
  # logger.info(metric: 'Common/User/authorize', duration: 1.4)
67
67
  #
68
68
  # Then it is translated into the following 2 log entries under the covers:
69
- # logger.info(metric: 'Application.average', metric_amount: 1.4, dimensions: {class: 'Common::User', action: 'authorize'})
70
- # logger.info(metric: 'Application.counter', metric_amount: 1, dimensions: {class: 'Common::User', action: 'authorize'})
69
+ # logger.info(metric: 'Application.average', metric_amount: 1.4,
70
+ # dimensions: {class: 'Common::User', action: 'authorize'})
71
+ # logger.info(metric: 'Application.counter', metric_amount: 1,
72
+ # dimensions: {class: 'Common::User', action: 'authorize'})
71
73
  #
72
74
  # Similarly with a measure block which automatically supplies the duration:
73
75
  # logger.measure_info(metric: 'Common/User/authorize') do
@@ -224,7 +224,8 @@ module SemanticLogger
224
224
  if async_max_retries == -1 || retry_count < async_max_retries
225
225
  @retry_count += 1
226
226
  limit = async_max_retries == -1 ? "unlimited" : async_max_retries
227
- safe_log(:warn, "Async: Restarting due to exception, retry #{retry_count} of #{limit}, sleeping #{retry_count}s", e)
227
+ safe_log(:warn,
228
+ "Async: Restarting due to exception, retry #{retry_count} of #{limit}, sleeping #{retry_count}s", e)
228
229
  sleep(retry_count)
229
230
  retry
230
231
  else
@@ -341,7 +342,9 @@ module SemanticLogger
341
342
  diff = Time.now - log.time
342
343
  return unless diff > lag_threshold_s
343
344
 
344
- logger.warn "Async: Appender thread has fallen behind by #{diff} seconds with #{queue.size} messages queued up. Consider reducing the log level or changing the appenders"
345
+ logger.warn "Async: Appender thread has fallen behind by #{diff} seconds with " \
346
+ "#{queue.size} messages queued up. Consider reducing the log level or " \
347
+ "changing the appenders"
345
348
  end
346
349
 
347
350
  # Submit a command to the worker thread and wait for the reply.
@@ -16,10 +16,10 @@ module SemanticLogger
16
16
  #
17
17
  # Log entries similar to the following should show up in the log file:
18
18
  #
19
- # 2019-02-06 18:58:17.522467 I [84730:70256441962000] Minitest -- START RocketJob::DirmonEntry::with valid entry::#archive_file test_0001_moves file to archive dir
20
- # 2019-02-06 18:58:17.527492 I [84730:70256441962000] (4.980ms) Minitest -- PASS RocketJob::DirmonEntry::with valid entry::#archive_file test_0001_moves file to archive dir
21
- # 2019-02-06 18:58:17.527835 I [84730:70256441962000] Minitest -- START RocketJob::DirmonEntry::#job_class::with a valid job_class_name test_0001_return job class
22
- # 2019-02-06 18:58:17.529761 I [84730:70256441962000] (1.882ms) Minitest -- PASS RocketJob::DirmonEntry::#job_class::with a valid job_class_name test_0001_return job class
19
+ # 2019-02-06 18:58:17.522467 I [84730:70256] Minitest -- START MyJob test_0001_archives file
20
+ # 2019-02-06 18:58:17.527492 I [84730:70256] (4.980ms) Minitest -- PASS MyJob test_0001_archives file
21
+ # 2019-02-06 18:58:17.527835 I [84730:70256] Minitest -- START MyJob test_0002_returns job class
22
+ # 2019-02-06 18:58:17.529761 I [84730:70256] (1.882ms) Minitest -- PASS MyJob test_0002_returns job class
23
23
  class Minitest < ::Minitest::AbstractReporter
24
24
  include SemanticLogger::Loggable
25
25
 
@@ -24,7 +24,7 @@ module SemanticLogger
24
24
 
25
25
  # By default collect all log levels, and collect metric only log events.
26
26
  def initialize(level: :trace, metrics: true)
27
- super(level: level, metrics: true)
27
+ super
28
28
  @events = []
29
29
  end
30
30
 
@@ -1,3 +1,3 @@
1
1
  module SemanticLogger
2
- VERSION = "5.0.0".freeze
2
+ VERSION = "5.1.0".freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semantic_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 5.0.0
4
+ version: 5.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
@@ -33,6 +33,17 @@ files:
33
33
  - LICENSE.txt
34
34
  - README.md
35
35
  - Rakefile
36
+ - docs/api.md
37
+ - docs/appenders.md
38
+ - docs/config.md
39
+ - docs/index.md
40
+ - docs/log.md
41
+ - docs/metrics.md
42
+ - docs/operations.md
43
+ - docs/rails.md
44
+ - docs/security.md
45
+ - docs/testing.md
46
+ - docs/upgrading.md
36
47
  - lib/semantic_logger.rb
37
48
  - lib/semantic_logger/ansi_colors.rb
38
49
  - lib/semantic_logger/appender.rb
@@ -112,9 +123,9 @@ licenses:
112
123
  - Apache-2.0
113
124
  metadata:
114
125
  bug_tracker_uri: https://github.com/reidmorrison/semantic_logger/issues
115
- changelog_uri: https://github.com/reidmorrison/semantic_logger/releases
126
+ changelog_uri: https://github.com/reidmorrison/semantic_logger/blob/main/CHANGELOG.md
116
127
  documentation_uri: https://logger.rocketjob.io
117
- source_code_uri: https://github.com/reidmorrison/semantic_logger/tree/v5.0.0
128
+ source_code_uri: https://github.com/reidmorrison/semantic_logger/tree/v5.1.0
118
129
  rubygems_mfa_required: 'true'
119
130
  rdoc_options: []
120
131
  require_paths: