diff --git a/lib/semantic/abstract_formatter.rb b/lib/semantic/abstract_formatter.rb index 710c01c..2268764 100644 --- a/lib/semantic/abstract_formatter.rb +++ b/lib/semantic/abstract_formatter.rb @@ -1,5 +1,45 @@ module Semantic # Abstract colorized formatter class AbstractFormatter < SemanticLogger::Formatters::Color + include AnsiColors + + private + + def exception + return unless log.exception + + if log.exception.is_a?(Semantic::TagWrapError) + exc_wrapper = log.exception + # puts "TAG_WRAP detected #{exc_wrapper.tag}" + + exc = exc_wrapper.error + log.tags = Array.wrap(exc_wrapper.tag) + else + exc = log.exception + end + + clazz = colorize("#{exc.class}\n", color_map[:fatal]) + message = colorize(exc.message.chomp(''), color_map[:error]) + + # TODO: backtrace_cleaner might be optionally disable from Live::Constant + backtrace = stackisize(Rails.backtrace_cleaner.clean(exc.backtrace)) + + "#{clazz}#{message}#{backtrace}" + end + + def ansi_trace(trace, symbol) + match = trace.match(/(↳ )?(.*:\d+)(:in `)?(.*'?)/) # only m2(=file) and m4(=optional function) are useful + return trace unless match + + _, m2, _, m4 = match.captures + "#{symbol} #{m2} #{BOLD}#{m4.chop}#{CLEAR}" + end + + def stackisize(items) + return '' if items.empty? + + traces = items.map { |item| ansi_trace(item, '➟') } + "\n#{traces.join("\n")}" + end end end diff --git a/lib/semantic/basic_formatter.rb b/lib/semantic/basic_formatter.rb index 17301c4..718e0ae 100644 --- a/lib/semantic/basic_formatter.rb +++ b/lib/semantic/basic_formatter.rb @@ -53,41 +53,6 @@ module Semantic "#{color}[#{fname}]#{color_map.clear}" if fname end - def exception - return unless log.exception - - root_path = Rails.root.to_s - - if log.exception.is_a?(Semantic::TagWrapError) - exc_wrapper = log.exception - # puts "TAG_WRAP detected #{exc_wrapper.tag}" - - exc = exc_wrapper.error - log.tags = Array.wrap(exc_wrapper.tag) - else - exc = log.exception - end - - backtrace = exc.backtrace.select do |line| - line.starts_with?(root_path) - end - - if backtrace.count.positive? - "-- #{ANSI_REVERSED_ERROR}#{exc.class}#{color_map.clear} #{color}#{exc.message}#{color_map.clear}#{SemanticLogger::AnsiColors::WHITE}\n\t#{backtrace.join("\n\t")}#{color_map.clear}\n\n" - else - "-- #{ANSI_REVERSED_ERROR}#{exc.class}: #{exc.message}#{color_map.clear}\n\n" - end - - # TODO: remove me - # clazz = colorize("#{exc.class}\n", color_map[:fatal]) - # message = colorize(exc.message.chomp(''), color_map[:error]) - - # # TODO: backtrace_cleaner might be optionally disable from Live::Constant - # backtrace = stackisize(Rails.backtrace_cleaner.clean(exc.backtrace)) - - # "#{clazz}#{message}#{backtrace}" - end - def call(log, logger) self.color = color_map[log.level] self.log = log @@ -99,6 +64,9 @@ module Semantic else [tags, named_tags, duration, name, message, payload, exception].compact.join(' ') end + rescue StandardError => e + puts "Error during formatting: #{e.message}" + puts e.backtrace.join("\n") end end end diff --git a/lib/semantic/fancy_formatter.rb b/lib/semantic/fancy_formatter.rb index 3dfcece..04e1995 100644 --- a/lib/semantic/fancy_formatter.rb +++ b/lib/semantic/fancy_formatter.rb @@ -5,8 +5,6 @@ require 'json' module Semantic # wraps meanwhile takes care of ansi colors class FancyFormatter < AbstractFormatter - include AnsiColors - TAG_NONE = ''.freeze CENTER_SIZE = 20 FOREMAN_PREFIX_LENGTH = 18 @@ -41,6 +39,9 @@ module Semantic return result unless computed_exception result << "\n" << build_terminus + rescue StandardError => e + puts "Error during formatting: #{e.message}" + puts e.backtrace.join("\n") end def reject(log) @@ -70,14 +71,6 @@ module Semantic Regexp.new(regex_s) end - def ansi_trace(trace, symbol) - match = trace.match(/(↳ )?(.*:\d+)(:in `)?(.*'?)/) # only m2(=file) and m4(=optional function) are useful - return trace unless match - - _, m2, _, m4 = match.captures - "#{symbol} #{m2} #{BOLD}#{m4.chop}#{CLEAR}" - end - def two_captures_last_as_bold(message, regex) match = message.match(regex) return "unmatched: #{message}" unless match @@ -136,13 +129,6 @@ module Semantic colorize(centerize(log.name), taint) end - def stackisize(items) - return '' if items.empty? - - traces = items.map { |item| ansi_trace(item, '➟') } - "\n#{traces.join("\n")}" - end - def build_dimensions(dimensions) "#{tags} #{origin} #{dimensions.rails} " end @@ -165,28 +151,6 @@ module Semantic log.payload.ai(indent: 2, object_id: false) end - def exception - return unless log.exception - - if log.exception.is_a?(Semantic::TagWrapError) - exc_wrapper = log.exception - # puts "TAG_WRAP detected #{exc_wrapper.tag}" - - exc = exc_wrapper.error - log.tags = Array.wrap(exc_wrapper.tag) - else - exc = log.exception - end - - clazz = colorize("#{exc.class}\n", color_map[:fatal]) - message = colorize(exc.message.chomp(''), color_map[:error]) - - # TODO: backtrace_cleaner might be optionally disable from Live::Constant - backtrace = stackisize(Rails.backtrace_cleaner.clean(exc.backtrace)) - - "#{clazz}#{message}#{backtrace}" - end - def level_char case log.level when :info, :debug then ' '