semantic_logger 4.5.0 → 4.12.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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +51 -21
  3. data/Rakefile +7 -7
  4. data/lib/semantic_logger/ansi_colors.rb +0 -10
  5. data/lib/semantic_logger/appender/async.rb +12 -10
  6. data/lib/semantic_logger/appender/async_batch.rb +7 -3
  7. data/lib/semantic_logger/appender/bugsnag.rb +43 -30
  8. data/lib/semantic_logger/appender/elasticsearch.rb +34 -15
  9. data/lib/semantic_logger/appender/elasticsearch_http.rb +4 -4
  10. data/lib/semantic_logger/appender/file.rb +249 -67
  11. data/lib/semantic_logger/appender/graylog.rb +15 -10
  12. data/lib/semantic_logger/appender/honeybadger.rb +3 -3
  13. data/lib/semantic_logger/appender/http.rb +41 -20
  14. data/lib/semantic_logger/appender/io.rb +68 -0
  15. data/lib/semantic_logger/appender/kafka.rb +46 -31
  16. data/lib/semantic_logger/appender/mongodb.rb +6 -6
  17. data/lib/semantic_logger/appender/new_relic.rb +2 -2
  18. data/lib/semantic_logger/appender/rabbitmq.rb +5 -5
  19. data/lib/semantic_logger/appender/sentry.rb +7 -7
  20. data/lib/semantic_logger/appender/sentry_ruby.rb +138 -0
  21. data/lib/semantic_logger/appender/splunk.rb +7 -5
  22. data/lib/semantic_logger/appender/splunk_http.rb +6 -5
  23. data/lib/semantic_logger/appender/syslog.rb +23 -15
  24. data/lib/semantic_logger/appender/tcp.rb +9 -9
  25. data/lib/semantic_logger/appender/udp.rb +2 -2
  26. data/lib/semantic_logger/appender/wrapper.rb +3 -2
  27. data/lib/semantic_logger/appender.rb +62 -65
  28. data/lib/semantic_logger/appenders.rb +36 -53
  29. data/lib/semantic_logger/base.rb +61 -39
  30. data/lib/semantic_logger/formatters/base.rb +16 -6
  31. data/lib/semantic_logger/formatters/color.rb +14 -15
  32. data/lib/semantic_logger/formatters/default.rb +18 -5
  33. data/lib/semantic_logger/formatters/fluentd.rb +7 -18
  34. data/lib/semantic_logger/formatters/json.rb +3 -5
  35. data/lib/semantic_logger/formatters/logfmt.rb +77 -0
  36. data/lib/semantic_logger/formatters/raw.rb +39 -10
  37. data/lib/semantic_logger/formatters/signalfx.rb +14 -21
  38. data/lib/semantic_logger/formatters/syslog.rb +8 -6
  39. data/lib/semantic_logger/formatters/syslog_cee.rb +9 -7
  40. data/lib/semantic_logger/formatters.rb +13 -13
  41. data/lib/semantic_logger/jruby/garbage_collection_logger.rb +4 -2
  42. data/lib/semantic_logger/levels.rb +9 -7
  43. data/lib/semantic_logger/log.rb +58 -73
  44. data/lib/semantic_logger/loggable.rb +8 -1
  45. data/lib/semantic_logger/logger.rb +19 -11
  46. data/lib/semantic_logger/metric/new_relic.rb +3 -3
  47. data/lib/semantic_logger/metric/signalfx.rb +3 -3
  48. data/lib/semantic_logger/metric/statsd.rb +7 -7
  49. data/lib/semantic_logger/processor.rb +9 -7
  50. data/lib/semantic_logger/reporters/minitest.rb +4 -4
  51. data/lib/semantic_logger/semantic_logger.rb +57 -23
  52. data/lib/semantic_logger/subscriber.rb +24 -7
  53. data/lib/semantic_logger/sync.rb +12 -0
  54. data/lib/semantic_logger/sync_processor.rb +58 -0
  55. data/lib/semantic_logger/test/capture_log_events.rb +34 -0
  56. data/lib/semantic_logger/utils.rb +32 -13
  57. data/lib/semantic_logger/version.rb +1 -1
  58. data/lib/semantic_logger.rb +27 -22
  59. metadata +15 -10
@@ -5,7 +5,7 @@ module SemanticLogger
5
5
  class Subscriber < SemanticLogger::Base
6
6
  # Every appender has its own formatter
7
7
  attr_reader :formatter
8
- attr_writer :application, :host, :logger, :metrics
8
+ attr_writer :application, :environment, :host, :logger, :metrics
9
9
 
10
10
  # Returns the current log level if set, otherwise it logs everything it receives.
11
11
  def level
@@ -22,6 +22,11 @@ module SemanticLogger
22
22
  # NOOP
23
23
  end
24
24
 
25
+ # Method called to log an event
26
+ def log(log)
27
+ raise NotImplementedError
28
+ end
29
+
25
30
  # Returns [SemanticLogger::Formatters::Default] default formatter for this subscriber.
26
31
  def default_formatter
27
32
  SemanticLogger::Formatters::Default.new
@@ -32,6 +37,11 @@ module SemanticLogger
32
37
  @application || SemanticLogger.application
33
38
  end
34
39
 
40
+ # Allow environment name to be set globally or on a per subscriber basis.
41
+ def environment
42
+ @environment || SemanticLogger.environment
43
+ end
44
+
35
45
  # Allow host name to be set globally or on a per subscriber basis.
36
46
  def host
37
47
  @host || SemanticLogger.host
@@ -40,11 +50,12 @@ module SemanticLogger
40
50
  # Give each appender its own logger for logging.
41
51
  # For example trace messages sent to services or errors when something fails.
42
52
  def logger
43
- @logger ||= begin
44
- logger = SemanticLogger::Processor.logger.clone
45
- logger.name = self.class.name
46
- logger
47
- end
53
+ @logger ||=
54
+ begin
55
+ logger = SemanticLogger::Processor.logger.clone
56
+ logger.name = self.class.name
57
+ logger
58
+ end
48
59
  end
49
60
 
50
61
  # Set the formatter from Symbol|Hash|Block
@@ -62,6 +73,11 @@ module SemanticLogger
62
73
  super(log) && (log.metric_only? ? metrics? : true)
63
74
  end
64
75
 
76
+ # Whether this appender is logging to stdout or stderror
77
+ def console_output?
78
+ false
79
+ end
80
+
65
81
  private
66
82
 
67
83
  # Initializer for Abstract Class SemanticLogger::Subscriber
@@ -92,9 +108,10 @@ module SemanticLogger
92
108
  # metrics: [Boolean]
93
109
  # Whether to log metric only entries with this subscriber.
94
110
  # Default: false
95
- def initialize(level: nil, formatter: nil, filter: nil, application: nil, host: nil, metrics: false, &block)
111
+ def initialize(level: nil, formatter: nil, filter: nil, application: nil, environment: nil, host: nil, metrics: false, &block)
96
112
  self.formatter = block || formatter
97
113
  @application = application
114
+ @environment = environment
98
115
  @host = host
99
116
  @metrics = metrics
100
117
 
@@ -0,0 +1,12 @@
1
+ # Run Semantic Logger in Synchronous mode.
2
+ #
3
+ # I.e. Instead of logging messages in a separate thread for better performance,
4
+ # log them using the current thread.
5
+ #
6
+ # Usage:
7
+ # require "semantic_logger/sync"
8
+ #
9
+ # Or, when using a Gemfile:
10
+ # gem "semantic_logger", require: "semantic_logger/sync"
11
+ require "semantic_logger"
12
+ SemanticLogger.sync!
@@ -0,0 +1,58 @@
1
+ module SemanticLogger
2
+ # The SyncProcessor performs logging in the current thread.
3
+ #
4
+ # Appenders are designed to only be used by one thread at a time, so all calls
5
+ # are mutex protected in case SyncProcessor is being used in a multi-threaded environment.
6
+ class SyncProcessor
7
+ def add(*args, &block)
8
+ @mutex.synchronize { @appenders.add(*args, &block) }
9
+ end
10
+
11
+ def log(*args, &block)
12
+ @mutex.synchronize { @appenders.log(*args, &block) }
13
+ end
14
+
15
+ def flush
16
+ @mutex.synchronize { @appenders.flush }
17
+ end
18
+
19
+ def close
20
+ @mutex.synchronize { @appenders.close }
21
+ end
22
+
23
+ def reopen(*args)
24
+ @mutex.synchronize { @appenders.reopen(*args) }
25
+ end
26
+
27
+ # Allow the internal logger to be overridden from its default of $stderr
28
+ # Can be replaced with another Ruby logger or Rails logger, but never to
29
+ # SemanticLogger::Logger itself since it is for reporting problems
30
+ # while trying to log to the various appenders
31
+ class << self
32
+ attr_writer :logger
33
+ end
34
+
35
+ # Internal logger for SemanticLogger
36
+ # For example when an appender is not working etc..
37
+ # By default logs to $stderr
38
+ def self.logger
39
+ @logger ||=
40
+ begin
41
+ l = SemanticLogger::Appender::IO.new($stderr, level: :warn)
42
+ l.name = name
43
+ l
44
+ end
45
+ end
46
+
47
+ attr_reader :appenders
48
+
49
+ def initialize(appenders = nil)
50
+ @mutex = Mutex.new
51
+ @appenders = appenders || Appenders.new(self.class.logger.dup)
52
+ end
53
+
54
+ def start
55
+ # NOP
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,34 @@
1
+ module SemanticLogger
2
+ module Test
3
+ # Logging class to captures all logging events in memory.
4
+ #
5
+ # Example:
6
+ #
7
+ # class UserTest < ActiveSupport::TestCase
8
+ # describe User do
9
+ # let(:capture_logger) { SemanticLogger::Test::CaptureLogEvents.new }
10
+ # let(:user) { User.new }
11
+ #
12
+ # it "logs message" do
13
+ # user.stub(:logger, capture_logger) do
14
+ # user.enable!
15
+ # end
16
+ # assert_equal "Hello World", capture_logger.events.last.message
17
+ # assert_equal :info, capture_logger.events.last.level
18
+ # end
19
+ # end
20
+ # end
21
+ class CaptureLogEvents < SemanticLogger::Subscriber
22
+ attr_accessor :events
23
+
24
+ # By default collect all log levels, and collect metric only log events.
25
+ def initialize(level: :trace, metrics: true)
26
+ super(level: level, metrics: true)
27
+ end
28
+
29
+ def log(log)
30
+ (@events ||= []) << log
31
+ end
32
+ end
33
+ end
34
+ end
@@ -2,7 +2,7 @@ module SemanticLogger
2
2
  # Internal-use only utility functions for Semantic Logger.
3
3
  # Not intended for public use.
4
4
  module Utils
5
- def self.constantize_symbol(symbol, namespace = 'SemanticLogger::Appender')
5
+ def self.constantize_symbol(symbol, namespace = "SemanticLogger::Appender")
6
6
  klass = "#{namespace}::#{camelize(symbol.to_s)}"
7
7
  begin
8
8
  Object.const_get(klass)
@@ -15,8 +15,8 @@ module SemanticLogger
15
15
  def self.camelize(term)
16
16
  string = term.to_s
17
17
  string = string.sub(/^[a-z\d]*/, &:capitalize)
18
- string.gsub!(/(?:_|(\/))([a-z\d]*)/i) { "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}" }
19
- string.gsub!('/'.freeze, '::'.freeze)
18
+ string.gsub!(%r{(?:_|(/))([a-z\d]*)}i) { "#{Regexp.last_match(1)}#{Regexp.last_match(2).capitalize}" }
19
+ string.gsub!("/".freeze, "::".freeze)
20
20
  string
21
21
  end
22
22
 
@@ -32,29 +32,48 @@ module SemanticLogger
32
32
  end
33
33
  end
34
34
 
35
- SELF_PATTERN = File.join('lib', 'semantic_logger')
36
-
37
- # Extract the backtrace leaving out the last few Semantic Logger lines.
35
+ # Extract the backtrace stripping off the leading semantic logger entries.
36
+ # Leaves all other system and gem path entries in place.
38
37
  def self.extract_backtrace(stack = caller)
39
- while (first = stack.first) && first.include?(SELF_PATTERN)
38
+ while (first = stack.first) && extract_path?(first)
40
39
  stack.shift
41
40
  end
42
41
  stack
43
42
  end
44
43
 
45
- # Strips off all gems and built-in ruby code paths from the top of the stack until application code is found.
44
+ def self.extract_paths
45
+ @extract_paths ||= %w[lib/semantic_logger lib/rails_semantic_logger]
46
+ end
47
+
48
+ # Whether this path should be excluded from any cleansed backtrace
49
+ def self.extract_path?(path)
50
+ extract_paths.any? { |exclude| path.include?(exclude) }
51
+ end
52
+
53
+ # Try to strip everything off of the supplied backtrace, until the first application stack entry is at the top.
54
+ # For example all leading gem paths and built-in ruby code paths are removed from the top.
55
+ # Once the first application entry is found, the remaining stack is returned.
46
56
  def self.strip_backtrace(stack = caller)
47
- while (first = stack.first) && system_path?(first)
57
+ while (first = stack.first) && (strip_path?(first) || extract_path?(first))
48
58
  stack.shift
49
59
  end
50
60
  stack
51
61
  end
52
62
 
53
- GEM_ROOT = File.expand_path('../../..', __dir__) + '/'
63
+ # Paths to exclude in the stripped backtrace
64
+ # Includes Gems and built-in Ruby code paths
65
+ def self.strip_paths
66
+ @strip_paths ||=
67
+ begin
68
+ paths = Gem.path | [Gem.default_dir]
69
+ paths << RbConfig::CONFIG["rubylibdir"]
70
+ paths
71
+ end
72
+ end
54
73
 
55
- def self.system_path?(path)
56
- path.start_with?(GEM_ROOT) ||
57
- path.start_with?(RbConfig::CONFIG['rubylibdir'])
74
+ # Whether this path should be excluded from any cleansed backtrace
75
+ def self.strip_path?(path)
76
+ strip_paths.any? { |exclude| path.start_with?(exclude) }
58
77
  end
59
78
  end
60
79
  end
@@ -1,3 +1,3 @@
1
1
  module SemanticLogger
2
- VERSION = '4.5.0'.freeze
2
+ VERSION = "4.12.0".freeze
3
3
  end
@@ -1,43 +1,48 @@
1
- require 'semantic_logger/core_ext/thread'
2
- require 'semantic_logger/version'
1
+ require "semantic_logger/core_ext/thread"
2
+ require "semantic_logger/version"
3
3
 
4
4
  # @formatter:off
5
5
  module SemanticLogger
6
- autoload :AnsiColors, 'semantic_logger/ansi_colors'
7
- autoload :Appender, 'semantic_logger/appender'
8
- autoload :Appenders, 'semantic_logger/appenders'
9
- autoload :Base, 'semantic_logger/base'
10
- autoload :DebugAsTraceLogger, 'semantic_logger/debug_as_trace_logger'
11
- autoload :Formatters, 'semantic_logger/formatters'
12
- autoload :Levels, 'semantic_logger/levels'
13
- autoload :Log, 'semantic_logger/log'
14
- autoload :Logger, 'semantic_logger/logger'
15
- autoload :Loggable, 'semantic_logger/loggable'
16
- autoload :Processor, 'semantic_logger/processor'
17
- autoload :Subscriber, 'semantic_logger/subscriber'
18
- autoload :Utils, 'semantic_logger/utils'
6
+ autoload :AnsiColors, "semantic_logger/ansi_colors"
7
+ autoload :Appender, "semantic_logger/appender"
8
+ autoload :Appenders, "semantic_logger/appenders"
9
+ autoload :Base, "semantic_logger/base"
10
+ autoload :DebugAsTraceLogger, "semantic_logger/debug_as_trace_logger"
11
+ autoload :Formatters, "semantic_logger/formatters"
12
+ autoload :Levels, "semantic_logger/levels"
13
+ autoload :Log, "semantic_logger/log"
14
+ autoload :Logger, "semantic_logger/logger"
15
+ autoload :Loggable, "semantic_logger/loggable"
16
+ autoload :Processor, "semantic_logger/processor"
17
+ autoload :Subscriber, "semantic_logger/subscriber"
18
+ autoload :SyncProcessor, "semantic_logger/sync_processor"
19
+ autoload :Utils, "semantic_logger/utils"
19
20
 
20
21
  module Concerns
21
- autoload :Compatibility, 'semantic_logger/concerns/compatibility'
22
+ autoload :Compatibility, "semantic_logger/concerns/compatibility"
22
23
  end
23
24
 
24
25
  module Metric
25
- autoload :NewRelic, 'semantic_logger/metric/new_relic'
26
- autoload :Signalfx, 'semantic_logger/metric/signalfx'
27
- autoload :Statsd, 'semantic_logger/metric/statsd'
26
+ autoload :NewRelic, "semantic_logger/metric/new_relic"
27
+ autoload :Signalfx, "semantic_logger/metric/signalfx"
28
+ autoload :Statsd, "semantic_logger/metric/statsd"
28
29
  end
29
30
 
30
31
  module Reporters
31
- autoload :Minitest, 'semantic_logger/reporters/minitest'
32
+ autoload :Minitest, "semantic_logger/reporters/minitest"
33
+ end
34
+
35
+ module Test
36
+ autoload :CaptureLogEvents, "semantic_logger/test/capture_log_events"
32
37
  end
33
38
 
34
39
  if defined?(JRuby)
35
40
  module JRuby
36
- autoload :GarbageCollectionLogger, 'semantic_logger/jruby/garbage_collection_logger'
41
+ autoload :GarbageCollectionLogger, "semantic_logger/jruby/garbage_collection_logger"
37
42
  end
38
43
  end
39
44
  end
40
- require 'semantic_logger/semantic_logger'
45
+ require "semantic_logger/semantic_logger"
41
46
  # @formatter:on
42
47
 
43
48
  # Flush all appenders at exit, waiting for outstanding messages on the queue
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: semantic_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.5.0
4
+ version: 4.12.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Reid Morrison
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-02-21 00:00:00.000000000 Z
11
+ date: 2022-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: concurrent-ruby
@@ -24,9 +24,8 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.0'
27
- description:
27
+ description:
28
28
  email:
29
- - reidmo@gmail.com
30
29
  executables: []
31
30
  extensions: []
32
31
  extra_rdoc_files: []
@@ -46,11 +45,13 @@ files:
46
45
  - lib/semantic_logger/appender/graylog.rb
47
46
  - lib/semantic_logger/appender/honeybadger.rb
48
47
  - lib/semantic_logger/appender/http.rb
48
+ - lib/semantic_logger/appender/io.rb
49
49
  - lib/semantic_logger/appender/kafka.rb
50
50
  - lib/semantic_logger/appender/mongodb.rb
51
51
  - lib/semantic_logger/appender/new_relic.rb
52
52
  - lib/semantic_logger/appender/rabbitmq.rb
53
53
  - lib/semantic_logger/appender/sentry.rb
54
+ - lib/semantic_logger/appender/sentry_ruby.rb
54
55
  - lib/semantic_logger/appender/splunk.rb
55
56
  - lib/semantic_logger/appender/splunk_http.rb
56
57
  - lib/semantic_logger/appender/syslog.rb
@@ -68,6 +69,7 @@ files:
68
69
  - lib/semantic_logger/formatters/default.rb
69
70
  - lib/semantic_logger/formatters/fluentd.rb
70
71
  - lib/semantic_logger/formatters/json.rb
72
+ - lib/semantic_logger/formatters/logfmt.rb
71
73
  - lib/semantic_logger/formatters/one_line.rb
72
74
  - lib/semantic_logger/formatters/raw.rb
73
75
  - lib/semantic_logger/formatters/signalfx.rb
@@ -85,13 +87,16 @@ files:
85
87
  - lib/semantic_logger/reporters/minitest.rb
86
88
  - lib/semantic_logger/semantic_logger.rb
87
89
  - lib/semantic_logger/subscriber.rb
90
+ - lib/semantic_logger/sync.rb
91
+ - lib/semantic_logger/sync_processor.rb
92
+ - lib/semantic_logger/test/capture_log_events.rb
88
93
  - lib/semantic_logger/utils.rb
89
94
  - lib/semantic_logger/version.rb
90
- homepage: https://github.com/rocketjob/semantic_logger
95
+ homepage: https://logger.rocketjob.io
91
96
  licenses:
92
97
  - Apache-2.0
93
98
  metadata: {}
94
- post_install_message:
99
+ post_install_message:
95
100
  rdoc_options: []
96
101
  require_paths:
97
102
  - lib
@@ -99,15 +104,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
99
104
  requirements:
100
105
  - - ">="
101
106
  - !ruby/object:Gem::Version
102
- version: '2.3'
107
+ version: '2.5'
103
108
  required_rubygems_version: !ruby/object:Gem::Requirement
104
109
  requirements:
105
110
  - - ">="
106
111
  - !ruby/object:Gem::Version
107
112
  version: '0'
108
113
  requirements: []
109
- rubygems_version: 3.0.2
110
- signing_key:
114
+ rubygems_version: 3.2.33
115
+ signing_key:
111
116
  specification_version: 4
112
117
  summary: Feature rich logging framework, and replacement for existing Ruby & Rails
113
118
  loggers.