You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Phoenix中显示完整回溯?启用Phoenix.Server详细日志方法

解决Phoenix服务器KeyError时Map内容被截断的问题

我之前也遇到过这个糟心的情况——大型Map触发KeyError时,日志里的Map被截断,连对应的代码行都看不到,排查问题特别费劲。这里有几个实用的方法帮你获取更详细的输出:

方法1:修改Logger配置全局关闭截断

在开发环境的配置文件config/dev.exs里,找到Logger的配置项,调整truncate参数为:infinity(或者一个足够大的数值,比如100000),这样日志就不会截断长内容了:

config :logger, :console,
  format: "$time $metadata[$level] $message\n",
  metadata: [:request_id],
  truncate: :infinity  # 替换原来的默认截断值,比如8096

修改后重启Phoenix服务器,再触发错误时就能看到完整的Map内容和完整的回溯栈了。这个方法是全局生效的,适合整个开发过程中都需要完整日志的场景。

方法2:用IEx启动服务器查看交互式输出

直接用IEx启动Phoenix服务器,错误会在IEx控制台里输出,而且默认的截断限制会更宽松,甚至可以交互式地查看错误细节:

iex -S mix phx.server

当错误发生后,你还可以在IEx里调用相关函数查看进程状态,或者手动打印错误的完整信息,比如如果错误被捕获到变量里,用IO.inspect(error, limit: :infinity)就能看到全部内容。

方法3:在代码中临时调试输出完整Map

如果只是想针对特定代码块调试,可以在可能触发KeyError的地方,用IO.inspect打印完整的Map,记得加上limit: :infinity参数:

def your_controller_action(conn, params) do
  # 获取可能出问题的大型Map
  conn_map = some_function_that_returns_large_map()
  # 打印完整Map到控制台
  IO.inspect(conn_map, limit: :infinity, label: "Full Conn Map")
  
  # 原来的业务代码
  response = conn_map[:response]
  render(conn, "show.json", data: response)
end

或者你可以rescue KeyError异常,手动打印完整的错误详情和回溯栈:

def your_controller_action(conn, params) do
  try do
    # 原来的业务代码
    response = conn_map[:response]
    render(conn, "show.json", data: response)
  rescue
    e in KeyError ->
      # 打印完整错误信息和回溯栈
      IO.inspect(e, limit: :infinity, label: "Full KeyError Details")
      IO.inspect(__STACKTRACE__, limit: :infinity, label: "Full Stacktrace")
      # 重新抛出异常,不影响原有错误流程
      reraise e, __STACKTRACE__
  end
end

这个方法适合针对特定问题点做精准调试,不会影响全局日志的输出。

内容的提问来源于stack exchange,提问作者lapinkoira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:01:20