Skip to content

Commit b3fed53

Browse files
committed
[sentry-rails] add tests for Rails logger when :logger patch is enabled
1 parent 6e986d5 commit b3fed53

File tree

1 file changed

+157
-0
lines changed

1 file changed

+157
-0
lines changed
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
# frozen_string_literal: true
2+
3+
begin
4+
require "simplecov"
5+
SimpleCov.command_name "RailsLoggerPatch"
6+
rescue LoadError
7+
end
8+
9+
require "logger"
10+
require "sentry-ruby"
11+
require "sentry/test_helper"
12+
13+
require_relative "../dummy/test_rails_app/app"
14+
15+
RSpec.describe "Rails.logger with :logger patch" do
16+
include Sentry::TestHelper
17+
18+
# Set up a real Rails app with logger
19+
let(:log_output) { StringIO.new }
20+
let(:app) do
21+
make_basic_app do |config|
22+
config.enable_logs = true
23+
config.enabled_patches = [:logger]
24+
config.max_log_events = 10
25+
config.sdk_logger = Logger.new(nil)
26+
end
27+
end
28+
29+
before do
30+
app
31+
Rails.logger = Logger.new(log_output)
32+
end
33+
34+
context "when :logger patch is enabled" do
35+
it "captures Rails.logger calls when :logger patch is enabled" do
36+
Rails.logger.debug("Test debug message")
37+
Rails.logger.info("Test info message")
38+
Rails.logger.warn("Test warning message")
39+
Rails.logger.error("Test error message")
40+
Rails.logger.fatal("Test fatal message")
41+
42+
Sentry.get_current_client.log_event_buffer.flush
43+
44+
expect(sentry_logs).not_to be_empty
45+
46+
log_messages = sentry_logs.map { |log| log[:body] }
47+
expect(log_messages).to include(
48+
"Test debug message",
49+
"Test info message",
50+
"Test warning message",
51+
"Test error message",
52+
"Test fatal message"
53+
)
54+
55+
test_logs = sentry_logs.select { |log| log[:body].start_with?("Test ") }
56+
log_levels = test_logs.map { |log| log[:level] }
57+
expect(log_levels).to contain_exactly("debug", "info", "warn", "error", "fatal")
58+
end
59+
60+
it "captures Rails.logger calls with block syntax" do
61+
Rails.logger.info { "Block message" }
62+
63+
Sentry.get_current_client.log_event_buffer.flush
64+
65+
expect(sentry_logs).not_to be_empty
66+
67+
log_messages = sentry_logs.map { |log| log[:body] }
68+
expect(log_messages).to include("Block message")
69+
70+
block_log = sentry_logs.find { |log| log[:body] == "Block message" }
71+
expect(block_log[:level]).to eq("info")
72+
end
73+
74+
it "captures Rails.logger calls with progname" do
75+
Rails.logger.info("MyProgram") { "Message with progname" }
76+
77+
Sentry.get_current_client.log_event_buffer.flush
78+
79+
expect(sentry_logs).not_to be_empty
80+
81+
log_messages = sentry_logs.map { |log| log[:body] }
82+
expect(log_messages).to include("Message with progname")
83+
84+
progname_log = sentry_logs.find { |log| log[:body] == "Message with progname" }
85+
expect(progname_log[:level]).to eq("info")
86+
end
87+
88+
it "does not capture Sentry SDK internal logs" do
89+
Rails.logger.info(Sentry::Logger::PROGNAME) { "Internal Sentry message" }
90+
91+
Sentry.get_current_client.log_event_buffer.flush
92+
93+
log_messages = sentry_logs.map { |log| log[:body] }
94+
expect(log_messages).not_to include("Internal Sentry message")
95+
end
96+
97+
it "strips whitespace from log messages" do
98+
Rails.logger.info(" Message with whitespace ")
99+
100+
Sentry.get_current_client.log_event_buffer.flush
101+
102+
expect(sentry_logs).not_to be_empty
103+
104+
log_messages = sentry_logs.map { |log| log[:body] }
105+
expect(log_messages).to include("Message with whitespace")
106+
end
107+
108+
it "handles non-string log messages" do
109+
Rails.logger.info(12345)
110+
111+
Sentry.get_current_client.log_event_buffer.flush
112+
113+
expect(sentry_logs).not_to be_empty
114+
115+
log_messages = sentry_logs.map { |log| log[:body] }
116+
expect(log_messages).to include("12345")
117+
end
118+
end
119+
120+
context "when Rails.logger is a BroadcastLogger", skip: !defined?(ActiveSupport::BroadcastLogger) do
121+
let(:string_io1) { StringIO.new }
122+
let(:string_io2) { StringIO.new }
123+
let(:logger1) { Logger.new(string_io1) }
124+
let(:logger2) { Logger.new(string_io2) }
125+
let(:broadcast_logger) { ActiveSupport::BroadcastLogger.new(logger1, logger2) }
126+
let(:broadcast_app) do
127+
make_basic_app do |config|
128+
config.enable_logs = true
129+
config.enabled_patches = [:logger]
130+
config.max_log_events = 10
131+
config.sdk_logger = Logger.new(nil)
132+
end
133+
end
134+
135+
before do
136+
broadcast_app
137+
Rails.logger = broadcast_logger
138+
end
139+
140+
it "captures logs from BroadcastLogger" do
141+
Rails.logger.info("Broadcast message")
142+
143+
Sentry.get_current_client.log_event_buffer.flush
144+
145+
expect(sentry_logs).not_to be_empty
146+
147+
log_messages = sentry_logs.map { |log| log[:body] }
148+
expect(log_messages).to include("Broadcast message")
149+
150+
broadcast_log = sentry_logs.find { |log| log[:body] == "Broadcast message" }
151+
expect(broadcast_log[:level]).to eq("info")
152+
153+
expect(string_io1.string).to include("Broadcast message")
154+
expect(string_io2.string).to include("Broadcast message")
155+
end
156+
end
157+
end

0 commit comments

Comments
 (0)