|
131 | 131 | expect(log_event[:body]).to eql("Fatal message") |
132 | 132 | end |
133 | 133 | end |
| 134 | + |
| 135 | + context "with std_lib_logger_filter" do |
| 136 | + let(:null_logger) { ::Logger.new(IO::NULL) } |
| 137 | + |
| 138 | + context "when no filter is configured" do |
| 139 | + it "sends all log messages to Sentry" do |
| 140 | + logger.info("Test message") |
| 141 | + |
| 142 | + expect(sentry_logs).to_not be_empty |
| 143 | + expect(sentry_logs.last[:body]).to eq("Test message") |
| 144 | + end |
| 145 | + end |
| 146 | + |
| 147 | + context "when filter always returns true" do |
| 148 | + before do |
| 149 | + Sentry.configuration.std_lib_logger_filter = ->(logger, message, level) { true } |
| 150 | + end |
| 151 | + |
| 152 | + it "sends log messages to Sentry" do |
| 153 | + logger.info("Test message") |
| 154 | + |
| 155 | + expect(sentry_logs).to_not be_empty |
| 156 | + expect(sentry_logs.last[:body]).to eq("Test message") |
| 157 | + end |
| 158 | + end |
| 159 | + |
| 160 | + context "when filter always returns false" do |
| 161 | + before do |
| 162 | + Sentry.configuration.std_lib_logger_filter = ->(logger, message, level) { false } |
| 163 | + end |
| 164 | + |
| 165 | + it "blocks messages from Sentry but still logs locally" do |
| 166 | + expect { |
| 167 | + logger.info("Test message") |
| 168 | + }.to output(/Test message/).to_stdout |
| 169 | + |
| 170 | + expect(sentry_logs).to be_empty |
| 171 | + end |
| 172 | + end |
| 173 | + |
| 174 | + context "when filter uses logger instance for decisions" do |
| 175 | + before do |
| 176 | + Sentry.configuration.std_lib_logger_filter = ->(logger, message, level) do |
| 177 | + !logger.instance_variable_get(:@logdev).nil? |
| 178 | + end |
| 179 | + end |
| 180 | + |
| 181 | + it "allows logs from regular loggers" do |
| 182 | + logger.info("Regular log message") |
| 183 | + |
| 184 | + expect(sentry_logs).to_not be_empty |
| 185 | + expect(sentry_logs.last[:body]).to eq("Regular log message") |
| 186 | + end |
| 187 | + |
| 188 | + it "blocks logs from IO::NULL loggers" do |
| 189 | + null_logger.error("Null log message") |
| 190 | + |
| 191 | + expect(sentry_logs).to be_empty |
| 192 | + end |
| 193 | + end |
| 194 | + |
| 195 | + context "when filter uses message content for decisions" do |
| 196 | + before do |
| 197 | + Sentry.configuration.std_lib_logger_filter = ->(logger, message, level) do |
| 198 | + !message.to_s.include?("SKIP") |
| 199 | + end |
| 200 | + end |
| 201 | + |
| 202 | + it "allows messages without SKIP keyword" do |
| 203 | + logger.info("Regular info message") |
| 204 | + |
| 205 | + expect(sentry_logs).to_not be_empty |
| 206 | + expect(sentry_logs.last[:body]).to eq("Regular info message") |
| 207 | + end |
| 208 | + |
| 209 | + it "blocks messages containing SKIP keyword" do |
| 210 | + expect { |
| 211 | + logger.info("SKIP: this should be filtered") |
| 212 | + }.to output(/SKIP: this should be filtered/).to_stdout |
| 213 | + |
| 214 | + expect(sentry_logs).to be_empty |
| 215 | + end |
| 216 | + end |
| 217 | + |
| 218 | + context "when filter uses log level for decisions" do |
| 219 | + before do |
| 220 | + Sentry.configuration.std_lib_logger_filter = ->(logger, message, level) do |
| 221 | + [:error, :fatal].include?(level) |
| 222 | + end |
| 223 | + end |
| 224 | + |
| 225 | + it "allows error and fatal logs" do |
| 226 | + logger.error("Error message") |
| 227 | + logger.fatal("Fatal message") |
| 228 | + |
| 229 | + expect(sentry_logs.size).to eq(2) |
| 230 | + expect(sentry_logs[0][:body]).to eq("Error message") |
| 231 | + expect(sentry_logs[1][:body]).to eq("Fatal message") |
| 232 | + end |
| 233 | + |
| 234 | + it "blocks info and warn logs" do |
| 235 | + expect { |
| 236 | + logger.info("Info message") |
| 237 | + logger.warn("Warn message") |
| 238 | + }.to output(/Info message.*Warn message/m).to_stdout |
| 239 | + |
| 240 | + expect(sentry_logs).to be_empty |
| 241 | + end |
| 242 | + end |
| 243 | + end |
134 | 244 | end |
135 | 245 | end |
0 commit comments