logstruct 0.1.1 → 0.1.2

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: 0b926657fc690c72031cf72973642c3654264b3ea348f2212a625788b62d1ade
4
- data.tar.gz: 650b11e3b8b3e975feee474994ae9420b68da2eb933942f28cc495649d71f225
3
+ metadata.gz: a65754f5cc8e4753585ca448eec8e78b5f8586aba5161d94d5c5ccce20386909
4
+ data.tar.gz: 9088ba81fe6319a9dfd1740949c87c7a793bd1535ae97a4d44bc98b0ca3b60b9
5
5
  SHA512:
6
- metadata.gz: 2e0339abeafbea5bf239799dcf1ca843f57aae004e356e407a18909d9c0b6e4d1302c897f358be7bf539b5e0534efd032319a0b3055ff29e169c1d3f22557193
7
- data.tar.gz: de385bc25a32f189044fbf1749e4511c1f9411d37a9af8628fc655e9706daba1a6b94b9482de756ef12557cc497deffa6f49a39ab9b434b3be6e25c7cb402214
6
+ metadata.gz: 1bccedd39623795cef4059ec14029c6ed4dd9edba94b355c9147c78052e163d41f6d1d46988bf367bc1c726e0cabaab8f30c8cc36a5470f3b7d1f0c5463b56d6
7
+ data.tar.gz: e0a3d5b784338c0d647ff03e12a92852e4c0de3fb2f93febba9df0bd3871f0b41ef262c1915db368a0b9db71afd0d005db05a325d2314f276dbd23e7b291f654
data/CHANGELOG.md CHANGED
@@ -5,6 +5,12 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.1.2] - 2025-10-03
9
+
10
+ Better default policy for when JSON logs are enabled: machines get JSON, humans get readable logs.
11
+ Enable LogStruct for production servers or when running tests on CI.
12
+ Keep dev-friendly logging on local machines or when running interactive commands on production servers.
13
+
8
14
  ## [0.1.1] - 2025-09-29
9
15
 
10
16
  Added dotenv-rails integration. Many other fixes and improvements.
data/README.md CHANGED
@@ -6,7 +6,7 @@ We support all your other favorite gems too, like Sidekiq, Sentry, and Shrine. (
6
6
 
7
7
  ## Features
8
8
 
9
- - JSON logging enabled by default in production and test environments
9
+ - JSON logging enabled by default for server processes in production and test environments, and for CI test runs (automatically disabled for console, local tests, and other Rake tasks)
10
10
  - ActionMailer integration for email delivery logging
11
11
  - ActiveJob integration for job execution logging
12
12
  - Sidekiq integration for background job logging
@@ -58,11 +58,16 @@ Once initialized (and enabled), the gem automatically includes its modules into
58
58
  - Rails `config.filter_parameters` are merged into LogStruct's filters and then cleared (to avoid double filtering). Configure sensitive keys via `LogStruct.config.filters`.
59
59
  - When `RAILS_LOG_TO_STDOUT` is set, we log to STDOUT only. Otherwise, we log to STDOUT by default without adding a file appender to avoid duplicate logs.
60
60
 
61
- ### Development behavior
61
+ ### Default behavior by process type
62
62
 
63
- - Disabled by default in development. Enable explicitly via `LOGSTRUCT_ENABLED=true` or `LogStruct.configure { |c| c.enabled = true }`.
64
- - When enabled in development, LogStruct now defaults to production‑style JSON output so you can preview exactly what will be shipped in prod.
65
- - You can opt back into the colorful human formatter with:
63
+ - **Server processes** (`rails server`): JSON logging is enabled by default in production and test environments
64
+ - **CI test runs** (`rails test` when `CI=true`): JSON logging is enabled by default to catch production bugs in your automated tests
65
+ - **Local test runs** (`rails test` locally): JSON logging is disabled by default, providing human-readable logs for debugging
66
+ - **Console** (`rails console`): JSON logging is disabled by default in all environments, providing human-readable logs instead
67
+ - **Other Rake tasks** (`rake db:migrate`, etc.): JSON logging is disabled by default in production, providing human-readable logs instead
68
+ - **Development environment**: Disabled by default for all process types. Enable explicitly via `LOGSTRUCT_ENABLED=true` or `LogStruct.configure { |c| c.enabled = true }`.
69
+
70
+ When enabled in development, LogStruct defaults to production‑style JSON output so you can preview exactly what will be shipped in prod. You can opt back into the colorful human formatter with:
66
71
 
67
72
  ```ruby
68
73
  LogStruct.configure do |c|
@@ -71,6 +76,8 @@ LogStruct.configure do |c|
71
76
  end
72
77
  ```
73
78
 
79
+ To force JSON logs in console, local test runs, or other Rake tasks (e.g., for debugging), set `LOGSTRUCT_ENABLED=true` in your environment.
80
+
74
81
  ## Documentation
75
82
 
76
83
  Please see the [documentation](https://logstruct.com/docs) for more details. (All code examples are type-checked and tested, and it's harder to keep a README up to date.)
@@ -10,6 +10,11 @@ module LogStruct
10
10
  module ClassMethods
11
11
  extend T::Sig
12
12
 
13
+ SERVER_COMMAND_ARGS = T.let(["server", "s"].freeze, T::Array[String])
14
+ CONSOLE_COMMAND_ARGS = T.let(["console", "c"].freeze, T::Array[String])
15
+ EMPTY_ARGV = T.let([].freeze, T::Array[String])
16
+ CI_FALSE_VALUES = T.let(["false", "0", "no"].freeze, T::Array[String])
17
+
13
18
  sig { params(block: T.proc.params(config: LogStruct::Configuration).void).void }
14
19
  def configure(&block)
15
20
  yield(config)
@@ -45,14 +50,20 @@ module LogStruct
45
50
  # - Sets enabled=true only when value is "true", "yes", "1", etc.
46
51
  # - Sets enabled=false when value is any other value
47
52
  # 2. Otherwise, check if current Rails environment is in enabled_environments
53
+ # AND one of: Rails::Server is defined, OR test environment with CI=true
54
+ # BUT NOT Rails::Console (to exclude interactive console)
48
55
  # 3. Otherwise, leave as config.enabled (defaults to true)
49
56
 
50
57
  # Then check if LOGSTRUCT_ENABLED env var is set
51
58
  config.enabled = if ENV["LOGSTRUCT_ENABLED"]
52
- # Override to true only if env var is "true"
53
59
  %w[true t yes y 1].include?(ENV["LOGSTRUCT_ENABLED"]&.strip&.downcase)
54
60
  else
55
- config.enabled_environments.include?(::Rails.env.to_sym)
61
+ is_console = console_process?
62
+ is_server = server_process?
63
+ is_ci = ci_build?
64
+ in_enabled_env = config.enabled_environments.include?(::Rails.env.to_sym)
65
+
66
+ in_enabled_env && !is_console && (is_server || (::Rails.env.test? && is_ci))
56
67
  end
57
68
  end
58
69
 
@@ -112,6 +123,45 @@ module LogStruct
112
123
 
113
124
  private
114
125
 
126
+ sig { returns(T::Boolean) }
127
+ def console_process?
128
+ return true if defined?(::Rails::Console)
129
+
130
+ current_argv.any? { |arg| CONSOLE_COMMAND_ARGS.include?(arg) }
131
+ end
132
+
133
+ sig { returns(T::Boolean) }
134
+ def server_process?
135
+ return true if logstruct_server_mode?
136
+
137
+ current_argv.any? { |arg| SERVER_COMMAND_ARGS.include?(arg) }
138
+ end
139
+
140
+ sig { returns(T::Boolean) }
141
+ def logstruct_server_mode?
142
+ ::LogStruct.server_mode?
143
+ end
144
+
145
+ sig { returns(T::Array[String]) }
146
+ def current_argv
147
+ raw = ::ARGV
148
+ strings = raw.map { |arg| arg.to_s }
149
+ T.let(strings, T::Array[String])
150
+ rescue NameError
151
+ EMPTY_ARGV
152
+ end
153
+
154
+ sig { returns(T::Boolean) }
155
+ def ci_build?
156
+ value = ENV["CI"]
157
+ return false if value.nil?
158
+
159
+ normalized = value.strip.downcase
160
+ return false if normalized.empty?
161
+
162
+ !CI_FALSE_VALUES.include?(normalized)
163
+ end
164
+
115
165
  sig { params(filter: T.untyped).returns(T.nilable(Symbol)) }
116
166
  def normalize_filter_symbol(filter)
117
167
  return filter if filter.is_a?(Symbol)
@@ -139,12 +139,7 @@ module LogStruct
139
139
 
140
140
  sig { params(e: StandardError).void }
141
141
  def handle_integration_error(e)
142
- server_mode = false
143
- begin
144
- server_mode = ::LogStruct.instance_variable_defined?(:@server_mode) && ::LogStruct.instance_variable_get(:@server_mode)
145
- rescue
146
- server_mode = false
147
- end
142
+ server_mode = ::LogStruct.server_mode?
148
143
  if defined?(::Rails) && ::Rails.respond_to?(:env) && ::Rails.env.test? && !server_mode
149
144
  raise e
150
145
  else
@@ -54,25 +54,18 @@ module LogStruct
54
54
 
55
55
  sig { params(args: T.untyped, block: T.nilable(T.proc.returns(T.untyped))).returns(T.untyped) }
56
56
  def perform(*args, &block)
57
- mark_server_mode!
57
+ ::LogStruct.server_mode = true
58
58
  super
59
59
  end
60
60
 
61
61
  sig { params(server: T.untyped, url: T.nilable(String)).void }
62
62
  def print_boot_information(server, url)
63
- mark_server_mode!
63
+ ::LogStruct.server_mode = true
64
64
  consume_boot_banner(server, url)
65
65
  end
66
66
 
67
67
  private
68
68
 
69
- sig { void }
70
- def mark_server_mode!
71
- ::LogStruct.instance_variable_set(:@server_mode, true)
72
- rescue
73
- # Ignore – server mode is best-effort
74
- end
75
-
76
69
  sig { params(server: T.untyped, url: T.nilable(String)).void }
77
70
  def consume_boot_banner(server, url)
78
71
  return unless defined?(::LogStruct::Integrations::Puma)
@@ -55,11 +55,7 @@ module LogStruct
55
55
 
56
56
  # Emit Puma lifecycle logs when running `rails server`
57
57
  initializer "logstruct.puma_lifecycle", after: "logstruct.configure_logger" do
58
- begin
59
- is_server = ::LogStruct.instance_variable_defined?(:@server_mode) && ::LogStruct.instance_variable_get(:@server_mode)
60
- rescue
61
- is_server = false
62
- end
58
+ is_server = ::LogStruct.server_mode?
63
59
  next unless is_server
64
60
  begin
65
61
  require "log_struct/log/puma"
@@ -2,5 +2,5 @@
2
2
  # frozen_string_literal: true
3
3
 
4
4
  module LogStruct
5
- VERSION = "0.1.1"
5
+ VERSION = "0.1.2"
6
6
  end
data/lib/log_struct.rb CHANGED
@@ -23,12 +23,26 @@ require "log_struct/semantic_logger/setup"
23
23
  require "log_struct/rails_boot_banner_silencer"
24
24
 
25
25
  module LogStruct
26
+ extend T::Sig
27
+
28
+ @server_mode = T.let(false, T::Boolean)
29
+
26
30
  class Error < StandardError; end
27
31
 
28
32
  extend Concerns::ErrorHandling::ClassMethods
29
33
  extend Concerns::Configuration::ClassMethods
30
34
  extend Concerns::Logging::ClassMethods
31
35
 
36
+ sig { returns(T::Boolean) }
37
+ def self.server_mode?
38
+ @server_mode
39
+ end
40
+
41
+ sig { params(value: T::Boolean).void }
42
+ def self.server_mode=(value)
43
+ @server_mode = value
44
+ end
45
+
32
46
  # Set enabled at require time based on current Rails environment.
33
47
  # (Users can disable or enable LogStruct later in an initializer.)
34
48
  set_enabled_from_rails_env!
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logstruct
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - DocSpring