gpt4 book ai didi

ruby - Rails 记录器格式化 - 插入方法名称调用记录器方法

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

我想将调用记录器方法的方法的名称插入到我的日志文件中。不是整个堆栈跟踪,但类、方法和/或行号会很棒。

在任何方法中,都可以使用 caller获取一个字符串数组,每个字符串包含文件、行号和方法名称。我想出了一个使用正则表达式和 Enumerable#find 的非常糟糕的混搭尝试返回第一个非记录器堆栈帧。我想它可以工作,但是如果日志 Ruby 文件的位置在不同版本或 Rails 中发生变化,或者我将我的文件命名为与日志有关的东西,它就会中断。如果我从栈顶取一个给定的索引也是如此(我一开始这样做,然后重构了一件事,自然它给了我错误的框架)。

请注意,我不希望只记录 Controller 或操作,因为它们可以轻松检索。这主要用于 lib/ 中的内容目录。

没有简单的方法可以做到这一点吗?不想传__method__每次我做一个日志声明。

最佳答案

我已经查看了不同的解决方案,用于捕获我从 Rails 应用程序中调用任何给定记录器实例方法的确切位置(文件、行号、方法名称)。为此,您需要覆盖 Logger 的 format_message 方法,并且在您的 rails 项目的 config/environment.rb 中执行此操作是一个好地方。文件。

这就是我想出的,对我来说已经足够了;o)

class Logger
def format_message(severity, timestamp, progname, msg)
line = ''
Kernel.caller.each{|entry|
if (entry.include? Rails.root.to_s)
line = " #{entry.gsub(Rails.root.to_s,'').gsub(/\/(.+)\:in `(.+)'/, "\\1 -> \\2")}"
break
end
}
"[#{timestamp.strftime("%Y%m%d.%H:%M:%S")}] #{severity}#{line}: #{msg}\n"
end
end
Kernel.caller持有整个回溯的可枚举数组。如果您完整地查看它,您会发现大多数调用都在 gem 内部,位于您项目之外的某个地方。我发现通过循环遍历 Kernel.caller直到我找到第一个包含我的 Rails.root 的地方,我可以得到包含我想要解析的信息的行。

示例:
如果我打电话 Rails.logger.debug("Streamer class started!")从我的 Streamer 类的 start 方法中,原始条目将如下所示:
/Users/chikoon/www/my_rails_app/lib/streamer.rb:7:in `start'

所以当它通过我的格式化程序时,我已经得到了时间戳、严重性模式、文件路径、行号、方法名称和消息:
[20140919.19:23:44] DEBUG lib/streamer.rb:7 -> start: Streamer class started!

我希望这有助于让你的车轮转动。

关于ruby - Rails 记录器格式化 - 插入方法名称调用记录器方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18778014/

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