marcqualie/rancher-shell

View on GitHub
lib/rancher/shell/logger.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "logger"

module Rancher
  module Shell
    class Logger < ::Logger
      def initialize(*args)
        super
        @formatter = Formatter.new
        # TODO: Use whitelist here for better security
        @level = ::Logger.const_get(ENV['LOG_LEVEL'].upcase) rescue ::Logger::INFO
      end

      class Formatter < ::Logger::Formatter
        # Default: "%s, [%s#%d] %5s -- %s: %s\n"
        Format = "%s, [%s#%d] %5s -- %s: [RANCHER::SHELL] %s\n"

        def call(severity, time, progname, msg)
          msg = sanitize_escape_sequences(msg)
          Format % [severity[0..0], format_datetime(time), $$, severity, progname, msg2str(msg)]
        end

        # Some escape charatcers cause weirdness within logs and STDOUT
        #   http://www.asciitable.com/
        #   https://en.wikipedia.org/wiki/ANSI_escape_code
        def sanitize_escape_sequences(msg)
          msg = msg.gsub("\r", "[CR]")
          msg = msg.gsub("\n", "[LF]")
          msg = msg.gsub(/\e\[A/, '[CUU]')
          msg = msg.gsub(/\e\[B/, '[CUD]')
          msg = msg.gsub(/\e\[2K/, '[CLEAR]')
          msg = msg.gsub(/#{3.chr}/, '[ETX]')
          msg = msg.gsub(/#{4.chr}/, '[EOT]')
          msg = msg.gsub(/#{7.chr}/, '[BELL]')
          msg = msg.gsub(/#{8.chr}/, '[BS]')
          msg = msg.gsub(/#{9.chr}/, '[TAB]')
          msg = msg.gsub(/#{24.chr}/, '[CAN]')
          msg = msg.gsub(/#{27.chr}/, '[ESC]')
          msg = msg.gsub(/#{127.chr}/, '[DEL]')
          msg
        end
      end
    end
  end
end