【问题标题】:How to get Line Numbers in Console Outputs in Elixir如何在 Elixir 的控制台输出中获取行号
【发布时间】:2016-02-06 01:32:45
【问题描述】:

为了调试,我需要获取 IO.puts 或 IO.inspect 或出现在 elixir 控制台上的任何其他类型的输出的行号。是否有内置功能?或者有没有其他简单的方法可以达到同样的效果?

P.S:IO.puts 的行号是指代码中写入 IO.puts 的行。

【问题讨论】:

    标签: elixir elixir-iex


    【解决方案1】:

    您可能正在寻找__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 中的元数据配置中来将其包含在报告中。
    • @JoséValim 你的意思是对吗? config :logger, :console, metadata: [:module, :function, :line]
    • 不幸的是,以这种方式添加文件似乎是不可能的。
    • :file 有效,但它包含完整路径。如何删除路径并仅记录文件名和扩展名?
    • AFAIK 您需要手动执行此操作,如我的第一个示例所示。您可以编写一个宏以避免重复,在那里您可以使用__CALLER__ 而不是__ENV__,它应该在调用宏的位置为您提供文件和行。要仅提取文件名,您可以使用Path.basename/1,但请注意,生成的输出对于不同目录中相同的 nsmed 文件将是不明确的。
    猜你喜欢
    • 2014-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多