使用Logger.Backends监视应用程序

Elixir充分利用Erlang日志记录基础结构来创建日志。 从即将发布的1.10版本开始,我们可以使用出现在Erlang / OTP 21+中的新用户记录功能。


虽然OTP提供了用于向订阅者传递日记事件(事件)的整个基础结构,但日志本身(如果被理解为存储和/或显示日记事件)应由应用程序实现。 为此, Logger.BackendLogger.Backend的相应抽象。


以下是官方文档的摘录:


Logger支持写入日志消息的各种后端。

默认情况下,可用的后端限制为一个:
  • :console将消息记录到控制台(默认情况下启用)


任何开发人员都可以像Logger的后端那样创建自己的收割区。 由于Logger是实现Erlang :gen_event行为的事件管理器,因此编写新的后端只需创建自己的事件处理程序即可,如:gen_event的文档中:gen_event

使用过的后端通过配置文件中的:backends部分加载,启动应用程序:logger之前必须对其进行处理。


催生了许多相同类型的hex.pm库的最常见方法是创建一个Logger.Backend ,它了解并吐出JSON控制台,并将某种日志传递固定到您需要的地方(通常是某种LaaS ) 。 因此,所有日志通常以NoSQL数据库结尾,例如Elastic或类似的东西。


我们不是原始的,我们也将日志存储在Elastic中 ,但是现在仅靠日志是不够的:现代时尚的男孩依附于日志中的所有消息-有关所有内容的度量。 在OTP应用程序中使用度量标准的事实上的标准最近是遥测库,这是一个相对较新的开源项目,旨在统一和标准化如何对BEAM库和应用程序进行检测控制


Telemetry采取的方法很简单,令人震惊:只要需要测量应用程序中的某些内容,我们就调用:telemetry.execute/2 ,并且库将在应用程序启动时注册回调。 另外,可以附加Telemetry.Poller并定期执行度量标准请求。 我在上面提供了链接的文章中的示例建议从内部遥测事件处理程序调用Logger.log/3


Gelato


我讨厌您必须将复制粘贴从项目拖到项目,从文件拖到文件的样板代码。 我希望编译器,调度程序和工作程序可以完成的所有工作都做到这一点,以便我什至不去考虑。 为此,我经常将样板代码打包到小的库中,这些库将所有必要的样板隐藏在引擎盖下,并提供干净的接口来执行应用程序所需的操作。 我只是想要一个可以称为report("message", payload)来创建记录,添加遥测数据并将此记录发送到我们的弹性存储库。


事实证明,这样做并非那么困难。


我们决定使用标准的Logger调用作为接口,因此只需更改配置即可将所需的功能引入现有项目。 只需将一个新的Logger.Backend添加到现有项目中即可:


 config :logger, backends: [Our.Fancy.Logger.Backend] 

-和voilà-具有遥测功能的原木现在被发送到一个弹性掩体中。


于是Gelato库就出现了。 我知道真正苛刻的,有思想的开发人员,例如库,在审美上会少一些,但是我不是真正的开发人员。 是的,您必须接受。 虽然, gelato (顺便说一句,西班牙语是冰淇淋)在弹性方面甚至略有调和。


该图书馆非常注重我如何看待正确的世界,尾巴和鬃毛使用“常规配置之上”的方法。 它将您可能需要的所有内容打包到一个JSON中,并通过一个简单的HTTP请求将其发送到预先配置的弹性服务器。 它还附加了它可以到达的所有元数据,例如使用Process.info/1获得的指标等。


要在项目中开始使用此库,您需要将以下内容添加到config/releases.exs文件中:


 config :gelato, uri: "http://127.0.0.1:9200", # Elastic API endoint events: [:foo, :bar], # attached telemetry events handler: :elastic # or :console for tests config :logger, backends: [Gelato.Logger.Backend], level: :info 

之后,任何Logger.log/3调用(如下面的调用)将通过telemetry发送并发送到已配置的弹性服务器。


 Logger.info "foo", question: "why?", answer: 42, now: System.monotonic_time(:microsecond) 

该库还提供了Gelato.bench/4宏,该宏包含一个块,并两次调用Logger.log/3 :一个是在执行该块之前,另一个是在紧随其后,通过Java中的方面类型进行。


Gelato毫不Gelato.defdelegatelog/2地坚持使用Gelato.defdelegatelog/2宏,简单的Gelato.bench/4Kernel.defdelegate/2更好地组织项目中的接口。 使用此宏,您可以将所有项目接口提取到一组有限的顶级模块中,并以开箱即用的方式记录这些调用。


Envío.Log


Logger.Backend是另一个诞生于我们技术热情的角落的Envío.Log 。 它使用Envío库将消息发送到专用的Slack通道。 该记录器具有自己的log_level设置,通常将其值设置为:warn:error ,以防止Slack信道发送垃圾邮件,并且所有低于该级别的调用都将在编译期间从BEAM中删除。


典型的配置如下所示:


 config :envio, :log, level: :warn, # do not send :info to Slack process_info: false # do not attach process info config :logger, backends: [Envio.Log.Backend], level: :debug config :envio, :backends, %{ Envio.Slack => %{ {Envio.Log.Publisher, :info} => [ hook_url: {:system, "YOUR_SLACK_CHANNEL_API_ENDPOINT"} ] } } 

配置完成后,所有对Logger.{warn,error}/2调用将被发送到相应的Slack通道。 实时监视生产中的工作过程非常方便。


祝您日志记录愉快!

Source: https://habr.com/ru/post/zh-CN482626/


All Articles