Elixir记录器后端:系统如何调用init()?

时间:2019-06-28 16:40:25

标签: logging elixir backend

我正在编写自定义记录器后端。我查看了其他后端,例如:控制台,LoggerFileBackend,Timber.LoggerBackends.HTTP,Logger.Backends.Gelf。

其中一些,例如:console和Timber.LoggerBackends.HTTP的初始化为{__MODULE__, options}。其他一些对象,例如LoggerFileBackend和Logger.Backends.Gelf都使用{__MODULE__, name}进行了初始化。

问题:系统如何正确知道并调用init(...)作为后端? 谢谢, 琳。

1 个答案:

答案 0 :(得分:2)

我知道发生了什么事。 我们在配置文件中配置backends的方式将决定如何将参数传递给后端的初始化。

例如:

config :logger,
    backends: [:console ,{LoggerFileBackend, :app_log}, Timber.LoggerBackends.HTTP]

然后系统将按以下方式调用init:

# for console, it will call:
init(:console)

# for LoggerFileBackend, it will call with name set to ":app_log"
init({__MODULE__, name})

# for Timber.LoggerBackends.HTTP, it will call with options omitted
init(__MODULE__, options \\ [])