nexus_semantic_logger 1.7.3 → 1.8.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6fb8608fc5db931115c7c1398607eff97e56745183939261b1993ea10004e10e
4
- data.tar.gz: 9b326b54b65bcd45a0f5a8fef49e4d0b0112710028996afcb957ff0113aae8ff
3
+ metadata.gz: f13512ab6f95abaa8a782f2718438d924eeca7dd1ae014c0f5419b14f0b13bfa
4
+ data.tar.gz: 54594c63bca42969a1639e1d6295f51a6b4faf5222e340c8dbd0e00a9e16390b
5
5
  SHA512:
6
- metadata.gz: f5d864a434d1499e2b0880b55f5969e2f0856e2625d9e20db54387b01610fea866cc09191276f2c2f5ff1601927f4a2a7140f42ca70993cf6f5c5499753c055e
7
- data.tar.gz: 240f197160c496ac997ae2c5cd33a672d656b6bf6280318e7926d5cb593ecac40f794316a9090dfa7984273bff9ed987cf6ef689e20591a62690dd3b40b971c5
6
+ metadata.gz: bc42282551ce7a194ab0e4891296891cfb0520943f7c4ba383c259a90ef59d035aacdc756c11f5ab2d18d17175e655d919d6d46f50399c8c51bde831343801e1
7
+ data.tar.gz: b4e966ed8e476ede32c07cfb85e16ebfb00337d7b7ba8fb9989bae1f180a2f170349f78b617b5aeae2d0c4edacf2b16d77748e566db7e89967fb8004eea3c186
data/README.md CHANGED
@@ -9,7 +9,44 @@ As well as providing a semantic logger, this gem handles datadog telemetry assoc
9
9
  * logs
10
10
  * traces
11
11
  * metrics
12
- * statsd is automatically attached to datadog runtime metrics and may also be used for custom metrics.
12
+ * statsd is automatically attached to datadog runtime metrics and may also be used for custom metrics.
13
+
14
+ ### Customise log level per logger
15
+
16
+ For example, to show debug logging for `MySubscriber` while having all other logs on info.
17
+
18
+ ```
19
+ # The log level must be set to the lowest level which can be dynamically controlled.
20
+ LOG_LEVEL=DEBUG
21
+ # The default level for filtered logs.
22
+ LOG_NAMES_DEFAULT_LEVEL=INFO
23
+ # Per level overrides for filtered logs.
24
+ LOG_NAMES_DEBUG=MySubscriber
25
+ ```
26
+
27
+ * Customised log names are available for each level e.g. `LOG_NAMES_TRACE`
28
+ * Log names are matched on prefix.
29
+ * Multiple log names are supported via comma separated values.
30
+
31
+ ### Changing log level dynamically
32
+
33
+ The default level for filtered logs (`LOG_NAMES_DEFAULT_LEVEL`) may be changed on a running instance with the `WINCH`
34
+ signal. This cycles through the available levels `[trace debug info warn error fatal]`.
35
+
36
+ Note that you cannot dynamically enable a level lower than the `LOG_LEVEL`. Instead the env var must be adjusted and the
37
+ instance restarted.
38
+
39
+ Send signal: `pkill --signal WINCH --count --full "^puma.*"`
40
+
41
+ Instance output: `WINCH signal changed LOG_NAMES_DEFAULT_LEVEL from debug to info`
42
+
43
+ ### Querying current log level
44
+
45
+ The `SYS` signal will print the levels used by the running instance.
46
+
47
+ Send signal: `pkill --signal SYS --count --full "^puma.*"`
48
+
49
+ Instance output: `SYS signal reports LOG_LEVEL=debug LOG_NAMES_DEFAULT_LEVEL=warn`
13
50
 
14
51
  ### Sending metrics
15
52
 
@@ -32,8 +32,12 @@ module NexusSemanticLogger
32
32
  }
33
33
  end
34
34
 
35
+ def self.env_level
36
+ @@level ||= ENV.fetch('LOG_LEVEL', Rails.application.config.log_level).downcase
37
+ end
38
+
35
39
  def self.env_names_default_level
36
- @@names_default_level ||= ENV.fetch('LOG_NAMES_DEFAULT_LEVEL', Rails.application.config.log_level)
40
+ @@names_default_level ||= ENV.fetch('LOG_NAMES_DEFAULT_LEVEL', Rails.application.config.log_level).downcase
37
41
  end
38
42
 
39
43
  def self.env_names_trace
@@ -61,6 +65,7 @@ module NexusSemanticLogger
61
65
  end
62
66
 
63
67
  def self.flush
68
+ @@level = nil
64
69
  @@names_default_level = nil
65
70
  @@names_trace = nil
66
71
  @@names_debug = nil
@@ -73,5 +78,40 @@ module NexusSemanticLogger
73
78
  def self.fetch_env_names(var)
74
79
  ENV.fetch(var, '').split(',').to_set
75
80
  end
81
+
82
+ # Change LOG_LEVEL and LOG_NAMES_DEFAULT_LEVEL on a running process by sending signals.
83
+ # Each signal rotates through the levels, wrapping around.
84
+ # Based on SemanticLogger.add_signal_handler.
85
+ # Note that USR1/USR2 are already used by puma. WINCH/SYS should be unused these days.
86
+ def self.add_signal_handler(log_names_level_signal = "WINCH", info_signal = "SYS")
87
+ if log_names_level_signal
88
+ Signal.trap(log_names_level_signal) do
89
+ current_level = env_names_default_level
90
+ next_level = get_next_log_level(current_level)
91
+ @@names_default_level = next_level
92
+ puts "#{log_names_level_signal} signal changed LOG_NAMES_DEFAULT_LEVEL from #{current_level} to #{next_level}"
93
+ rescue => err
94
+ puts "Error handling signal #{log_names_level_signal}: #{err}"
95
+ puts err.backtrace
96
+ end
97
+ end
98
+
99
+ if info_signal
100
+ Signal.trap(info_signal) do
101
+ current_level = env_names_default_level
102
+ puts "#{info_signal} signal reports LOG_LEVEL=#{env_level} LOG_NAMES_DEFAULT_LEVEL=#{current_level}"
103
+ rescue => err
104
+ puts "Error handling signal #{info_signal}: #{err}"
105
+ puts err.backtrace
106
+ end
107
+ end
108
+ end
109
+
110
+ def self.get_next_log_level(current_log_level)
111
+ current_log_level_index = SemanticLogger::Levels.index(current_log_level)
112
+ next_log_level_index = current_log_level_index + 1
113
+ next_log_level_index = 0 if next_log_level_index >= SemanticLogger::Levels.all_levels.size
114
+ SemanticLogger::Levels.level(next_log_level_index)
115
+ end
76
116
  end
77
117
  end
@@ -35,6 +35,7 @@ module NexusSemanticLogger
35
35
  config.rails_semantic_logger.add_file_appender = false
36
36
  dd_appender = config.semantic_logger.add_appender(io: $stdout, formatter: config.rails_semantic_logger.format)
37
37
  dd_appender.filter = NexusSemanticLogger::AppenderFilter.filter_lambda
38
+ NexusSemanticLogger::AppenderFilter.add_signal_handler
38
39
 
39
40
  NexusSemanticLogger::DatadogTracer.new(service)
40
41
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
  module NexusSemanticLogger
3
- # Leave this as 1.7.3 in order for CI process to replace with the tagged version.
4
- VERSION = '1.7.3'
3
+ # Leave this as 1.8.0 in order for CI process to replace with the tagged version.
4
+ VERSION = '1.8.0'
5
5
  end
@@ -11,3 +11,12 @@ module NexusSemanticLogger
11
11
  DatadogSingleton.instance
12
12
  end
13
13
  end
14
+
15
+ # Patch access to LEVELS array.
16
+ module SemanticLogger
17
+ module Levels
18
+ def self.all_levels
19
+ LEVELS
20
+ end
21
+ end
22
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: nexus_semantic_logger
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.7.3
4
+ version: 1.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Johnathon Harris
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-11-22 00:00:00.000000000 Z
11
+ date: 2022-11-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: amazing_print