gpt4 book ai didi

logging - 灵药/Phoenix : How to customize HTTP request log format?

转载 作者:行者123 更新时间:2023-12-04 11:55:59 27 4
gpt4 key购买 nike

默认情况下,我的 Phoenix 应用程序会在大约 5 行日志输出中记录有关每个 HTTP 请求的基本信息。只要我将日志级别设置为 :debug ,我可以看到每个请求的方法、路径、 Controller 和 Action 、参数、响应代码和持续时间:

2019-06-14 16:05:35.099 [info] GET /manage/projects/7qDjSk
2019-06-14 16:05:35.103 [debug] Processing with RTLWeb.Manage.ProjectController.show/2
Parameters: %{"project_uuid" => "7qDjSk"}
Pipelines: [:browser, :require_login]
2019-06-14 16:05:35.116 [info] Sent 200 in 17ms

这是一个很好的起点。但我想自定义应用程序以在一行上记录所有这些信息,这很有帮助,例如。在 Papertrail 之类的工具中筛选大量日志输出时.特别是我希望每个请求都以这样的格式显示:
[PUT /manage/projects/74/prompts/290] params=%{"project_uuid" => "74", "prompt" => %{"html" => "<div>Test question 3</div>"}, "prompt_uuid" => "290"} user=38 (Topher Hunt) status=302 redirected_to=/manage/projects/74 duration=423ms


the Phoenix.Controller docs我看到我可以为 Phoenix Controller 日志配置日志级别,或者完全禁用它,但我没有看到自定义格式的方法。我怎样才能做到这一点?

最佳答案

这不是自定义输出的问题,而是 1) 禁用与请求相关的默认日志语句(通过分离相关的 :telemetry 处理程序)然后 2)添加一个新插件来记录我想要的格式。

这是我如何做到的:

  • application.ex ,在 start/2功能,分离 Phoenix 默认为您附加的遥测处理程序。 (调用 :telemetry.list_handlers([]) 查看所有附加的听众。)

    def start(_type, _args) do
    # ...

    # vvv ADD THESE vvv
    :ok = :telemetry.detach({Phoenix.Logger, [:phoenix, :socket_connected]})
    :ok = :telemetry.detach({Phoenix.Logger, [:phoenix, :channel_joined]})
    :ok = :telemetry.detach({Phoenix.Logger, [:phoenix, :router_dispatch, :start]})

    # ...
    Supervisor.start_link(children, opts)
  • lib/my_app_web/endpoint.ex , 注释掉 Plug.Telemetry插头。
  • lib/my_app_web/endpoint.ex ,在 Plug.Session 之前添加这个自定义插件:

    # One-line request logging. Must come before the session & router plugs.
    plug MyAppWeb.RequestLogger
  • 最后添加 lib/my_app_web/plugs/request_logger.ex . (相应地调整细节;此实现假设登录的用户结构存储在 conn.assigns.current_user 中):

    # One-line full request logging inspired by Plug.Logger.
    # See https://github.com/elixir-plug/plug/blob/v1.8.0/lib/plug/logger.ex
    # Need to restart the server after updating this file.
    defmodule MyAppWeb.RequestLogger do
    require Logger

    @behaviour Plug

    def init(opts), do: opts

    def call(conn, _opts) do
    start_time = System.monotonic_time()

    Plug.Conn.register_before_send(conn, fn(conn) ->
    # We don't want passwords etc. being logged
    params = inspect(Phoenix.Logger.filter_values(conn.params))

    # Log any important session data eg. logged-in user
    user = conn.assigns[:current_user]
    user_string = if user, do: "#{user.id} (#{user.name})", else: "(none)"

    # Note redirect, if any
    redirect = Plug.Conn.get_resp_header(conn, "location")
    redirect_string = if redirect != [], do: " redirected_to=#{redirect}", else: ""

    # Calculate time taken (in ms for consistency)
    stop_time = System.monotonic_time()
    time_us = System.convert_time_unit(stop_time - start_time, :native, :microsecond)
    time_ms = div(time_us, 100) / 10

    Logger.log(:info,
    "■ method=#{conn.method} path=#{conn.request_path} params=#{params} "<>
    "user=#{user_string} status=#{conn.status}#{redirect_string} duration=#{time_ms}ms"
    )

    conn
    end)
    end
    end
  • 重启你的服务器,你现在应该看到每个请求只有一个日志行,格式如下:
  • 2019-06-09 18:18:51.410 [info] ■ [PUT /manage/projects/7qDjSk/prompts/3tUrF9] params=%{"project_uuid" => "7qDjSk", "prompt" => %{"html" => "<div>Test question 3</div>"}, "prompt_uuid" => "3tUrF9"} user=1 (Topher Hunt) status=302 redirected_to=/manage/projects/7qDjSk duration=21ms
    (注意:另一种更佳实践的方法是将 :telemetry.attach 连接到 Phoenix 已经发出的 [:phoenix, :router_dispatch, :stop] 事件。这提供了我们需要的所有数据;有关更多详细信息,请参阅 the Phoenix.Endpoint docs。)

    有用的引用:
  • https://hexdocs.pm/logger/1.8/Logger.html
  • https://github.com/elixir-plug/plug/blob/v1.8.0/lib/plug/logger.ex
  • https://www.verypossible.com/blog/thoughtful-logging-in-elixir-a-phoenix-story
  • https://til.hashrocket.com/posts/o17nfvwzbo--list-all-telemetry-event-handlers
  • 关于logging - 灵药/Phoenix : How to customize HTTP request log format?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56600637/

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