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

时间:2010-02-17 14:37:53

标签: ruby logging

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

6 个答案:

答案 0 :(得分:5)

您只需添加到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.')

答案 1 :(得分:4)

您自己的记录器只需要覆盖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

答案 2 :(得分:3)

日志级别只是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 :(得分:2)

如果你开始需要大量的自定义内容,可能需要查看log4r,这是一个灵活的日志库,可以让你轻松地做一些有趣/有用的东西。

答案 4 :(得分:-1)

这是一个老问题,但由于它在谷歌上如此之高,我认为必须纠正答案才有用。您实际上可以使用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 gem的logging

答案 5 :(得分:-2)

您可以通过重载Logger class

来创建自己的记录器