-
Notifications
You must be signed in to change notification settings - Fork 2.4k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Check Config File Existence (#4054) * Check config file existence * Eager config file check * Parse expanded path to default sidekiq.yml config file in Rails app * Cleanup * Add minitest-around * Extract context from formatter * Add JSON logger formatter * Adjust job logger to handle elapsed time within context * Add tid test * Rename processor logger * Enforce global state reset in logging tests * Add warning about upcoming refactoring to Sidekiq::Logging * Replace around hook with explicit stub inside test It's implemented with fibers, which means Thread.current returns different values in JRuby. * Fix typo * Concise JSON formatter keys * Add logger_formatter option * Shift context from array of strings to hash Allows more flexibly format context in the different formatters. * Adjust warning message regarding context type change * Add "Formatter" suffix to classes * Fix CLI specs * Replace Sidekiq::Logging with Sidekiq::Logger * Namespace logger formatters * Remove rails 4 appraisal
- Loading branch information
Showing
15 changed files
with
653 additions
and
396 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,25 +1,52 @@ | ||
# frozen_string_literal: true | ||
|
||
module Sidekiq | ||
class JobLogger | ||
|
||
def call(item, queue) | ||
start = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC) | ||
logger.info("start") | ||
|
||
Sidekiq.logger.info("start") | ||
|
||
yield | ||
logger.info("done: #{elapsed(start)} sec") | ||
|
||
with_elapsed_time_context(start) do | ||
Sidekiq.logger.info("done") | ||
end | ||
rescue Exception | ||
logger.info("fail: #{elapsed(start)} sec") | ||
with_elapsed_time_context(start) do | ||
Sidekiq.logger.info("fail") | ||
end | ||
|
||
raise | ||
end | ||
|
||
def with_job_hash_context(job_hash, &block) | ||
Sidekiq.logger.with_context(job_hash_context(job_hash), &block) | ||
end | ||
|
||
def job_hash_context(job_hash) | ||
# If we're using a wrapper class, like ActiveJob, use the "wrapped" | ||
# attribute to expose the underlying thing. | ||
{ | ||
class: job_hash['wrapped'] || job_hash["class"], | ||
jid: job_hash['jid'], | ||
bid: job_hash['bid'] | ||
} | ||
end | ||
|
||
def with_elapsed_time_context(start, &block) | ||
Sidekiq.logger.with_context(elapsed_time_context(start), &block) | ||
end | ||
|
||
def elapsed_time_context(start) | ||
{ elapsed: "#{elapsed(start)} sec" } | ||
end | ||
|
||
private | ||
|
||
def elapsed(start) | ||
(::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - start).round(3) | ||
end | ||
|
||
def logger | ||
Sidekiq.logger | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,70 @@ | ||
# frozen_string_literal: true | ||
|
||
require 'logger' | ||
require 'time' | ||
|
||
module Sidekiq | ||
class Logger < ::Logger | ||
|
||
def initialize(*args) | ||
super | ||
|
||
formatter_class = case Sidekiq.logger_formatter | ||
when :json | ||
Formatters::JSON | ||
else | ||
ENV['DYNO'] ? Formatters::WithoutTimestamp : Formatters::Pretty | ||
end | ||
|
||
self.formatter = formatter_class.new | ||
end | ||
|
||
def tid | ||
Thread.current['sidekiq_tid'] ||= (Thread.current.object_id ^ ::Process.pid).to_s(36) | ||
end | ||
|
||
def context | ||
Thread.current[:sidekiq_context] ||= {} | ||
end | ||
|
||
def with_context(hash) | ||
context.merge!(hash) | ||
yield | ||
ensure | ||
hash.keys.each { |key| context.delete(key) } | ||
end | ||
|
||
module Formatters | ||
class Pretty < Logger::Formatter | ||
def call(severity, time, program_name, message) | ||
"#{time.utc.iso8601(3)} #{::Process.pid} TID-#{Sidekiq.logger.tid}#{format_context(Sidekiq.logger.context)} #{severity}: #{message}\n" | ||
end | ||
|
||
private | ||
|
||
def format_context(context) | ||
' ' + context.compact.map { |k, v| "#{k.upcase}=#{v}" }.join(' ') if context.any? | ||
end | ||
end | ||
|
||
class WithoutTimestamp < Pretty | ||
def call(severity, time, program_name, message) | ||
"#{::Process.pid} TID-#{Sidekiq.logger.tid}#{format_context(Sidekiq.logger.context)} #{severity}: #{message}\n" | ||
end | ||
end | ||
|
||
class JSON < Logger::Formatter | ||
def call(severity, time, program_name, message) | ||
Sidekiq.dump_json( | ||
ts: time.utc.iso8601(3), | ||
pid: ::Process.pid, | ||
tid: Sidekiq.logger.tid, | ||
ctx: Sidekiq.logger.context, | ||
sev: severity, | ||
msg: message | ||
) | ||
end | ||
end | ||
end | ||
end | ||
end |
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.