【问题标题】:Can I disable the log header for ruby logger?我可以禁用 ruby​​ 记录器的日志头吗?
【发布时间】:2010-11-04 11:51:02
【问题描述】:

我目前遇到了一些问题。

您可能知道,ruby 记录器会在每个新创建的日志文件的顶部添加一个日志记录头。

"# Logfile created on %s by %s\n" % [Time.now.to_s, Logger::ProgName]

我正在记录 CSV 文件以便稍后将它们导入仓库,通常我只是跳过带有标题的第一行。记录器中似乎存在错误,因为有时记录头会出现不止一次,就在日志文件的中间。

所以我决定简单地忽略该标题。令我惊讶的是,我没有发现任何可以在创建记录器时传递的论点。我想到了这样的事情:

Logger.new "info.log", :skip_header => true

但它只是不存在。我在 ruby​​ 核心资源中进行了搜索,令人惊讶的是,确实没有什么可以阻止记录器添加日志标题:

def create_logfile(filename)
  logdev = open(filename, (File::WRONLY | File::APPEND | File::CREAT))
  logdev.sync = true
  add_log_header(logdev)
  logdev
end

def add_log_header(file)
  file.write(
    "# Logfile created on %s by %s\n" % [Time.now.to_s, Logger::ProgName]
)
end

有谁知道我能做些什么来阻止日志标题?我在这里使用 Ruby 1.8.7 302 和 Rails 2.3.5。简单地忽略仓库端的 cmets 是不可能的,因为我无法控制那里的代码,而且如果日志行出现问题,简单地忽略它似乎是有风险的。

有人知道允许这样做的记录器吗?您认为使用普通文件并将其写入文件是个好主意吗?

提前致谢, 汤米

【问题讨论】:

    标签: ruby header logging


    【解决方案1】:

    理想情况下,应该覆盖 Logger 实例上的 add_log_header 方法,但由于 add_log_header 是在初始化时调用的,所以当你开始使用它时为时已晚。 好吧,你可以直接覆盖 Class 的 add_log_header 方法。

    class Logger::LogDevice
      def add_log_header(file)
      end
    end
    
    log1 = Logger.new('info1.log')
    

    但是,如果您的应用在此之后需要更多 Logger 实例,它们的行为将相同:没有标头。为了防止这种情况:

    # dismantle the header and save it under another name
    class Logger::LogDevice
      alias orig_add_log_header add_log_header
    
      def add_log_header(file)
      end
    end
    
    # Quick,create an instance 
    log1 = Logger.new('test_log1file.log')
    
    # restore the old method:
    class Logger::LogDevice  
      alias add_log_header orig_add_log_header 
    end
    

    【讨论】:

    • 太好了,谢谢!没有想到“猴子修补”记录器,因为它被认为是脏的。但是使用您的方法,之前和之后的调用没有任何变化。太好了!
    【解决方案2】:

    这是一个涉及子类化Logger 的解决方案。我们必须对initializesuper 进行偷偷摸摸,以防止它过早地创建标准Logger::LogDevice

    class HeadlessLogger < Logger
      def initialize(logdev, shift_age = 0, shift_size = 1048576)
        super(nil) # this prevents it from initializing a LogDevice
        if logdev
          @logdev = HeadlessLogger::LogDevice.new(logdev, shift_age: shift_age, shift_size: shift_size)
        end
      end
    
      class LogDevice < ::Logger::LogDevice
        def add_log_header(file) ; end
      end
    end
    

    【讨论】:

      【解决方案3】:

      作为修补记录器类的替代方法,只是不要让它通过预先触摸它来创建日志文件:

      FileUtils.touch logfile_path
      Logger.new logfile_path
      

      在普通的 Ruby 中,你显然需要从 stdlib 中 require 'fileutils'

      编辑: 如果您使用内置的 logrotation,或者文件被删除,这将不起作用,因为没有 on-rotate 钩子,然后它将再次写入标题。

      【讨论】:

        猜你喜欢
        • 2017-01-31
        • 1970-01-01
        • 2011-01-08
        • 1970-01-01
        • 1970-01-01
        • 2011-01-05
        • 1970-01-01
        • 1970-01-01
        • 2021-10-18
        相关资源
        最近更新 更多