debug_logging 4.0.0 → 4.0.1

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: 80eec636fd64a69b41aaf67704b79c784bc5ffa989e181c51106bc908bc645c8
4
- data.tar.gz: 8feca3ec5aadd298bc0da9f75631834f4a16bd73aa9d39572c8caf72ec2834b4
3
+ metadata.gz: ca22c0dbc789a56d7f02d3ef685d92fb0423592bde3fccaa733afcd577c88a78
4
+ data.tar.gz: 279bdd5ecde603ff0be14ec128bea893a05a53d0d4c0f42fbdb6663964fff178
5
5
  SHA512:
6
- metadata.gz: bd13ad1dca5706140626730a48dc4e9133efc5e3db3d55f64b4c79f3a0bb21765d82a237c2a021d93ec2b4d0632d4a0a4bc5a3c28ef2bad088de9de37d6fdc3e
7
- data.tar.gz: 9be10f369557ed872853e387870528c0a64df4981c854b3df6b27d22f0d24eac741d51e69beec9c6e6cfd2398748838d47ac5955df951d906d77378f60d4331a
6
+ metadata.gz: 352720fb350ee3c404f64b631c6f27f178ca8bb07b66e779cb26a66077708df9e716f7b0ef49e80035f44a45bc8081e436f420a14ac07f17d44a6b7e67ba46d1
7
+ data.tar.gz: 5effc5e2ef194e6e90c9c57f3378523a6fda0d5ab2b4d5fd7c4161bc542385b9796cfef56f015a756a75ead1969bb83f94c81d3dc4ba54607b7d9e2adab4c46f
checksums.yaml.gz.sig CHANGED
Binary file
data/CHANGELOG.md CHANGED
@@ -11,7 +11,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
11
11
  ### Fixed
12
12
  ### Removed
13
13
 
14
- ## [4.0.0] - unreleased
14
+ ## [4.0.1] ([tag][4.0.1t]) - 2024-03-01
15
+ ### Added
16
+ - Support for all Numeric types to be used as monotonic timestamps for ActiveSupport::Notifications
17
+ - `time_formatter_proc` - used to format timestamp added to beginning of log lines
18
+ - `add_timestamp` - Add timestamp to front of each log line
19
+ ### Changed
20
+ - `DebugLogging::ArgumentPrinter.debug_time_to_s` => `DebugLogging::ArgumentPrinter.debug_event_time_to_s`
21
+ ### Fixed
22
+ ### Removed
23
+
24
+ ## [4.0.0] ([tag][4.0.0t]) - 2024-02-28
15
25
  ### Added
16
26
  - Class method DSL:
17
27
  - `logged`
@@ -30,57 +40,57 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
30
40
  - Support for `include DebugLogging::InstanceLogger.new(...)`
31
41
  - Support for `include DebugLogging::InstanceNotifier.new(...)`
32
42
 
33
- ## [3.1.9] - 2023-10-31
43
+ ## [3.1.9] ([tag][3.1.9t]) - 2023-10-31
34
44
  ### Fixed
35
45
  - Maximum Ruby version is 2.7. Versions 3.x are not compatible with Ruby >= 3
36
46
 
37
- ## [3.1.8] - 2020-12-19
47
+ ## [3.1.8] ([tag][3.1.8t]) - 2020-12-19
38
48
 
39
- ## [3.1.7] - 2020-12-19
49
+ ## [3.1.7] ([tag][3.1.7t]) - 2020-12-19
40
50
 
41
- ## [3.1.6] - tagged, but unreleased
51
+ ## [3.1.6] ([tag][3.1.6t]) - tagged, but unreleased
42
52
 
43
- ## [3.1.5] - 2020-12-18
53
+ ## [3.1.5] ([tag][3.1.5t]) - 2020-12-18
44
54
 
45
- ## [3.1.4] - 2020-12-18
55
+ ## [3.1.4] ([tag][3.1.4t]) - 2020-12-18
46
56
 
47
- ## [3.1.3] - 2020-12-18
57
+ ## [3.1.3] ([tag][3.1.3t]) - 2020-12-18
48
58
 
49
- ## [3.1.2] - 2020-12-10
59
+ ## [3.1.2] ([tag][3.1.2t]) - 2020-12-10
50
60
 
51
- ## [3.1.1] - 2020-12-09
61
+ ## [3.1.1] ([tag][3.1.1t]) - 2020-12-09
52
62
 
53
- ## [3.1.0] - 2020-10-24
63
+ ## [3.1.0] ([tag][3.1.0t]) - 2020-10-24
54
64
 
55
- ## [3.0.0] - 2020-10-07
65
+ ## [3.0.0] ([tag][3.0.0t]) - 2020-10-07
56
66
 
57
- ## [2.0.0] - 2020-10-06
67
+ ## [2.0.0] ([tag][2.0.0t]) - 2020-10-06
58
68
 
59
- ## [1.0.17] - 2018-09-10
69
+ ## [1.0.17] ([tag][1.0.17t]) - 2018-09-10
60
70
 
61
- ## [1.0.16] - 2018-01-16
71
+ ## [1.0.16] ([tag][1.0.16t]) - 2018-01-16
62
72
 
63
- ## [1.0.15] - 2017-10-17
73
+ ## [1.0.15] ([tag][1.0.15t]) - 2017-10-17
64
74
 
65
- ## [1.0.14] - 2017-10-09
75
+ ## [1.0.14] ([tag][1.0.14t]) - 2017-10-09
66
76
 
67
- ## [1.0.13] - 2017-10-08
77
+ ## [1.0.13] ([tag][1.0.13t]) - 2017-10-08
68
78
 
69
- ## [1.0.12] - 2017-10-08
79
+ ## [1.0.12] ([tag][1.0.12t]) - 2017-10-08
70
80
 
71
- ## [1.0.11] - 2017-10-06
81
+ ## [1.0.11] ([tag][1.0.11t]) - 2017-10-06
72
82
 
73
- ## [1.0.10] - 2017-09-26
83
+ ## [1.0.10] ([tag][1.0.10t]) - 2017-09-26
74
84
 
75
- ## [1.0.9] - 2017-09-06
85
+ ## [1.0.9] ([tag][1.0.9t]) - 2017-09-06
76
86
 
77
- ## [1.0.8] - 2017-09-06
87
+ ## [1.0.8] ([tag][1.0.8t]) - 2017-09-06
78
88
 
79
- ## [1.0.7] - 2017-09-06
89
+ ## [1.0.7] ([tag][1.0.7t]) - 2017-09-06
80
90
 
81
- ## [1.0.6] - 2017-09-05
91
+ ## [1.0.6] ([tag][1.0.6t]) - 2017-09-05
82
92
 
83
- ## [1.0.5] ([tag][1.0.1t]) - 2017-03-31
93
+ ## [1.0.5] ([tag][1.0.5t]) - 2017-03-31
84
94
 
85
95
  ## [1.0.4] ([tag][1.0.4t]) - 2017-03-31
86
96
 
@@ -95,7 +105,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
95
105
  ## [0.1.0] ([tag][0.1.0t]) - 2017-03-25
96
106
  - Initial release
97
107
 
98
- [Unreleased]: https://gitlab.com/kettle-rb/kettle-soup-cover/-/compare/v3.1.9...HEAD
108
+ [Unreleased]: https://gitlab.com/kettle-rb/kettle-soup-cover/-/compare/v4.0.1...HEAD
109
+ [4.0.1t]: https://gitlab.com/pboling/debug_logging/-/tags/v4.0.1
110
+ [4.0.1]: https://gitlab.com/kettle-rb/kettle-soup-cover/-/compare/v4.0.0...v4.0.1
111
+ [4.0.0t]: https://gitlab.com/pboling/debug_logging/-/tags/v4.0.0
112
+ [4.0.0]: https://gitlab.com/kettle-rb/kettle-soup-cover/-/compare/v3.1.9...v4.0.0
99
113
  [3.1.9t]: https://gitlab.com/pboling/debug_logging/-/tags/v3.1.9
100
114
  [3.1.9]: https://gitlab.com/kettle-rb/kettle-soup-cover/-/compare/v3.1.8...v3.1.9
101
115
  [3.1.8t]: https://gitlab.com/pboling/debug_logging/-/tags/v3.1.8
data/README.md CHANGED
@@ -148,7 +148,7 @@ Recommend creating `config/initializers/debug_logging.rb`, or adding to `config/
148
148
  ```ruby
149
149
  # Showing the defaults
150
150
  DebugLogging.configuration.logger = Logger.new($stdout) # you probably want to override to be the Rails.logger, and if so you can't set it in the initializer, as it needs to be set after Rails.logger is set.
151
- DebugLogging.configuration.log_level = :debug # at what level do the messages created by this gem sent at?
151
+ DebugLogging.configuration.log_level = :debug # at what level are the messages created by this gem sent at?
152
152
  DebugLogging.configuration.multiple_last_hashes = false # pass every hash argument to last_hash_to_s_proc?
153
153
  DebugLogging.configuration.last_hash_to_s_proc = nil # e.g. ->(hash) { "keys: #{hash.keys}" }
154
154
  DebugLogging.configuration.last_hash_max_length = 1_000
@@ -160,6 +160,8 @@ DebugLogging.configuration.active_support_notifications = false
160
160
  DebugLogging.configuration.colorized_chain_for_method = false # e.g. ->(colorized_string) { colorized_string.red.on_blue.underline }
161
161
  DebugLogging.configuration.colorized_chain_for_class = false # e.g. ->(colorized_string) { colorized_string.colorize(:light_blue ).colorize( :background => :red) }
162
162
  DebugLogging.configuration.add_invocation_id = true # identify a method call uniquely in a log, pass a proc for colorization, e.g. ->(colorized_string) { colorized_string.light_black }
163
+ DebugLogging.configuration.time_formatter_proc = DebugLogging::Constants::DEFAULT_TIME_FORMATTER
164
+ DebugLogging.configuration.add_timestamp = false
163
165
  DebugLogging.configuration.ellipsis = " ✂️ …".freeze
164
166
  DebugLogging.configuration.mark_scope_exit = true # Only has an effect if benchmarking is off, since benchmarking always marks the scope exit
165
167
  DebugLogging.configuration.add_payload = false # or a proc which will be called to print the payload
@@ -183,6 +185,8 @@ DebugLogging.configure do |config|
183
185
  config.active_support_notifications = false
184
186
  config.colorized_chain_for_method = false # e.g. ->(colorized_string) { colorized_string.red.on_blue.underline }
185
187
  config.colorized_chain_for_class = false # e.g. ->(colorized_string) { colorized_string.colorize(:light_blue ).colorize( :background => :red) }
188
+ config.time_formatter_proc = DebugLogging::Constants::DEFAULT_TIME_FORMATTER
189
+ config.add_timestamp = false
186
190
  config.add_invocation_id = true # identify a method call uniquely in a log, pass a proc for colorization, e.g. ->(colorized_string) { colorized_string.light_black }
187
191
  config.ellipsis = " ✂️ …".freeze
188
192
  config.mark_scope_exit = true # Only has an effect if benchmarking is off, since benchmarking always marks the scope exit
@@ -208,7 +212,7 @@ Just send along a hash of the config options, similar to the following:
208
212
 
209
213
  See the example class below, and the specs.
210
214
 
211
- **NOTE ON** `Rails.logger` - It will probably be nil in your initializer, so setting the `config.logger` to `Rails.logger` there will result in setting it to `nil`, which means the default will end up being used: `Logger.new(STDOUT)`. Instead just config the logger in your application.rb, or anytime later, but *before your classes get loaded* and start inheriting the config:
215
+ **NOTE ON** `Rails.logger` - It will probably be nil in your initializer, so setting the `config.logger` to `Rails.logger` there will result in setting it to `nil`, which means the default will end up being used: `Logger.new($stdout)`. Instead just config the logger in your application.rb, or anytime later, but *before your classes get loaded* and start inheriting the config:
212
216
 
213
217
  ```ruby
214
218
  DebugLogging.configuration.logger = Rails.logger
@@ -294,7 +298,28 @@ class Car
294
298
  # Override configuration options for any instance method(s), by passing a hash as the last argument
295
299
  # In the last hash any non-Configuration keys will be data that gets logged,
296
300
  # and also made available to last_hash_to_s_proc
297
- i_logged [:faster], {add_invocation_id: false}
301
+ # Here's an example that sets every possible option, while also showing what the default values are!
302
+ i_logged [:faster], {
303
+ logger: Logger.new($stdout), # probably want to override to be the Rails.logger
304
+ log_level: :debug, # at what level do the messages created by this gem sent at?
305
+ multiple_last_hashes: false,
306
+ last_hash_to_s_proc: nil, # e.g. ->(hash) { "keys: #{hash.keys}" }
307
+ last_hash_max_length: 1_000,
308
+ args_to_s_proc: nil, # e.g. ->(*record) { "record id: #{record.first.id}" }
309
+ args_max_length: 1_000,
310
+ colorized_chain_for_method: false, # e.g. ->(colorized_string) { colorized_string.red.on_blue.underline }
311
+ colorized_chain_for_class: false, # e.g. ->(colorized_string) { colorized_string.colorize(:light_blue ).colorize( :background => :red) }
312
+ add_invocation_id: true, # allows unique identification of method call; association of entry and exit log lines
313
+ ellipsis: " ✂️ …".freeze,
314
+ mark_scope_exit: false,
315
+ add_payload: true, # Can also be a proc returning a string, which will be called when printing the payload
316
+ payload_max_length: 1_000,
317
+ error_handler_proc: nil,
318
+ time_formatter_proc: DebugLogging::Constants::DEFAULT_TIME_FORMATTER,
319
+ add_timestamp: false,
320
+ instance_benchmarks: false,
321
+ class_benchmarks: false,
322
+ }
298
323
 
299
324
  # You can also use `i_logged` as a true method decorator:
300
325
  i_logged def slower
data/SECURITY.md CHANGED
@@ -4,8 +4,8 @@
4
4
 
5
5
  | Version | Supported |
6
6
  |---------|-----------|
7
- | 3.1.x | ✅ |
8
- | 3.0.x | ❌ |
7
+ | 4.x | ✅ |
8
+ | 3.x | ❌ |
9
9
  | 2.x | ❌ |
10
10
  | 1.x | ❌ |
11
11
 
@@ -7,11 +7,13 @@ module DebugLogging
7
7
  "completed in #{format("%f", tms.real)}s (#{format("%f", tms.total)}s CPU)"
8
8
  end
9
9
 
10
- def debug_invocation_id_to_s(args: nil, kwargs: nil, config_proxy: nil)
10
+ def debug_invocation_id_to_s(args: nil, kwargs: nil, start_at: nil, config_proxy: nil)
11
11
  return "" unless (args || kwargs) && config_proxy
12
12
 
13
13
  if config_proxy.debug_add_invocation_id
14
- invocation = " ~#{args.object_id}|#{kwargs.object_id}@#{(Time.now.to_f.to_s % "%#-21a")[4..-4]}~"
14
+ time = start_at ? Util.debug_time(start_at) : Time.now
15
+ unique_id = (time.to_f.to_s % "%#-21a")[4..-4]
16
+ invocation = " ~#{args.object_id}|#{kwargs.object_id}@#{unique_id}~"
15
17
  case config_proxy.debug_add_invocation_id
16
18
  when true
17
19
  invocation
@@ -23,21 +25,25 @@ module DebugLogging
23
25
  end
24
26
  end
25
27
 
26
- def debug_time_to_s(time_or_monotonic)
28
+ # @return [String]
29
+ def debug_time_to_s(time_or_monotonic, config_proxy: nil)
30
+ return "" unless config_proxy&.debug_add_timestamp
31
+ return config_proxy.debug_time_formatter_proc.call(Time.now) unless time_or_monotonic
32
+
33
+ time = Util.debug_time(time_or_monotonic)
34
+
35
+ config_proxy.debug_time_formatter_proc.call(time)
36
+ end
37
+
38
+ # A custom time format will never apply here, because ActiveSupport::Notifications have a required time format
39
+ def debug_event_time_to_s(time_or_monotonic)
27
40
  # Time format must match:
28
41
  # \d{4,}-\d{2}-\d{2} \d{2}:\d{2}:\d{2} [-+]\d{4}
29
42
  # YYYY-MM-DD HH:mm:ss +00:00
30
43
  # strftime("%F %T %z")
31
- case time_or_monotonic
32
- when Float
33
- Time.at(time_or_monotonic).strftime("%F %T %z")
34
- when Time, DateTime
35
- time_or_monotonic.strftime("%F %T %z")
36
- when String
37
- Time.parse(time_or_monotonic).strftime("%F %T %z")
38
- else
39
- time_or_monotonic
40
- end
44
+ time_or_monotonic = Time.now if time_or_monotonic.nil? || (time_or_monotonic.respond_to?(:empty?) && time_or_monotonic.empty?)
45
+ time = Util.debug_time(time_or_monotonic)
46
+ DebugLogging::Constants::EVENT_TIME_FORMATTER.call(time)
41
47
  end
42
48
 
43
49
  def debug_invocation_to_s(klass: nil, separator: nil, method_to_log: nil, config_proxy: nil)
@@ -188,7 +194,7 @@ module DebugLogging
188
194
  proc_name: "add_payload",
189
195
  proc: config_proxy.debug_add_payload,
190
196
  args: payload,
191
- max_length: config_proxy.payload_max_length,
197
+ max_length: config_proxy.debug_payload_max_length,
192
198
  )
193
199
  printed_payload += printed
194
200
  printed_payload += config_proxy.debug_ellipsis if add_payload_ellipsis
@@ -12,16 +12,25 @@ module DebugLogging
12
12
  # extend DebugLogging::InstanceLogger
13
13
  # i_logged [:drive, :stop],
14
14
  # {
15
- # logger: Logger.new(STDOUT) # probably want to override to be the Rails.logger
16
- # log_level: :debug # at what level do the messages created by this gem sent at?
17
- # last_hash_to_s_proc: nil # e.g. ->(hash) { "keys: #{hash.keys}" }
18
- # last_hash_max_length: 1_000
19
- # args_to_s_proc: nil # e.g. ->(*record) { "record id: #{record.first.id}" }
20
- # args_max_length: 1_000
21
- # instance_benchmarks: false
22
- # class_benchmarks: false
23
- # add_invocation_id: true # invocation id allows you to identify a method call uniquely in a log
24
- # ellipsis: " ✂️ …".freeze
15
+ # logger: Logger.new($stdout), # probably want to override to be the Rails.logger
16
+ # log_level: :debug, # at what level do the messages created by this gem sent at?
17
+ # multiple_last_hashes: false,
18
+ # last_hash_to_s_proc: nil, # e.g. ->(hash) { "keys: #{hash.keys}" }
19
+ # last_hash_max_length: 1_000,
20
+ # args_to_s_proc: nil, # e.g. ->(*record) { "record id: #{record.first.id}" }
21
+ # args_max_length: 1_000,
22
+ # colorized_chain_for_method: false, # e.g. ->(colorized_string) { colorized_string.red.on_blue.underline }
23
+ # colorized_chain_for_class: false, # e.g. ->(colorized_string) { colorized_string.colorize(:light_blue ).colorize( :background => :red) }
24
+ # add_invocation_id: true, # allows unique identification of method call; association of entry and exit log lines
25
+ # ellipsis: " ✂️ …".freeze,
26
+ # mark_scope_exit: false,
27
+ # add_payload: true, # Can also be a proc returning a string, which will be called when printing the payload
28
+ # payload_max_length: 1_000,
29
+ # error_handler_proc: nil,
30
+ # time_formatter_proc: DebugLogging::Constants::DEFAULT_TIME_FORMATTER,
31
+ # add_timestamp: false,
32
+ # instance_benchmarks: false,
33
+ # class_benchmarks: false,
25
34
  # }
26
35
  #
27
36
  CONFIG_KEYS.each do |key|
@@ -1,23 +1,27 @@
1
1
  module DebugLogging
2
2
  module Constants
3
3
  DEFAULT_ELLIPSIS = " ✂️ …"
4
+ DEFAULT_TIME_FORMATTER = ->(time) { "[#{time.strftime("%Y%m%d %H:%M:%S")}] " }
5
+ EVENT_TIME_FORMATTER = ->(time) { time.strftime("%F %T %z") }
4
6
  CONFIG_ATTRS_DEFAULTS = {
5
7
  enabled: true,
6
- logger: Logger.new($stdout),
7
- log_level: :debug,
8
+ logger: Logger.new($stdout), # probably want to override to be the Rails.logger
9
+ log_level: :debug, # at what level do the messages created by this gem sent at?
8
10
  multiple_last_hashes: false,
9
- last_hash_to_s_proc: nil,
11
+ last_hash_to_s_proc: nil, # e.g. ->(hash) { "keys: #{hash.keys}" }
10
12
  last_hash_max_length: 1_000,
11
- args_to_s_proc: nil,
13
+ args_to_s_proc: nil, # e.g. ->(*record) { "record id: #{record.first.id}" }
12
14
  args_max_length: 1_000,
13
- colorized_chain_for_method: false,
14
- colorized_chain_for_class: false,
15
- add_invocation_id: true,
15
+ colorized_chain_for_method: false, # e.g. ->(colorized_string) { colorized_string.red.on_blue.underline }
16
+ colorized_chain_for_class: false, # e.g. ->(colorized_string) { colorized_string.colorize(:light_blue ).colorize( :background => :red) }
17
+ add_invocation_id: true, # allows unique identification of method call; association of entry and exit log lines
16
18
  ellipsis: DEFAULT_ELLIPSIS,
17
19
  mark_scope_exit: false,
18
20
  add_payload: true, # Can also be a proc returning a string, which will be called when printing the payload
19
21
  payload_max_length: 1_000,
20
22
  error_handler_proc: nil,
23
+ time_formatter_proc: DEFAULT_TIME_FORMATTER,
24
+ add_timestamp: false,
21
25
  }.freeze
22
26
  CONFIG_ATTRS = CONFIG_ATTRS_DEFAULTS.keys
23
27
  CONFIG_READERS_DEFAULTS = {
@@ -1,5 +1,27 @@
1
1
  module DebugLogging
2
2
  module InstanceLogger
3
+ # NOTE: These params can be passed in / hidden in a last hash of *args
4
+ # NOTE: They can also be passed in discretely for each method, by passing *args as an array of arrays
5
+ # TODO: Refactor to use modern Ruby 3 *args, **kwargs instead
6
+ # @param logger [Logger] Logger.new($stdout), # probably want to override to be the Rails.logger
7
+ # @param log_level [Symbol] default: :debug, at what level do the messages created by this gem sent at?
8
+ # @param multiple_last_hashes [true, false] default: false,
9
+ # @param last_hash_to_s_proc [nil, Proc] default: nil, e.g. ->(hash) { "keys: #{hash.keys}" }
10
+ # @param last_hash_max_length [Integer] default: 1_000,
11
+ # @param args_to_s_proc [nil, Proc] default: nil, e.g. ->(*record) { "record id: #{record.first.id}" }
12
+ # @param args_max_length [Integer] default: 1_000,
13
+ # @param colorized_chain_for_method [false, Proc] default: false, e.g. ->(colorized_string) { colorized_string.red.on_blue.underline }
14
+ # @param colorized_chain_for_class [false, Proc] default: false, e.g. ->(colorized_string) { colorized_string.colorize(:light_blue ).colorize( :background => :red) }
15
+ # @param add_invocation_id [true, false] default: true, allows unique identification of method call; association of entry and exit log lines
16
+ # @param ellipsis [String] default: " ✂️ …".freeze,
17
+ # @param mark_scope_exit [true, false] default: false,
18
+ # @param add_payload [true, false, Proc] default: true, # Can also be a proc returning a string, which will be called when printing the payload
19
+ # @param payload_max_length [Integer] default: 1_000,
20
+ # @param error_handler_proc [nil, Proc] default: nil,
21
+ # @param time_formatter_proc [nil, Proc] default: DebugLogging::Constants::DEFAULT_TIME_FORMATTER,
22
+ # @param add_timestamp [true, false] default: false,
23
+ # @param instance_benchmarks [true, false] default: false,
24
+ # @param class_benchmarks [true, false] default: false,
3
25
  def i_logged(*methods_to_log)
4
26
  methods_to_log, payload, config_opts = DebugLogging::Util.extract_payload_and_config(
5
27
  method_names: methods_to_log,
@@ -28,19 +28,22 @@ module DebugLogging
28
28
  method_to_log: method_to_log,
29
29
  config_proxy: config_proxy,
30
30
  )
31
- invocation_id = self.class.debug_invocation_id_to_s(args:, kwargs:, config_proxy:)
31
+ start_at = Time.now
32
+ start_timestamp = self.class.debug_time_to_s(start_at, config_proxy:)
33
+ invocation_id = self.class.debug_invocation_id_to_s(args:, kwargs:, start_at:, config_proxy:)
32
34
  config_proxy.log do
33
35
  paydirt = DebugLogging::Util.payload_instance_variable_hydration(scope: self, payload: method_payload)
34
36
  signature = self.class.debug_signature_to_s(args:, kwargs:, config_proxy:)
35
37
  paymud = debug_payload_to_s(payload: paydirt, config_proxy:)
36
- "#{log_prefix}#{signature}#{invocation_id} debug: #{paymud}"
38
+ "#{start_timestamp}#{log_prefix}#{signature}#{invocation_id} debug: #{paymud}"
37
39
  end
38
40
  if config_proxy.benchmarkable_for?(:debug_instance_benchmarks)
39
41
  tms = Benchmark.measure do
40
42
  method_return_value = super(*args, **kwargs, &block)
41
43
  end
44
+ end_timestamp = self.class.debug_time_to_s(Time.now, config_proxy:)
42
45
  config_proxy.log do
43
- "#{log_prefix} #{self.class.debug_benchmark_to_s(tms: tms)}#{invocation_id}"
46
+ "#{end_timestamp}#{log_prefix} #{self.class.debug_benchmark_to_s(tms: tms)}#{invocation_id}"
44
47
  end
45
48
  else
46
49
  begin
@@ -53,8 +56,9 @@ module DebugLogging
53
56
  end
54
57
  end
55
58
  if config_proxy.exit_scope_markable? && invocation_id && !invocation_id.empty?
59
+ end_timestamp = self.class.debug_time_to_s(Time.now, config_proxy:)
56
60
  config_proxy.log do
57
- "#{log_prefix} completed#{invocation_id}"
61
+ "#{end_timestamp}#{log_prefix} completed#{invocation_id}"
58
62
  end
59
63
  end
60
64
  end
@@ -32,8 +32,8 @@ module DebugLogging
32
32
  {
33
33
  name: event.name,
34
34
  duration: Rational(event.duration, 1000).to_f,
35
- time: debug_time_to_s(event.time),
36
- end: debug_time_to_s(event.end),
35
+ time: debug_event_time_to_s(event.time),
36
+ end: debug_event_time_to_s(event.end),
37
37
  args: debug_signature_to_s(args: args, config_proxy: config_proxy),
38
38
  payload: debug_payload_to_s(payload: payload, config_proxy: config_proxy),
39
39
  }
@@ -2,6 +2,20 @@ module DebugLogging
2
2
  module Util
3
3
  module_function
4
4
 
5
+ def debug_time(time_or_monotonic)
6
+ case time_or_monotonic
7
+ when Time, DateTime
8
+ time_or_monotonic
9
+ when Numeric
10
+ Time.at(time_or_monotonic)
11
+ when String
12
+ Time.parse(time_or_monotonic)
13
+ else
14
+ # Garbage in, Sweet Nourishing Gruel Out
15
+ Time.now
16
+ end
17
+ end
18
+
5
19
  # methods_to_log may be an array of a single method name, followed by config options and payload,
6
20
  # or it could be an array of method names followed by config options and payload to be shared by the whole set.
7
21
  def extract_payload_and_config(method_names:, payload: nil, config: nil)
@@ -36,6 +50,8 @@ module DebugLogging
36
50
  # logged :meth1, :meth2, :meth3 without options is valid
37
51
  method_names
38
52
  end
53
+ else
54
+ raise ArgumentError, "unknown type for method_names: #{method_names.class}"
39
55
  end
40
56
  [method_names, payload, config_opts]
41
57
  end
@@ -1,5 +1,5 @@
1
1
  module DebugLogging
2
2
  module Version
3
- VERSION = "4.0.0"
3
+ VERSION = "4.0.1"
4
4
  end
5
5
  end
data/lib/debug_logging.rb CHANGED
@@ -233,6 +233,22 @@ module DebugLogging
233
233
  @debug_logging_configuration.colorized_chain_for_class = colorized_chain_for_class
234
234
  end
235
235
 
236
+ def debug_add_timestamp
237
+ @debug_logging_configuration.add_timestamp
238
+ end
239
+
240
+ def debug_add_timestamp=(add_timestamp)
241
+ @debug_logging_configuration.add_timestamp = add_timestamp
242
+ end
243
+
244
+ def debug_time_formatter_proc
245
+ @debug_logging_configuration.time_formatter_proc
246
+ end
247
+
248
+ def debug_time_formatter_proc=(time_formatter_proc)
249
+ @debug_logging_configuration.time_formatter_proc = time_formatter_proc
250
+ end
251
+
236
252
  def debug_add_invocation_id
237
253
  @debug_logging_configuration.add_invocation_id
238
254
  end
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: debug_logging
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Peter Boling
@@ -38,7 +38,7 @@ cert_chain:
38
38
  KuxrfYrN+9HvMdm+nZ6TypmKftHY3Gj+/uu+g8Icm/zrvTWAEE0mcJOkfrIoNPJb
39
39
  pF8dMA==
40
40
  -----END CERTIFICATE-----
41
- date: 2024-02-28 00:00:00.000000000 Z
41
+ date: 2024-03-01 00:00:00.000000000 Z
42
42
  dependencies:
43
43
  - !ruby/object:Gem::Dependency
44
44
  name: colorize
@@ -319,10 +319,10 @@ licenses:
319
319
  - MIT
320
320
  metadata:
321
321
  homepage_uri: https://github.com/pboling/debug_logging
322
- source_code_uri: https://github.com/pboling/debug_logging/tree/v4.0.0
323
- changelog_uri: https://github.com/pboling/debug_logging/blob/v4.0.0/CHANGELOG.md
322
+ source_code_uri: https://github.com/pboling/debug_logging/tree/v4.0.1
323
+ changelog_uri: https://github.com/pboling/debug_logging/blob/v4.0.1/CHANGELOG.md
324
324
  bug_tracker_uri: https://github.com/pboling/debug_logging/issues
325
- documentation_uri: https://www.rubydoc.info/gems/debug_logging/4.0.0
325
+ documentation_uri: https://www.rubydoc.info/gems/debug_logging/4.0.1
326
326
  wiki_uri: https://github.com/pboling/debug_logging/wiki
327
327
  funding_uri: https://liberapay.com/pboling
328
328
  rubygems_mfa_required: 'true'
metadata.gz.sig CHANGED
Binary file