在 Rails 中启用自定义格式化程序

2024-02-25

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

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

并根据导轨导轨 http://guides.rubyonrails.org/configuring.html and 这个答案 https://stackoverflow.com/a/22382634/1103543,我所要做的就是使用它

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?当我想要的只是自定义格式时,我宁愿不定义自己的记录器。


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

我正在设置config.log_formatter in application.rb它正在开发中进行测试,并且似乎正在发挥作用在一定程度上,在那个召唤中Rails.logger.formatter给我我的定制课程。但这是我在打电话时看到的行为Rails.logger.warn("test"):

  1. test被打印到控制台(后跟换行符)。
  2. Then the call输入我的格式化程序的方法。
  3. 返回值call方法永远不会打印到控制台。

我认为会发生的事情(以及我想要发生的事情是):

  1. The call输入我的格式化程序的方法。
  2. 返回值call方法打印到控制台。
  3. 没有打印任何其他内容。

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


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

当我定义了这个:

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。我希望收到一条错误消息,因为我还没有定义任何路由或控制器或任何东西。但由于我奇怪的自定义记录器,我希望所有日志行基本上都被“检查点 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

我的开发日志如下所示:

  Checkpoint 2Checkpoint 2Checkpoint 2Checkpoint 2Checkpoint 2Checkpoint 2Checkpoint 2

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

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

所以你的问题不能通过你给出的步骤重现,如果我尝试做你所说的事情,我就不会遇到你的问题。所以,这确实是调试的工作原理,令人沮丧!我建议您按照我的步骤创建上面的测试应用程序,看看它是否也适合您。然后,您必须将实际应用程序与那个小测试应用程序进行比较,找出它的不同之处,以在实际应用程序中体现问题。一种常见的方法是制作实际应用程序的副本,然后开始剥离所有可能的内容,以获得仍然存在问题的尽可能少的应用程序。这样做的可能性是,您会自己找出问题的原因 - 但如果您不这样做,您可以将您的基本演示应用程序提供给其他试图帮助您的人,他们也许可以找出问题所在这是造成问题的原因。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Rails 中启用自定义格式化程序 的相关文章

  • 默认更新嵌套属性

    我尝试更新 iProduction 这是生产中的嵌套表单 但此行出现参数错误 参数数量错误 0 代表 1 生产 update iproducts attributes cow id cow 我的创作动作制作 def create produ
  • 每当 gem 仅在一台机器上有 cronjob 时?

    我们大规模部署了大约十几台服务器 我们想使用每当 gem 但我无法找到一种方法来说明 cron 作业应该在哪台机器上进行 我们只希望这些作业在执行后台作业的服务器上运行 有没有办法指定这一点 如果您使用 Capistrano 部署项目并使用
  • 在 Rails ActiveAdmin 视图中添加指向 Flash 通知的链接

    我正在尝试在活动管理控制器成功创建操作的闪存消息中添加链接 但是该链接的 HTML 被转义并在视图上显示为纯文本 Rails 5 2 1 ruby 2 5 3p105 2018 10 18 修订版 65156 x86 64 linux 例如
  • 使用 Devise 和 Rails 从 Twitter Oauth 获取电子邮件

    我已经设置了一个基本的 Rails 应用程序来使用 twitter oauth gem 和设计 并且已经能够登录用户 但是 我的问题是我现在已将我的应用程序列入白名单 并且我想在响应中收到用户的电子邮件 我已遵循 Twitter 端的所有必
  • Rails 中的 plusDomains.circles.addPeople 的 Google API 产生 403 Forbidden

    Using Google API Ruby 客户端 https github com google google api ruby client class GooglePlus def self follow contact contac
  • Rails 应用程序在模型间保存方面遇到问题

    我正在开发一个从网站下载元标签并然后保存的应用程序 下载发生在一个名为Site 我想将下载的机器人元标签保存到一个名为的模型中robots tag它通过一个名为的连接表连接到站点meta tag sites 但是我在站点模型中编写的用于执行
  • 在部分渲染时执行 JavaScript

    我有一些 JavaScript 代码 我想在用户单击其文件夹之一后执行 它会触发 show 操作和 show js erb 从而呈 现部分内容 Show js erb 当用户单击其文件夹之一时触发 如下所示 body append 它成功注
  • ActiveRecord 布尔验证接受非布尔值

    我正在尝试验证属性是否为布尔值 即 true 或 false 从我期望的 Rails 指南中 validates new out of stock inclusion in true false 可以工作 但它接受非布尔值 例如 Hi 作为
  • Rails 7 缺失部分

    我正在升级到 Rails 7 1 并在使用 JS 部分的视图中遇到奇怪的错误 缺少部分 account stripe js erb application stripe js erb 与 locale gt fr formats gt ht
  • 多租户 Rails 应用:不同技术的优缺点是什么?

    我最初是为一位客户编写 Ruby on Rails 应用程序的 现在 我正在更改它 以便它可以用于不同的客户 我的最终目标是某些用户 不是我 可以单击按钮并创建一个新项目 然后生成所有必要的更改 新架构 新表 代码处理 无需任何人需要我编辑
  • 如何在 Rails 中将随机日期时间四舍五入到小时开始?

    基本上我想获得去年内的随机日期时间 rand 1 year ago gt Sun 22 Sep 2013 18 37 44 UTC 00 00 example 但是我该如何指定或限制这个时间呢 例如 Sun 22 Sep 2013 18 0
  • 如何在 Rails 3 项目中包含 SSL 证书

    我开发了一个 Rails 3 项目 它使用thin作为服务器 与 Devise 和 Doorkeeper 一起进行身份验证 我想在我的项目中添加 SSL 证书 我看过一些描述如何在 Rails 3 项目中使用 SSL 证书的帖子 但没有一个
  • “gem install Rails”因 DNS 错误而失败

    rvm use Using home owner rvm gems ruby 2 1 2 gem install rails ERROR While executing gem Gem RemoteFetcher FetchError Er
  • 使用 Capistrano 无法开始延迟的作业

    我无法使用 capistrano 配方启动延迟的作业流程 这是我收到的错误 usr local lib ruby gems 1 9 1 gems delayed job 2 1 1 lib delayed command rb 62 in
  • 如何制作可选的强参数键但过滤嵌套参数?

    我的控制器中有这个 params require item permit 让我们假设这个 rspec 规范 它按预期工作 put update id item id item name new name 然而 以下原因ActionContr
  • 基于数据库的动态Rails路由

    我正在使用 Rails 2 3 构建一个包含各种模块 博客 日历等 的 CMS 每个模块都由不同的控制器处理 并且工作得很好 我遇到的唯一问题是根 URL 根据用户选择的配置 此默认 URL 应显示不同的模块 即不同的控制器 但我必须确定正
  • pg gem Trace/BPT 陷阱:MAC OS X lion 上出现 5 错误

    我最近将我的雪豹升级为狮子 在我的一个应用程序中我得到了 gt Booting WEBrick gt Rails 3 0 4 application starting in development on http 0 0 0 0 4000
  • 在 SCSS 部分中使用 Rails 3.1 资源路径

    我有以下设置 app assets stylesheets application css scss require self require fancybox COLORS MIXINS FONT STACKS IMPORTS impor
  • 使用 Devise 嵌套资源 - Rails3

    我正在尝试设置一个配置文件控制器来与设备注册成员一起使用 我已经创建了Profile模型和控制器并添加了one to one relationship通过增加belongs to member to my 配置文件 rb模型和has one
  • Rails 没有选择 en.yml 中的自定义日期和时间格式

    我对 Rails 中的 I18N 不太熟悉 所以请耐心等待 尝试设置自定义日期和时间格式 config locales en yml en date formats long dateweek A B d Y time formats ve

随机推荐

  • 转发不同类型的事件

    我正在尝试将事件从一个类转发到其中包含的对象 如下所述 在 C 中转发事件 https stackoverflow com questions 1065355 forwarding events in c sharp 然而 事件的类型不同
  • R 中带有 tm 包的计数器 ngram

    我使用 R 中的对象和字典 documentTermMatrix 创建了一个用于记录文档中单词频率的脚本 该脚本适用于单个单词 而不适用于复合词 es 富 酒吧 富酒吧 这是代码 require tm my docs lt c foo ba
  • 如何使用SQLPlus查看Oracle存储过程?

    如何使用 sqlplus for Oracle 10g 查看存储过程的代码 当我输入 desc daily update 它向我显示了参数 但是当我尝试执行以下操作时 select from all source where name da
  • (a != b) 和 (a != (a = b) 之间有什么区别?

    In a 最近的问题 https stackoverflow com questions 48319047 why concurrentlinkedqueue source code use to check for tail 483192
  • 错误:元素 下的元素 无法识别

    使用 msbuild 构建解决方案时收到此错误 The element
  • 无法对已卸载的组件调用 setState(或forceUpdate)。这是一个空操作,但它表明您的应用程序中存在内存泄漏

    为什么我会收到此错误 警告 无法在未安装的状态下调用 setState 或forceUpdate 成分 这是一个空操作 但它表明您的内存泄漏 应用 要修复此问题 请取消所有订阅和异步任务 在 componentWillUnmount 方法中
  • 单击 Google 登录按钮后应用程序关闭

    我试图将谷歌登录集成到我的应用程序中 当我单击按钮时 应用程序将关闭 而不是崩溃 我在这里犯了什么错误 我尽力遵循谷歌开发者网站告诉我的内容 我提前为冗长的代码表示歉意 我的Java代码 import static com google a
  • CSS:“内联块”元素的意外垂直位置

    请考虑以下 HTML 代码
  • 具有多个 OR 条件的 Countif

    我需要计算列中包含特定值的单元格数量 我目前正在使用以下代码 iVal Application WorksheetFunction COUNTIF Range A A SAL 但是 我现在需要计算有多少个单元格包含其中之一 SAL or P
  • HttpClient.execute 抛出 OutOfMemoryError

    我有一个 Android 应用程序可以发布JSONObject作为一个实体 使用ByteArrayEntity目的 这是它的样子 post setEntity new ByteArrayEntity entity getBytes UTF
  • 多线程排序算法

    我必须在 Java 中为我的算法类实现多线程合并排序和快速排序 并将它们与我的单线程版本进行比较 不过 我以前从未使用过多线程 我的代码可以是多线程的还是必须重新开始 这是我的单线程算法代码 归并排序 sort 方法是我必须实现的策略模式的
  • 如何在 R 中绘制多个堆叠直方图?

    我对 R 非常陌生 今天才开始使用它 我试图在彼此之上绘制多个直方图 我遇到过一些关于如何在彼此之上绘制两个直方图的帖子 但没有找到任何解释如何执行多个直方图的帖子 具体来说 对于我的示例 5 我想绘制 5 个值的堆积直方图 a lt c
  • 使用 Javascript 函数启动下载

    我有多个网址供用户下载 下载应该在他们点击 赞 或发布 推文 后触发 我已经成功地为两者设置了回调函数 我想知道如何使用 Javascript 以便同时触发多个下载 一种解决方案是使用window location 但这只会触发单个下载 我
  • Tkinter:为什么 lambda 函数允许我在命令参数中使用参数?

    我想了解下面发生了什么 我明白我们不能使用arg当我调用该函数时command因为这意味着此时正在执行的函数 但我不明白lambda part 考虑这段代码 command lambda x x 2 它本质上做的是同样的事情 def som
  • Python ConfigParser,键中带有冒号

    如何在 python configparser 中的值中添加分号 https stackoverflow com questions 4298073 how do i put a semicolon in a value in python
  • 响应式设计像素与百分比

    我希望有人能提供帮助 我最近在一个知名网站上观看了有关响应式网页设计的视频 我对导师采取的方法感到困惑 他基本上创建了三个样式表 大 中 小 在每个样式表中 他给出了 DIVS 的 PX 宽度 并在必要时交换图像 当然 这种方法是有缺陷的
  • 尝试使用 Jersey 创建 Restful WebService 时出错

    我正在关注this http www vogella com articles REST article html first创建 CRUD RESTful WebService 的教程 这种类型的 WebService 的教程从第 7 段
  • 找不到 css 文件 - ASP.NET Core Web 应用程序

    我已经创建了一个 asp net core Web 应用程序 我从 空 选项开始 并且正在逐步构建它 看来我的 css 文件没有被读取或找到 当我启动应用程序时 我可以看到我的 html 页面看起来不正常 当我在控制台下的 Edge 中使用
  • Rails 使用哪些测试框架? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 Rails 使用哪些单元测试框架 我正在阅读这本书 Pragmatic Programmers Agile Dev with Rails 它展示
  • 在 Rails 中启用自定义格式化程序

    我为 Rails 编写了一个自定义格式化程序 module Logging class GeneralFormatter lt Logger Formatter def call severity time program name mes