How to add a custom log level to logger in ruby?

2019-02-16 12:11发布

I need to add a custom log level like "verbose" or "traffic" to ruby logger, how to do?

标签: ruby logging
6条回答
Luminary・发光体
2楼-- · 2019-02-16 12:24

If you start needing a bunch of custom stuff, it may be worth checking out log4r, which is a flexible logging library that lets you do a bunch of interesting/useful stuff easily.

查看更多
Lonely孤独者°
3楼-- · 2019-02-16 12:25

You can create your own logger by overloading the Logger class

查看更多
Explosion°爆炸
4楼-- · 2019-02-16 12:27

This is an old question, but since it comes up so high on google, I figured it'd be useful to have to correct answer. You can actually use the Logging.init method. Here's how you would add a trace log level

require 'logging'
Logging.init %w(trace debug info warn error fatal)
Logging.logger.root.level = :trace
Logging.logger.root.add_appenders Logging.appenders.stdout
Logging.logger['hello'].trace 'TEST'

This is using the 2.0.0 of the logging gem.

查看更多
Viruses.
5楼-- · 2019-02-16 12:37

Your own logger just need to overwrite the Logger#format_severity method, something like this :

class MyLogger < Logger

  SEVS = %w(DEBUG INFO WARN ERROR FATAL VERBOSE TRAFFIC)
  def format_severity(severity)
    SEVS[severity] || 'ANY'
  end

  def verbose(progname = nil, &block)
    add(5, nil, progname, &block)
  end
end
查看更多
手持菜刀,她持情操
6楼-- · 2019-02-16 12:42

You can simply add to the Logger class:

require 'logger'

class Logger
  def self.custom_level(tag)
    SEV_LABEL << tag 
    idx = SEV_LABEL.size - 1 

    define_method(tag.downcase.gsub(/\W+/, '_').to_sym) do |progname, &block|
      add(idx, nil, progname, &block)
    end 
  end 

  # now add levels like this:

  custom_level 'TRAFFIC'
  custom_level 'ANOTHER-TAG'
end


# using it:

log = Logger.new($stdout)
log.traffic('testing')
log.another_tag('another message here.')
查看更多
疯言疯语
7楼-- · 2019-02-16 12:47

Log levels are nothing but integer constants defined in logger.rb:

# Logging severity.
module Severity
  DEBUG = 0
  INFO = 1
  WARN = 2
  ERROR = 3
  FATAL = 4
  UNKNOWN = 5
end

You can log messages with any level you like using Logger#add method:

l.add 6, 'asd'
#=> A, [2010-02-17T16:25:47.763708 #14962]   ANY -- : asd
查看更多
登录 后发表回答