Elixir Logger 自定义元数据格式
Elixir Logger customize metadata format
在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])"
的事情,但这是不可能的。
是的,这是可能的,但我认为你必须使用 :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
如果您想要根据级别自定义行为,您可以添加一两个子句,但在自定义时要小心,因为如果出现问题,它确实会限制您的应用程序。
如果使用格式字符串调整日志格式对您有用,那工作量就少了。
在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])"
的事情,但这是不可能的。
是的,这是可能的,但我认为你必须使用 :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
如果您想要根据级别自定义行为,您可以添加一两个子句,但在自定义时要小心,因为如果出现问题,它确实会限制您的应用程序。
如果使用格式字符串调整日志格式对您有用,那工作量就少了。