【问题标题】:Elixir Logger customize metadata formatElixir Logger 自定义元数据格式
【发布时间】:2021-12-18 19:16:17
【问题描述】:

在 config.exs 中,我有 config :logger, :console, metadata: [:module, :function, :line]

这会将module=Module function=my_func/1 line=41 添加到每条调试消息的开头。

相反,我想以更易于阅读的方式格式化消息:Module.my_func/1(41)

是否可以在配置格式说明符中分割出特定的元数据?在我看来,我应该能够做类似format: "$metadata[module].$metadata[function]($metadata[line])" 的事情,但这是不可能的。

【问题讨论】:

    标签: logging elixir


    【解决方案1】:

    是的,这是可能的,但我认为你必须使用:mfa metadata option

    在您的配置中:

    config :logger, :console,
      level: :debug,
      metadata: [:mfa, :line],
      format: {MyLogFormatter, :format}
    

    然后在您的自定义 MyLogFormatter 模块中,您将实现如下内容:

    def format(level, message, timestamp, metadata) do
        src =
          case Keyword.get(metadata, :mfa) do
            {m, f, a} -> "module=#{m} function=#{f}/#{a} line=#{Keyword.get(metadata, :line)}"
            _ -> nil
          end
        
        string = "#{src} #{message}"
        string <> "\n"
      end
    

    如果您希望根据级别自定义行为,您可以添加一两个子句,但在自定义此内容时要小心,因为如果出现问题,它真的会让您的应用陷入困境。

    如果使用格式化字符串调整日志格式对您有用,那就少了工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-29
      • 2021-03-25
      • 2015-05-11
      • 2019-10-29
      相关资源
      最近更新 更多