【问题标题】:In Elixir umbrella app, where should logger backend app be added as a dependency?在 Elixir 伞形应用程序中,应该在哪里添加记录器后端应用程序作为依赖项?
【发布时间】:2018-03-04 06:20:36
【问题描述】:

我有一个 Elixir 伞形应用程序。伞下的应用程序使用Logger。我想为:logger 应用程序添加一个后端(logger_logstash_backend)。所以,我需要把它作为一个依赖添加到 mix 文件中的 deps 函数中。

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

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

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

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

  2. 伞下的各个应用程序实际上并不依赖于自定义:logger 后端模块。他们可以使用默认的:console 后端。但我只想为 prod 环境提供一个额外的后端。因此,我不得不将依赖项单独添加到每个应用程序中,这更像是一个跨应用程序的问题。

你知道更好的策略吗?这是什么?

【问题讨论】:

    标签: erlang elixir phoenix-framework


    【解决方案1】:

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

    【讨论】:

    • "配置每个应用程序以使用新的日志记录后端"
    【解决方案2】:

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

    你提到的问题:

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

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

    1. 伞下的各个应用程序实际上并不依赖于自定义的 :logger 后端模块。他们可以使用默认的 :console 后端。但我只想为 prod 环境提供一个额外的后端。因此,我不得不将依赖项单独添加到每个应用程序中,这更像是一个跨应用程序问题。

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

    【讨论】:

    • 日志记录是一个跨应用程序的问题。如果我们在伞下创建一个应用程序依赖于特定的记录器后端,那么以后如何轻松地将应用程序移出?该应用程序不依赖于记录器来运行。
    • 在您的示例中,应用程序确实依赖于记录器后端,但在生产环境中。您应该可以将应用程序移出伞形应用程序,并且仍然可以使用MIX_ENV=prod 运行该应用程序。这就是为什么将依赖项和配置保留在每个应用程序中以便以后更容易将它们移出的原因。
    • 保护伞下的一两个应用程序可能会被移出,它们不需要记录器后端。在这种情况下,在每个单独的应用程序中保持对 logger 后端的依赖会导致很难移出。
    • 即使您将这些应用程序移出保护伞,您仍将在 prod 环境中运行它们,并且需要此后端 - 因此您需要将依赖项保留在各个应用程序中。如果您在移出特定应用程序后不需要该后端,只需删除该依赖项并更新应用程序内部的配置,现在不再需要此自定义后端即可。
    • 我知道这是旧的,但也许你想要移出的(核心)应用程序可以是最小的,只需调用 Logger.debug 左右,其他依赖于该核心的应用程序也应该配置一个 -她需要的自定义记录器,在她自己的配置文件中。那不应该记录一切吗?
    【解决方案3】:

    Umbrella 应用仍然具有全局配置,IIRC。这意味着,如果您将config :logger, backends: [CustomBackend] 合二为一,您将为它们进行全部配置。

    考虑到这一点,最近我一直在使用两种我很满意的替代方案:

    1. 将记录器设置为全局依赖项。当所有应用程序总是使用相同的后端和配置时,我倾向于使用它。例如,当我使用 RingLogger 后端而不使用其他后端时。

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

    其实我很好奇这个问题,因为我自己一直在讨论这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 2018-03-19
      • 2015-12-25
      • 1970-01-01
      • 2015-08-26
      相关资源
      最近更新 更多