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 +4 -4
- data/CHANGELOG.md +6 -0
- data/README.md +12 -5
- data/lib/log_struct/concerns/configuration.rb +52 -2
- data/lib/log_struct/integrations/puma.rb +1 -6
- data/lib/log_struct/rails_boot_banner_silencer.rb +2 -9
- data/lib/log_struct/railtie.rb +1 -5
- data/lib/log_struct/version.rb +1 -1
- data/lib/log_struct.rb +14 -0
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a65754f5cc8e4753585ca448eec8e78b5f8586aba5161d94d5c5ccce20386909
|
4
|
+
data.tar.gz: 9088ba81fe6319a9dfd1740949c87c7a793bd1535ae97a4d44bc98b0ca3b60b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
-
###
|
61
|
+
### Default behavior by process type
|
62
62
|
|
63
|
-
-
|
64
|
-
-
|
65
|
-
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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)
|
data/lib/log_struct/railtie.rb
CHANGED
@@ -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
|
-
|
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"
|
data/lib/log_struct/version.rb
CHANGED
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!
|