From fcf44f8ab040b30bf6c9103a550c2499b4774c47 Mon Sep 17 00:00:00 2001 From: pvincent Date: Mon, 24 Jun 2024 13:16:15 +0400 Subject: [PATCH] basic_formatter for prod purpose --- Gemfile | 8 ++- Gemfile.lock | 2 + app/javascript/application.js | 6 +- app/javascript/controllers/application.js | 1 - lib/formatters/basic_formatter.rb | 82 +++++++++++++++++++++++ 5 files changed, 93 insertions(+), 6 deletions(-) create mode 100644 lib/formatters/basic_formatter.rb diff --git a/Gemfile b/Gemfile index 6bb485b..4c25c9e 100644 --- a/Gemfile +++ b/Gemfile @@ -2,6 +2,7 @@ source 'https://rubygems.org' ruby '3.1.2' gem 'bootsnap', require: false +gem 'dotenv-rails' gem 'importmap-rails' gem 'pagy' gem 'pg' @@ -12,11 +13,11 @@ gem 'rails_semantic_logger' gem 'sprockets-rails' gem 'stimulus-rails' gem 'tailwindcss-rails' +gem 'turbo-rails' group :development do gem 'amazing_print' gem 'debug' - gem 'dotenv-rails' gem 'error_highlight' gem 'htmlbeautifier' gem 'rails_live_reload' @@ -28,5 +29,8 @@ group :development do gem 'rubocop-shopify' gem 'rubocop-thread_safety' gem 'ruby-lsp-rails' - gem 'turbo-rails' +end + +group :production do + gem 'syslog_protocol' end diff --git a/Gemfile.lock b/Gemfile.lock index 7d47bda..019a82c 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -269,6 +269,7 @@ GEM railties (>= 6.0.0) stringio (3.1.1) strscan (3.1.0) + syslog_protocol (0.9.2) tailwindcss-rails (2.6.1) railties (>= 7.0.0) tailwindcss-rails (2.6.1-aarch64-linux) @@ -329,6 +330,7 @@ DEPENDENCIES ruby-lsp-rails sprockets-rails stimulus-rails + syslog_protocol tailwindcss-rails turbo-rails diff --git a/app/javascript/application.js b/app/javascript/application.js index ae6035f..bf278b8 100644 --- a/app/javascript/application.js +++ b/app/javascript/application.js @@ -1,3 +1,6 @@ +// Js Controllers +import "controllers" + // Turbo import "@hotwired/turbo-rails" Turbo.setProgressBarDelay(300) @@ -6,9 +9,6 @@ Turbo.setProgressBarDelay(300) import Toastify from 'toastify-js' window.Toastify = Toastify -// Js Controllers -import "controllers" - // Font Awesome import { far } from "@fortawesome/free-regular-svg-icons" import { fas } from "@fortawesome/free-solid-svg-icons" diff --git a/app/javascript/controllers/application.js b/app/javascript/controllers/application.js index edb29a9..37bb101 100644 --- a/app/javascript/controllers/application.js +++ b/app/javascript/controllers/application.js @@ -1,5 +1,4 @@ import { Application } from "@hotwired/stimulus" - const application = Application.start() // Configure Stimulus development experience diff --git a/lib/formatters/basic_formatter.rb b/lib/formatters/basic_formatter.rb new file mode 100644 index 0000000..8769715 --- /dev/null +++ b/lib/formatters/basic_formatter.rb @@ -0,0 +1,82 @@ +# My Custom colorized formatter +class BasicFormatter < SemanticLogger::Formatters::Color + ANSI_REVERSED_WARNING = "\e[0;30;43m".freeze + ANSI_REVERSED_ERROR = "\e[1;30;41m".freeze + ANSI_GRAY = "\e[90m".freeze + # Return the complete log level name in uppercase + + def initialize + super(time_format: '%H:%M:%S', + color_map: ColorMap.new( + debug: ANSI_GRAY, + info: SemanticLogger::AnsiColors::GREEN, + warn: SemanticLogger::AnsiColors::YELLOW + )) + @time_format = nil if File.exist?(File.join(Rails.root, 'Procfile.dev')) + end + + def time + "#{color}#{format_time(log.time)}#{color_map.clear}" if time_format + end + + def message + return unless log.message + + prefix = "#{color}--#{color_map.clear}" + + case log.level + when :info + message = log.message + message = message&.rstrip if log.name == 'Rails' && message.starts_with?('Completed') + if log.name == 'Rails' && message.starts_with?('Started') + message = message.split('for')[0] + puts '' if Rails.env.development? + end + if log.name == 'Rails' || log.name == 'ActionView::Base' + "#{prefix} #{ANSI_GRAY}#{message}#{color_map.clear}" + else + "#{prefix} #{SemanticLogger::AnsiColors::WHITE}#{message}#{color_map.clear}" + end + when :warn + "#{prefix} #{ANSI_REVERSED_WARNING}#{log.message}#{color_map.clear}" + when :error, :fatal + "#{prefix} #{ANSI_REVERSED_ERROR}#{log.message}#{color_map.clear}" + else + "#{prefix} #{color}#{log.message}#{color_map.clear}" + end + end + + def tags; end + + def process_info + fname = file_name_and_line + "#{color}[#{fname}]#{color_map.clear}" if fname + end + + def exception + return unless log.exception + + root_path = Rails.root.to_s + backtrace = log.exception.backtrace.select do |line| + line.starts_with?(root_path) + end + + if backtrace.count.positive? + "-- #{ANSI_REVERSED_ERROR}#{log.exception.class}#{color_map.clear} #{color}#{log.exception.message}#{color_map.clear}#{SemanticLogger::AnsiColors::WHITE}\n\t#{backtrace.join("\n\t")}#{color_map.clear}\n\n" + else + "-- #{ANSI_REVERSED_ERROR}#{log.exception.class}: #{log.exception.message}#{color_map.clear}\n\n" + end + end + + def call(log, logger) + self.color = color_map[log.level] + self.log = log + self.logger = logger + + if @time_format + [time, level, process_info, tags, named_tags, duration, name, message, payload, exception].compact.join(' ') + else + [tags, named_tags, duration, name, message, payload, exception].compact.join(' ') + end + end +end