gpt4 book ai didi

ruby-on-rails - 如何使用请求 id (lograge) 标记 Rails 中的每个日志调用

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

我正在使用带有 rails 的 lograge,并且我已经使用 JSON 格式配置了我的日志。我希望每次调用logger.info , logger.warn等以包含请求 uuid。 rails 使用标记日志处理这个问题的方式达不到我想要的,因为它似乎无法将请求 uuid 与 JSON 有效负载的其余部分合并,而是以非 JSON 格式将其放在行前。

例如,如果我调用 logger.info(client: :ig)我期望以下日志输出:

{"request_id": <request uuid>, "client": "ig"}

但相反,rails 会预先设置请求 uuid(通过 config.log_tags = [:uuid] 配置时),如下所示:
[<request uuid>] {"client": "ig"}

有谁知道是否有办法让标记行为与 JSON 有效负载合并,而不是在同一行之前添加它?我想将我们的日志配置为仅使用简单的 JSON 格式化程序转发到 Splunk,而不处理这种前置格式。

另外,我已将 lograge 配置为包含 request_id设置为传递给 custom_options 的 lambda 中的请求 uuid在 config/application.rb .这有效,但仅在 rails 记录请求时才有效。如果我在其他任何地方显式调用其中一种日志记录方法, request_id不包括在内。
# application.rb
config.lograge.enabled = true
config.lograge.formatter = Lograge::Formatters::Json.new
config.lograge.custom_options = lambda do |e|
{
params: e.payload[:params].except("controller", "action", "utf8"),
request_id: e.payload[:request_id] # added this in `append_info_to_payload` in ApplicationController
}
end

然后在 config/environments/production.rb
config.log_tags = [ -> (req) { { request_id: req.env["action_dispatch.request_id"] } } ]

任何帮助表示赞赏,谢谢。

最佳答案

问题是有效载荷没有 request_id。
如您所见:

./actionpack-3.2.11/lib/action_controller/metal/instrumentation.rb:18-25


raw_payload = {
:controller => self.class.name,
:action => self.action_name,
:params => request.filtered_parameters,
:format => request.format.try(:ref),
:method => request.method,
:path => (request.fullpath rescue "unknown")
}

我覆盖了这个方法(复制 ./actionpack-3.2.11/lib/action_controller/metal/instrumentation.rb in config/initializer.rb )并添加你的参数。
raw_payload = {
:controller => self.class.name,
:action => self.action_name,
:params => request.filtered_parameters,
:format => request.format.try(:ref),
:method => request.method,
:path => (request.fullpath rescue "unknown"),
:request_id => env["action_dispatch.request_id"]
}

也许有更好的方法来覆盖检测,但这已经足够了。

关于ruby-on-rails - 如何使用请求 id (lograge) 标记 Rails 中的每个日志调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29755206/

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