问题 如何在ruby中为logger添加自定义日志级别?


我需要为ruby logger添加一个自定义日志级别,如“详细”或“流量”,该怎么办?


9598
2018-02-17 14:37


起源



答案:


您只需添加到Logger类:

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.')

5
2018-02-18 22:13



结果是 FrozenError: can't modify frozen Array - Mark Harviston
添加 unfreeze 方法通过 stackoverflow.com/questions/35633367/... 然后 Logger::SEV_LABEL.unfreeze - Mark Harviston


答案:


您只需添加到Logger类:

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.')

5
2018-02-18 22:13



结果是 FrozenError: can't modify frozen Array - Mark Harviston
添加 unfreeze 方法通过 stackoverflow.com/questions/35633367/... 然后 Logger::SEV_LABEL.unfreeze - Mark Harviston


你自己的记录器只需要覆盖 Logger#format_severity 方法,像这样:

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

4
2018-02-17 16:30



IMO,这是一个更好的答案,因为它避免了Ruby核心的猴子修补。 + - sethvargo


日志级别只是定义的整数常量 logger.rb

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

您可以使用您喜欢的任何级别记录消息 Logger#add 方法:

l.add 6, 'asd'
#=> A, [2010-02-17T16:25:47.763708 #14962]   ANY -- : asd

3
2018-02-17 15:33





如果你开始需要一堆自定义的东西,可能值得一试 log4r的,这是一个灵活的日志库,可以让你轻松地做一堆有趣/有用的东西。


2
2018-03-21 06:24





您可以通过重载来创建自己的记录器 记录器类


-1
2018-02-17 14:48



没有写很多代码就没有简单的方法吗? - turri
@turri不是我所知道的。看起来级别几乎都是编码的(Logger :: INFO等等)。也许还有另一种方式,但我现在想不到它 - marcgg


这是一个老问题,但由于它在谷歌上如此之高,我认为必须纠正答案是有用的。你实际上可以使用 Logging.init 方法。这是你如何添加一个 trace 日志级别

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'

这是使用 2.0.0 的 logging 宝石。


-1
2017-07-10 22:20



但是如何使用内置记录器?是否正在使用另一种依赖? - Mark Harviston