【发布时间】:2016-02-06 01:32:45
【问题描述】:
为了调试,我需要获取 IO.puts 或 IO.inspect 或出现在 elixir 控制台上的任何其他类型的输出的行号。是否有内置功能?或者有没有其他简单的方法可以达到同样的效果?
P.S:IO.puts 的行号是指代码中写入 IO.puts 的行。
【问题讨论】:
标签: elixir elixir-iex
为了调试,我需要获取 IO.puts 或 IO.inspect 或出现在 elixir 控制台上的任何其他类型的输出的行号。是否有内置功能?或者有没有其他简单的方法可以达到同样的效果?
P.S:IO.puts 的行号是指代码中写入 IO.puts 的行。
【问题讨论】:
标签: elixir elixir-iex
您可能正在寻找__ENV__,它可以让您访问当前文件和行(以及其他内容)。你可以这样做:
Logger.debug("#{__ENV__.file}:#{__ENV__.line}: #{inspect some_value}")
编辑:正如 José 在 cmets 中建议的那样,更好的方法是使用 logger 的元数据功能。目前,您只能添加:module、:function 和:line 键:
# config/config.exs
config :logger, :console, metadata: [:module, :function, :line]
但是,我做了一个 PR 来添加 :file 键。它已经合并,应该与 Elixir 的下一个版本一起发布。有了新版本,你可以做到
# config/config.exs
config :logger, :console, metadata: [:file, :line]
【讨论】:
Logger 已在元数据中包含文件和行。您可以通过将文件和行添加到 logger 中的元数据配置中来将其包含在报告中。
config :logger, :console, metadata: [:module, :function, :line]
__CALLER__ 而不是__ENV__,它应该在调用宏的位置为您提供文件和行。要仅提取文件名,您可以使用Path.basename/1,但请注意,生成的输出对于不同目录中相同的 nsmed 文件将是不明确的。