gpt4 book ai didi

ruby-on-rails - 在 Rails 中启用自定义格式化程序

转载 作者:行者123 更新时间:2023-12-04 03:41:58 27 4
gpt4 key购买 nike

我为 Rails 编写了一个自定义格式化程序:

module Logging
class GeneralFormatter < Logger::Formatter
def call(severity, time, program_name, message)
...
end
end
end

根据 Rails guidethis answer , 我所要做的就是设置
config.log_formatter = Logging::GeneralFormatter.new
不幸的是,这似乎不起作用——我的自定义格式没有起作用。然而,如果我也定义它:
module Logging
class GeneralLogger < ActiveSupport::Logger
def initialize(*args)
super(*args)
@formatter = GeneralFormatter.new
end
end
end

那我可以做 config.logger = Logging::GeneralLogger.new并且我的日志根据需要进行格式化。

我在设置 log_formatter 时做错了什么?当我想要的只是自定义格式时,我宁愿不定义自己的 Logger。

编辑 (回应评论,并通过更多挖掘添加更多细节):

我正在设置 config.log_formatterapplication.rb并且它在开发中进行测试,它似乎在一定程度上工作,调用 Rails.logger.formatter给我我的自定义类(class)。但这是我在调用 Rails.logger.warn("test") 时看到的行为:
  • test打印到控制台(后跟换行符)。
  • 然后 call输入我的格式化程序的方法。
  • call 的返回值方法永远不会打印到控制台。

  • 我认为会发生的事情(以及我想要发生的事情是):
  • call输入我的格式化程序的方法。
  • call 的返回值方法打印到控制台。
  • 没有其他内容被打印。

  • 我是否误解了格式化程序的工作原理?

    再次编辑 (提供更清晰的示例):

    当我定义了这个:
    def call(severity, time, program_name, message)
    puts "Checkpoint 1"
    "Checkpoint 2"
    end

    并调用 Rails.logger.warn("Checkpoint 0") ,我希望看到:
    Checkpoint 1
    Checkpiont 2

    但相反,我看到:
    Checkpoint 0
    Checkpoint 1

    最佳答案

    好吧,让我们再试一次。

    我实际上没有答案 - 相反,我无法重现您的问题。我会给你我所采取的步骤和我所看到的,也许你将能够与你所做的进行比较,看看它有什么不同。

  • 你没有说你有什么版本的Rails,我是从最新的4.1.1开始的。构建了一个全新的应用程序rails new logtest .

  • ./lib/custom_formatter.rb 添加了一个文件看起来像这样:
    class CustomFormatter < Logger::Formatter
    def call(severity, time, program_name, message)
    # I think it makes no sense to have a raw `puts`
    # in a log formatter, but I'll leave it in to
    # copy you. Almost certainly a bad idea though.
    # commented out.
    puts "Checkpoint 1"
    return "Checkpoint 2"
    end
    end

    将此添加到我现有的 config/application.rb :
    require 'custom_formatter'
    config.log_formatter = CustomFormatter.new

    现在我用 rails server 启动应用程序, 并访问 http://localhost:3000/test .我希望收到一条错误消息,因为我还没有定义任何路由或 Controller 或任何东西。但由于我奇怪的自定义记录器,我希望所有日志行基本上都被“检查点 1”和“检查点 2”替换。确实发生了这样的事情。我的控制台如下所示:
      [2014-06-03 18:22:49] INFO  WEBrick 1.3.1
    [2014-06-03 18:22:49] INFO ruby 1.9.3 (2013-02-22) [x86_64-darwin12.2.1]
    [2014-06-03 18:22:49] INFO WEBrick::HTTPServer#start: pid=57113 port=3000
    Checkpoint 1
    Checkpoint 2Checkpoint 1
    Checkpoint 1
    Checkpoint 2Checkpoint 1
    Checkpoint 1
    Checkpoint 2Checkpoint 1
    Checkpoint 1
    Checkpoint 2Checkpoint 1
    Checkpoint 1
    Checkpoint 2Checkpoint 1
    Checkpoint 1
    Checkpoint 2Checkpoint 1
    Checkpoint 1
    Checkpoint 2Checkpoint 1

    我的 development.log 如下所示:
      Checkpoint 2Checkpoint 2Checkpoint 2Checkpoint 2Checkpoint 2Checkpoint 2Checkpoint 2

    很明显,自定义“格式化程序”没有做任何有用的事情——我强烈建议不要在真正的格式化程序中放置一条直线“放置”行。

    但是我的自定义格式化程序确实正在使用,所有日志行都被“格式化”为固定字符串“检查点 2”(末尾没有换行符!),并且附加的“检查点 1”也被放入标准输出。

    因此,您给出的步骤无法重现您的问题,如果我尝试按照您所说的做,我没有您的问题。所以,这确实是调试的工作方式,令人沮丧!我建议您按照我的步骤在上面创建一个测试应用程序,看看它是否也适合您。然后你必须将你的实际应用程序与那个小测试应用程序进行比较,并找出它的不同之处,以在你的实际应用程序中显示问题。一种常见的方法是复制您的实际应用程序,并开始尽可能删除所有内容,以获得仍然存在问题的最简单的应用程序。这样做的可能性是,您自己会找出问题的原因 - 但如果您不这样做,您可以将您的基本演示应用程序提供给其他试图帮助您的人,他们可能会弄清楚是什么它是造成问题的原因。

    关于ruby-on-rails - 在 Rails 中启用自定义格式化程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23974180/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com