在Elixir伞应用程序中,应该将logger后端应用程序添加为依赖项?

时间:2017-09-22 15:51:24

标签: erlang elixir phoenix-framework

我有一个Elixir伞形应用程序。伞下的应用程序使用Logger。我想为<inherited>true</inherited>应用程序添加后端(logger_logstash_backend)。所以,我需要将它添加为混合文件中:logger函数的依赖项。

在伞形应用程序的最外层混合文件中,deps函数的文档说明:

  

此处列出的依赖项仅适用于此项目    并且无法从apps文件夹中的应用程序访问

这意味着我必须将后端模块添加为伞下每个应用程序的依赖项。但是,这样做会导致一些问题:

  1. 稍后将单个应用程序移出单独的库变得更加困难。

  2. 保护伞下的各个应用程序实际上并不依赖于自定义deps后端模块。他们可以使用默认的:logger后端。但我想只为prod环境增加一个后端。因此,它更多的是跨应用程序问题,我被迫将依赖项单独添加到每个应用程序。

  3. 你知道更好的策略吗?它是什么?

3 个答案:

答案 0 :(得分:1)

每个应用程序都应该有自己的依赖关系和配置。

您提到的问题:

  
      
  1. 单独移出单个应用程序变得更加困难   图书馆以后。
  2.   

如果您在每个应用程序中都有配置,这实际上可以更轻松地将各个应用程序移出伞形应用程序。正如Elixir guides中所述,您只需将应用移出apps/目录。

  
      
  1. 保护伞下的各个应用程序实际上并不依赖于自定义:记录器后端模块。默认情况下它们没问题:控制台后端。但我想只为prod环境增加一个后端。因此,更多的是跨应用程序问题,我不得不单独为每个应用程序添加依赖项。
  2.   

如果仅在生产环境中需要自定义记录器后端,则应用程序只能将此配置添加到config/prod.exs文件,并仅在prod环境中使用。

答案 1 :(得分:1)

伞形应用程序仍然具有全局配置,IIRC。这意味着,如果您在一个中进行config :logger, backends: [CustomBackend],那么您将全部配置它们。

考虑到这一点,最近我一直在使用我很满意的两种选择:

  1. 将记录器设置为全局依赖项。当所有应用程序始终使用相同的后端和配置时,我倾向于使用此功能。例如,当我使用RingLogger后端时,没有其他人。

  2. 创建一个logs应用。这取决于您如何分离应用程序,这可能是不可接受的。但是,当我想要更精细的配置时(例如,配置外部日志服务),我会这样做。通常,这会在该应用程序中抽象出额外的依赖关系和配置细节,并且不会泄露给任何其他应用程序。如有必要,我让所有其他应用程序明确依赖它。这可能看起来太麻烦但我在根应用程序中配置外部服务时遇到了一些问题。我不认为特定于服务的依赖项应该是全局依赖项。相反,将它们隐藏起来并在日志应用程序中抽象它们可以提供透明度,并允许我在必要时交换服务。

  3. 自从我自己一直在辩论以来,我实际上很好奇。

答案 2 :(得分:0)

只需在最外层的应用程序中包含依赖项即可。然后,您可以配置每个应用程序以使用新的日志记录后端。