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.
- checksums.yaml +4 -4
- data/README.md +9 -0
- data/Rakefile +29 -0
- data/docs/api.md +480 -0
- data/docs/appenders.md +990 -0
- data/docs/config.md +605 -0
- data/docs/index.md +197 -0
- data/docs/log.md +108 -0
- data/docs/metrics.md +168 -0
- data/docs/operations.md +400 -0
- data/docs/rails.md +816 -0
- data/docs/security.md +119 -0
- data/docs/testing.md +285 -0
- data/docs/upgrading.md +409 -0
- data/lib/semantic_logger/appender/cloudwatch_logs.rb +4 -2
- data/lib/semantic_logger/appender/elasticsearch.rb +2 -5
- data/lib/semantic_logger/appender/elasticsearch_base.rb +17 -17
- data/lib/semantic_logger/appender/elasticsearch_http.rb +14 -7
- data/lib/semantic_logger/appender/file.rb +5 -0
- data/lib/semantic_logger/appender/new_relic.rb +6 -0
- data/lib/semantic_logger/appender/new_relic_logs.rb +2 -1
- data/lib/semantic_logger/appender/open_telemetry.rb +2 -1
- data/lib/semantic_logger/appender/opensearch.rb +2 -1
- data/lib/semantic_logger/appender/rabbitmq.rb +4 -3
- data/lib/semantic_logger/appender/sentry.rb +5 -0
- data/lib/semantic_logger/appender/syslog.rb +6 -3
- data/lib/semantic_logger/appender/tcp.rb +4 -3
- data/lib/semantic_logger/appender/wrapper.rb +2 -1
- data/lib/semantic_logger/appender.rb +6 -3
- data/lib/semantic_logger/appenders.rb +2 -1
- data/lib/semantic_logger/base.rb +0 -2
- data/lib/semantic_logger/formatters/color.rb +5 -2
- data/lib/semantic_logger/formatters/default.rb +7 -2
- data/lib/semantic_logger/formatters/logfmt.rb +4 -2
- data/lib/semantic_logger/formatters/pattern.rb +3 -1
- data/lib/semantic_logger/formatters/syslog.rb +2 -1
- data/lib/semantic_logger/formatters/syslog_cee.rb +2 -1
- data/lib/semantic_logger/metric/signalfx.rb +4 -2
- data/lib/semantic_logger/queue_processor.rb +5 -2
- data/lib/semantic_logger/reporters/minitest.rb +4 -4
- data/lib/semantic_logger/test/capture_log_events.rb +1 -1
- data/lib/semantic_logger/version.rb +1 -1
- 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.
|
|
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.
|
|
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
|
|
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,
|
|
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,
|
|
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}.
|
|
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
|
|
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
|
|
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:
|
|
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
|
|
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
|
|
data/lib/semantic_logger/base.rb
CHANGED
|
@@ -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
|
|
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}:
|
|
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
|
|
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
|
-
|
|
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"
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
70
|
-
#
|
|
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,
|
|
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
|
|
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:
|
|
20
|
-
# 2019-02-06 18:58:17.527492 I [84730:
|
|
21
|
-
# 2019-02-06 18:58:17.527835 I [84730:
|
|
22
|
-
# 2019-02-06 18:58:17.529761 I [84730:
|
|
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
|
|
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.
|
|
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/
|
|
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.
|
|
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:
|