Skip to content

Commit aec7eaf

Browse files
authored
Merge pull request reidmorrison#133 from kml/log-payload-when-active_job-performs-with-exception
Log payload when ActiveJob performs with exception
2 parents c018c6a + f65425b commit aec7eaf

File tree

2 files changed

+52
-18
lines changed

2 files changed

+52
-18
lines changed

lib/rails_semantic_logger/active_job/log_subscriber.rb

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,34 @@ module ActiveJob
55
class LogSubscriber < ::ActiveSupport::LogSubscriber
66
def enqueue(event)
77
log_with_formatter event: event do |fmt|
8-
"Enqueued #{fmt.job_info}"
8+
{message: "Enqueued #{fmt.job_info}"}
99
end
1010
end
1111

1212
def enqueue_at(event)
1313
log_with_formatter event: event do |fmt|
14-
"Enqueued #{fmt.job_info} at #{fmt.scheduled_at}"
14+
{message: "Enqueued #{fmt.job_info} at #{fmt.scheduled_at}"}
1515
end
1616
end
1717

1818
def perform_start(event)
1919
log_with_formatter event: event do |fmt|
20-
"Performing #{fmt.job_info}"
20+
{message: "Performing #{fmt.job_info}"}
2121
end
2222
end
2323

2424
def perform(event)
2525
ex = event.payload[:exception_object]
2626
if ex
27-
logger.error ex
27+
log_with_formatter event: event, log_duration: true, level: :error do |fmt|
28+
{
29+
message: "Error performing #{fmt.job_info} in #{event.duration.round(2)}ms",
30+
exception: ex
31+
}
32+
end
2833
else
2934
log_with_formatter event: event, log_duration: true do |fmt|
30-
"Performed #{fmt.job_info} in #{event.duration.round(2)}ms"
35+
{message: "Performed #{fmt.job_info} in #{event.duration.round(2)}ms"}
3136
end
3237
end
3338
end
@@ -107,10 +112,10 @@ def log_duration?
107112
end
108113
end
109114

110-
def log_with_formatter(**kw_args)
115+
def log_with_formatter(level: :info, **kw_args)
111116
fmt = EventFormatter.new(**kw_args)
112117
msg = yield fmt
113-
logger.info msg, fmt.payload
118+
logger.public_send(level, **msg, payload: fmt.payload)
114119
end
115120

116121
def logger

test/active_job_test.rb

Lines changed: 40 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,12 @@ def id
3838
describe "ActiveJob" do
3939
before do
4040
skip "Older rails does not support ActiveJob" unless defined?(ActiveJob)
41+
@mock_logger = MockLogger.new
42+
@appender = SemanticLogger.add_appender(logger: @mock_logger, formatter: :raw)
43+
end
44+
45+
after do
46+
SemanticLogger.remove_appender(@appender)
4147
end
4248

4349
describe ".perform_now" do
@@ -58,12 +64,20 @@ def id
5864
let(:subscriber) { RailsSemanticLogger::ActiveJob::LogSubscriber.new }
5965

6066
let(:event) do
61-
ActiveSupport::Notifications::Event.new "enqueue.active_job",
67+
ActiveSupport::Notifications::Event.new event_name,
6268
5.seconds.ago,
6369
Time.zone.now,
6470
SecureRandom.uuid,
65-
adapter: ActiveJob::QueueAdapters::InlineAdapter.new,
66-
job: job
71+
payload
72+
end
73+
74+
let(:event_name) { "enqueue.active_job" }
75+
76+
let(:payload) do
77+
{
78+
adapter: ActiveJob::QueueAdapters::InlineAdapter.new,
79+
job: job
80+
}
6781
end
6882

6983
let(:job) do
@@ -81,19 +95,34 @@ def id
8195
end
8296
end
8397

98+
describe "#perform with exception object" do
99+
let(:event_name) { "perform.active_job" }
100+
101+
let(:payload) do
102+
{
103+
adapter: ActiveJob::QueueAdapters::InlineAdapter.new,
104+
job: job,
105+
exception_object: ArgumentError.new("error")
106+
}
107+
end
108+
109+
specify do
110+
subscriber.perform(event)
111+
112+
SemanticLogger.flush
113+
actual = @mock_logger.message
114+
115+
assert_equal({name: "ArgumentError", message: "error", stack_trace: nil}, actual[:exception])
116+
assert_equal("ActiveJobTest::MyJob", actual[:payload][:job_class])
117+
end
118+
end
119+
84120
describe "ActiveJob::Logging::LogSubscriber::EventFormatter" do
85121
let(:formatter) do
86122
RailsSemanticLogger::ActiveJob::LogSubscriber::EventFormatter.new(event: event, log_duration: true)
87123
end
88124

89-
let(:event) do
90-
ActiveSupport::Notifications::Event.new "perform.active_job",
91-
5.seconds.ago,
92-
Time.zone.now,
93-
"transaction_id",
94-
adapter: ActiveJob::QueueAdapters::InlineAdapter.new,
95-
job: job
96-
end
125+
let(:event_name) { "perform.active_job" }
97126

98127
describe "#payload" do
99128
specify do

0 commit comments

Comments
 (0)