首页 > 解决方案 > clojure 中的惯用日志记录

问题描述

我是 clojure 的新手,想了解登录 clojure 的方法,来自命令式背景。在 java 生产程序中,我通常会在方法的开始端记录(调试/信息) ,如下所示:

public void foo(){
   logger.debug("starting method to embrace %s", rightIdioms);
   doSomething();
   logger.debug("successfully embraced %s idioms", idioms.length);
}

我熟悉日志记录的优缺点,并且知道clojure中可用的工具,

我还可以在上面提到的方法中找到一些登录的弊端,这加深了我在非命令式登录时的紧张感:

  1. 日志记录是一种副作用,而 clojure 推动无副作用。
  2. 更多代码行或“代码复杂性”:在 java 中 - 拥有大类很常见(getter、setter、构造函数),在 clojure 中,表达式返回值,记录“困难”进程并强化小函数和命名空间:(一个示例是需要从 if 更改为 if-let 或 if-do 以执行日志记录):

    (defn foo [x]
      (if (neg? x)
        (inc x)
        x))
    
    (defn foo [x]
      (if (neg? x)
        (let [new-x (inc x)] 
          (logger/debug (format "inc value, now %s" new-x)
          new-x))
        x))
    

我已经阅读了日志记录,clojure/taptracing不确定我是否完全发现它很有用。

登录clojure的方法或惯用方式是什么?

标签: loggingclojurefunctional-programming

解决方案


这篇博文中几乎没有给出最佳实践,它建议记录数据而不是字符串可能非常有用,并且适合 clojure 风格的日志记录。日志事件可能是这样的:

{:service     :user.profile/update
 :level       :debug
 :time        "2020-01-01"
 :description {:before '0
               :after  '1}
 :metric       10ms}

metric 可以是任何东西,从更新时间到从数据库中提取的行数。

然后,当您拥有数据时,您可以对它做任何事情 - 分析它以获得洞察力或分组搜索和查找。如果需要控制台日志记录,您始终可以将数据结构转回字符串。


推荐阅读