class App::Logger

Attributes

amqp_formatter[RW]
logdev[RW]
main_formatter[RW]

Public Class Methods

new( dest = nil, formatter: nil, bunny_formatter: nil ) click to toggle source
Calls superclass method
# File lib/app-logger.rb, line 36
def initialize( dest = nil, formatter: nil, bunny_formatter: nil )
  raise 'Log уже есть.' if defined?( ::Log )
  raise 'Сначала нужны настройки.' unless defined?( ::Cfg )

  @main_formatter = formatter || base_formatter
  @amqp_formatter = bunny_formatter || mq_formatter || @main_formatter

  raise 'formatter должны быть Proc' if ! @main_formatter.is_a?(Proc) || ! @amqp_formatter.is_a?(Proc)

  @logdev = 
    case dest ||= Cfg.app.log
      when 'stderr', 'syslog', nil
        # $stdout.close
        $stdout.reopen $stderr
      when 'stdout'
        # $stderr.close
        $stderr.reopen $stdout
      else
        Cfg.app.log = "#{ Cfg.root }/#{ Cfg.app.log }" unless Cfg.app.log =~ %r{^/}
        FileUtils.mkdir_p Pathname.new( Cfg.app.log ).dirname
        logf = File.open( Cfg.app.log, 'a' )
        logf.sync = true
        $stderr.reopen logf
        $stdout.reopen logf
        logf
    end
  super @logdev, progname: Cfg.app.progname, level: Cfg.loglevel, formatter: @main_formatter
  Kernel.const_set 'Log', self
  Kernel.const_set 'MQLog', ::Logger.new( @logdev, progname: "#{ Cfg.app.progname }+Bunny", level: Cfg.loglevel, formatter: @amqp_formatter )
  Log.info{"#{ Cfg.env } started. thread #{ Thread.current.object_id }."}
  self
end

Public Instance Methods

base_formatter() click to toggle source
# File lib/app-logger.rb, line 12
    def base_formatter
      return proc { |severity, datetime, progname, msg|
#        "#{ severity[0] }°#{ datetime.strftime '%d/%m-%H:%M:%S' }°#{ Thread.current.object_id }°#{ Process.pid }°#{ "%20s" % caller_locations[0..4].last.label }:#{ "%03d" % caller_locations[0..4].last.lineno.to_i }—#{ msg }\n"
          "#{ severity[0] } #{ datetime.strftime '%d/%m-%H:%M:%S' }  #{ msg }\n"
      }
    end
mq_formatter() click to toggle source
# File lib/app-logger.rb, line 18
    def mq_formatter
      # Убираем некоторую вредность из логгера Кролика
      return proc { |severity, datetime, progname, msg|
        if msg !~ /Using TLS but/ && severity != 'DEBUG'
          msg.force_encoding('UTF-8')
          if severity == 'ERROR'
            msg += <<~BACKTACE

              Thread #{ Thread.current.inspect }
              Process #{ Process.pid }
              #{ "===BACKTACE:===\n" + caller.join("\n")  + "\n===" }
            BACKTACE
          end
          base_formatter.call(severity, datetime, progname, '(ѣ)' + msg )
        end
      }
    end
remove() click to toggle source
# File lib/app-logger.rb, line 69
def remove
  Kernel.send( :remove_const, 'Log' ) if defined?( Log )
  Kernel.send( :remove_const, 'Log' ) if defined?( MQLog )
end