Rails日志记录器格式字符串配置

16

我该如何配置Rails日志记录器以输出另一种格式的日志字符串?我希望获得更多信息的内容,例如:

[日志级别] [时间] [消息]

调试:01-20-2008 13:11:03.00:方法已调用

当我想要查看只来自特定日志级别(如调试)的消息时,这将非常有帮助。


为什么不使用Log4r?https://dev59.com/DG035IYBdhLWcg3wBLbb - Siwei
4个回答

24

我进行了一些调查,并找到了RubyOnRails Talk谷歌组中的这篇文章。

所以我稍微修改了一下,并将其放置在我的environment.rb文件的末尾:

module ActiveSupport
  class BufferedLogger
    def add(severity, message = nil, progname = nil, &block)
      return if @level > severity
      message = (message || (block && block.call) || progname).to_s

      level = {
        0 => "DEBUG",
        1 => "INFO",
        2 => "WARN",
        3 => "ERROR",
        4 => "FATAL"
      }[severity] || "U"

      message = "[%s: %s #%d] %s" % [level,
                                     Time.now.strftime("%m%d %H:%M:%S"),
                                     $$,
                                     message]

      message = "#{message}\n" unless message[-1] == ?\n
      buffer << message
      auto_flush
      message
    end
  end
end

这将导致一个格式字符串,例如:

[DEBUG: 0121 10:35:26 #57078] 渲染布局/_header (0.00089)


只是补充一下:将此补丁添加到应用程序的更清晰的方法是将代码放在初始化器中。只需创建一个名为monkey_patching_logger_to_write_date_time.rb的文件,并将其添加到config / initializers目录中,然后重新启动应用程序即可。 - Pascal Van Hecke
1
我在我的初始化器中有这个 - 在3.1中有效,但在3.2中无效 - 推测日志记录现在已经改变了。 - Chris Kimpton
11
在3.2版本中,Rails开始使用ActiveSupport::TaggedLogger。你可以在environment.rb文件中设置config.log_tags来指定要使用的前缀(例如,config.log_tags = [:uuid,:remote_ip,Time.now])。但是我还没有弄清楚如何包含日志级别。 - gmcnaughton
在 Rails 3.2.3 中,类中抛出 *** 异常 NameError(未定义的本地变量或方法 `buffer' for #ActiveSupport::BufferedLogger:0x11032fb20),进程为 13047,线程为 #Thread:0x10d689260。 - okliv
对于高性能环境,我建议在strftime调用中添加%L以表示毫秒。 - Sim
这个能在Rails4上运行吗?我很惊讶默认日志记录不容易自定义。 - Tom Rossi

2
# config/initializers/rack_logger.rb
module Rails
  module Rack
    class Logger < ActiveSupport::LogSubscriber
      # Add UserAgent
      def started_request_message(request)
         'Started %s "%s" for %s at %s by %s' % [
          request.request_method,
          request.filtered_path,
          request.ip,
          Time.now.to_default_s,
          request.env['HTTP_USER_AGENT'] ]
      end
    end
  end
end

源链接


2
对于 Rails 4 应用程序,我已经编写了一个简单的 gem,不仅添加了基本标签支持(如时间戳和日志级别),甚至还为日志消息本身添加了颜色。 https://github.com/phallguy/shog

1
标签的问题在于它们会使日志变得混乱,以至于无法阅读。
我建议使用类似 timber 的工具。它可以自动增加上下文信息(级别、时间、会话 ID 等),而不会影响可读性。

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