|
| 1 | +# Copyright (c) 2014 Peter H. Boling of 9thBit LLC |
| 2 | +# Released under the MIT license |
| 3 | +# For Rails 3+ |
| 4 | +# Patterned after this LogFormatter: |
| 5 | +# https://github.com/QutBioacousticsResearchGroup/bioacoustic-workbench/blob/master/config/initializers/log_formatting.rb |
| 6 | +# And some of this: |
| 7 | +# http://95.154.230.254/ip-1/encoded/Oi8vcGFzdGViaW4uY29tL1hxRU1keGRT |
| 8 | +# Makes as much as possible constant values to not bog down GC and make it whip fast |
| 9 | +require "humorous_log_formatter/version" |
| 10 | + |
| 11 | +module HumorousLogFormatter |
| 12 | + class LogFormatter |
| 13 | + # TODO: For Rails 4, uncomment the line below |
| 14 | + #include ActiveSupport::TaggedLogging::Formatter |
| 15 | + SEVERITY_TO_TAG_MAP = {'DEBUG' => 'meh', 'INFO' => 'fyi', 'WARN' => 'hmm', 'ERROR' => 'wtf', 'FATAL' => 'omg', 'UNKNOWN' => '???'} |
| 16 | + SEVERITY_TO_COLOR_MAP = {'DEBUG' => '0;37', 'INFO' => '32', 'WARN' => '33', 'ERROR' => '31', 'FATAL' => '31', 'UNKNOWN' => '37'} |
| 17 | + USE_HUMOROUS_SEVERITIES = begin |
| 18 | + if ENV['LOG_HUMOR'] |
| 19 | + ENV['LOG_HUMOR'] != 'false' # Default to true |
| 20 | + else |
| 21 | + Rails.env.development? |
| 22 | + end |
| 23 | + end |
| 24 | + USE_COLOR = begin |
| 25 | + if ENV['LOG_COLOR'] |
| 26 | + ENV['LOG_COLOR'] != 'false' # Default to true |
| 27 | + else |
| 28 | + Rails.env.development? |
| 29 | + end |
| 30 | + end |
| 31 | + |
| 32 | + THIS_FILE_PATH = File.expand_path(".") |
| 33 | + |
| 34 | + FORMATTED_SEVERITY = USE_HUMOROUS_SEVERITIES ? |
| 35 | + lambda { |severity| sprintf("%-3s", "#{SEVERITY_TO_TAG_MAP[severity]}") } : |
| 36 | + lambda { |severity| sprintf("%-5s", "#{severity}") } |
| 37 | + |
| 38 | + FORMATTED_MESSAGE = if USE_COLOR |
| 39 | + lambda { |severity, formatted_time, msg| |
| 40 | + color = SEVERITY_TO_COLOR_MAP[severity] |
| 41 | + "[\033[#{color}m#{formatted_time}\033[0m] [\033[#{color}m#{FORMATTED_SEVERITY.call(severity)}\033[0m] #{msg.strip}\n" |
| 42 | + } |
| 43 | + else |
| 44 | + lambda { |severity, formatted_time, msg| |
| 45 | + "[#{formatted_time}] [#{FORMATTED_SEVERITY.call(severity)}] #{msg.strip}\n" |
| 46 | + } |
| 47 | + end |
| 48 | + |
| 49 | + def exception_values(e) |
| 50 | + trace = e.backtrace.select { |x| !line.starts_with?(THIS_FILE_PATH) } |
| 51 | + trace = trace.map { |l| colorize_exception(l) } if USE_COLOR |
| 52 | + first = "\n" + trace.first + ": " + e.message + " (#{e.class})" |
| 53 | + rest = "\t" + trace[1..-1].join("\n\t") |
| 54 | + return first + "\n" + rest |
| 55 | + end |
| 56 | + |
| 57 | + def colorize_exception(line) |
| 58 | + "\033[01;32m#{line}\033[0m" |
| 59 | + end |
| 60 | + |
| 61 | + def call(severity, time, progname, msg) |
| 62 | + formatted_time = time.strftime("%Y-%m-%d %H:%M:%S.") << time.usec.to_s[0..2].rjust(3) |
| 63 | + text = if msg.is_a? String |
| 64 | + msg |
| 65 | + elsif msg.is_a? Exception |
| 66 | + " --> Exception: " + exception_values(msg) |
| 67 | + else |
| 68 | + "!!!!! UNKNOWN TYPE: #{msg.class}" + msg.to_s |
| 69 | + end |
| 70 | + FORMATTED_MESSAGE.call(severity, formatted_time, text) |
| 71 | + end |
| 72 | + |
| 73 | + require "humorous_log_formatter/railtie" |
| 74 | + |
| 75 | + end |
| 76 | +end |
| 77 | + |
| 78 | + |
| 79 | + |
0 commit comments