如何在Ruby中为记录器添加自定义日志级别?

14

我需要向 Ruby 日志记录器添加自定义日志级别,例如 "verbose" 或 "traffic",该怎么做?

6个回答

6
你自己的记录器只需要重写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

1
在我看来,这是一个更好的答案,因为它避免了对 Ruby 核心进行 Monkey Patching。 - sethvargo

4
你可以简单地添加到 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.')

FrozenError: 无法修改冻结的数组 - Mark Harviston
通过 https://dev59.com/2lsV5IYBdhLWcg3w6yYh 添加 unfreeze 方法,然后执行 Logger::SEV_LABEL.unfreeze - Mark Harviston

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

这样做不会很顺利(除非你想增加一个比致命级别更高的级别),因为这些数字很重要并且用于比较。 如果 @logdev 为空或者严重程度小于级别,则返回 true - undefined

2
如果你需要大量的自定义功能,那么值得一试的是 log4r,这是一个灵活的日志记录库,可以轻松地完成许多有趣/有用的事情。

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

这是使用 logging gem 的 2.0.0 版本。


1
但是如何使用内置的记录器?需要使用另一个依赖项吗? - Mark Harviston

-2

你可以通过重载Logger类来创建自己的日志记录器


@turri 我不知道有没有其他的方法,因为这些级别看起来都是编程时就固定好的(例如:Logger::INFO等)。也许还有其他方法,但我现在想不出来。 - marcgg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接