首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何让ruby logger日志输出到stdout以及文件?

如何让ruby logger日志输出到stdout以及文件?
EN

Stack Overflow用户
提问于 2011-06-20 13:30:16
回答 17查看 53.4K关注 0票数 98

有点像记录器中的T形功能。

EN

回答 17

Stack Overflow用户

发布于 2011-06-20 19:03:18

@David的解决方案非常好。我已经根据他的代码为多个目标创建了一个通用的委托类。

代码语言:javascript
复制
require 'logger'

class MultiDelegator
  def initialize(*targets)
    @targets = targets
  end

  def self.delegate(*methods)
    methods.each do |m|
      define_method(m) do |*args|
        @targets.map { |t| t.send(m, *args) }
      end
    end
    self
  end

  class <<self
    alias to new
  end
end

log_file = File.open("debug.log", "a")
log = Logger.new MultiDelegator.delegate(:write, :close).to(STDOUT, log_file)
票数 48
EN

Stack Overflow用户

发布于 2014-11-03 05:21:20

如果您使用的是Rails 3或4,就像this blog post指出的那样,使用Rails 4 has this functionality built in。所以你可以这样做:

代码语言:javascript
复制
# config/environment/production.rb
file_logger = Logger.new(Rails.root.join("log/alternative-output.log"))
config.logger.extend(ActiveSupport::Logger.broadcast(file_logger))

或者,如果你使用的是Rails 3,你可以向后移植它:

代码语言:javascript
复制
# config/initializers/alternative_output_log.rb

# backported from rails4
module ActiveSupport
  class Logger < ::Logger
    # Broadcasts logs to multiple loggers. Returns a module to be
    # `extended`'ed into other logger instances.
    def self.broadcast(logger)
      Module.new do
        define_method(:add) do |*args, &block|
          logger.add(*args, &block)
          super(*args, &block)
        end

        define_method(:<<) do |x|
          logger << x
          super(x)
        end

        define_method(:close) do
          logger.close
          super()
        end

        define_method(:progname=) do |name|
          logger.progname = name
          super(name)
        end

        define_method(:formatter=) do |formatter|
          logger.formatter = formatter
          super(formatter)
        end

        define_method(:level=) do |level|
          logger.level = level
          super(level)
        end
      end
    end
  end
end

file_logger = Logger.new(Rails.root.join("log/alternative-output.log"))
Rails.logger.extend(ActiveSupport::Logger.broadcast(file_logger))
票数 37
EN

Stack Overflow用户

发布于 2015-12-02 01:23:10

对于那些喜欢简单的人:

代码语言:javascript
复制
log = Logger.new("| tee test.log") # note the pipe ( '|' )
log.info "hi" # will log to both STDOUT and test.log

source

或在记录器格式化程序中打印消息:

代码语言:javascript
复制
log = Logger.new("test.log")
log.formatter = proc do |severity, datetime, progname, msg|
    puts msg
    msg
end
log.info "hi" # will log to both STDOUT and test.log

我实际上正在使用这种技术打印到日志文件,一个云日志服务(日志条目),如果它是开发环境-也打印到STDOUT。

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6407141

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档