[英]Why is Elixir Logger composed of Macros?
不得不在我今天的一个应用程序中使用Logger
,并记得我需要先调用require Logger
。 所以我决定查看Logger源代码 ,看看为什么debug
, info
, error
等是宏而不是简单的函数。
从代码中,用于debug
, info
等的宏(甚至它们的底层函数)看起来非常简单。 是不是可以简单地将它们导出为方法而不是宏?
从Logger代码:
defmacro log(level, chardata_or_fn, metadata \\ []) do
macro_log(level, chardata_or_fn, metadata, __CALLER__)
end
defp macro_log(level, data, metadata, caller) do
%{module: module, function: fun, file: file, line: line} = caller
caller =
compile_time_application ++
[module: module, function: form_fa(fun), file: file, line: line]
quote do
Logger.bare_log(unquote(level), unquote(data), unquote(caller) ++ unquote(metadata))
end
end
从我所看到的,将它们变成函数而不是宏是简单的。
这可能是因为__CALLER__
特殊形式,它提供有关调用上下文的信息,包括文件和行,但仅在宏中可用。
事实证明,另一个原因是,在编译期间可以剥离调用代码以获取应用程序不需要的日志记录级别。
来自ElixirForum的讨论 :
它允许代码完全不存在于您不想要的日志记录级别,因此代码永远不会被调用并且不会导致速度损失,因此您只需支付您正在主动记录的日志记录级别。
和
因此,如果您使用
:compile_time_purge_level
则可以在编译时从代码中删除整个Logger调用:compile_time_purge_level
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.