如何在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
相关产品推荐
相关产品推荐

