如何抑制ANSI着色ring.middleware.logger放入我的日志?

时间:2016-03-25 22:59:40

标签: clojure ring

我继承了一个项目,该项目通过project.clj中的[ring.middleware.logger "0.5.0" :exclusions [org.slf4j/slf4j-log4j12]]获得了一些日志魔法。随着中间件的设置ring.middleware.logger/wrap-with-logger进来,这让我对每个请求都有一些不错的记录,比如......

2016-03-25 15:46:03,787 a939 level=INFO [qtp509784188-34] core:288 - Starting :delete /v4/events/c.c.t.p.v4.api-a9c6d846-1da5-4593-a711-18d90aa8490f/test-layer/2015-05-31T00:00:00.000Z for 127.0.0.1 {"host" "localhost:50654", "user-agent" "Apache-HttpClient/4.3.6 (java 1.5)", "accept-encoding" "gzip, deflate", "connection" "close"}
2016-03-25 15:46:03,788 a939 level=INFO [qtp509784188-34] core:288 -   \ - - - -  Params: {}
2016-03-25 15:46:03,794 a939 level=INFO [qtp509784188-34] core:288 - Finished :delete /v4/events/c.c.t.p.v4.api-a9c6d846-1da5-4593-a711-18d90aa8490f/test-layer/2015-05-31T00:00:00.000Z for 127.0.0.1 in (6 ms) Status: 404

...问题是此日志记录中的某些字段是ANSI着色的。有一个请求id就像它的" a939"字段,以及" Starting"," Finished"和" Status"用ANSI颜色表示的代码。这样做会产生令人不快的副作用,因为现在对Splunk中的日志进行RegEx很有挑战性,因为现在有控制字符,现在显示为ascii数字,可以解决这些问题。

2016-03-25 15:46:03,794 [0m[35m[44ma939[0m level=INFO [qtp509784188-34] onelog.core - [36mFinished...Status: [39m200[0m

如何通过ring.middleware.logger来抑制日志输出的ANSI着色?

2 个答案:

答案 0 :(得分:2)

似乎ring.middleware.logger默认情况下已实现ANSI着色,并且没有配置选项可以在不提供您自己的pre-loggerpost-logger等的情况下轻松禁用它。

但是,您可以创建变通方法:ring.middleware.logger使用clansi来应用ANSI颜色。 clansi提供without-ansi宏来禁用着色。

您可以编写自己的中间件,需要包装ring.middleware.logger

(defn wrap-no-ansi-colors [handler]
  (fn [rq]
    (without-ansi
      (handler rq))))

(def app
  (-> handler
    (wrap-with-logger)
    (wrap-no-ansi-colors)))

答案 1 :(得分:2)

另一种方法是迁移到[ring-logger-onelog "0.7.6"]。我把它作为ring.middleware.logger的分支开始,目的是使其更灵活。例如,它包含一个选项:printer :no-color,您可以使用该选项避免所有ANSI着色。

迁移路径非常流畅,如in the README所示:

  
      
  • 将project.clj中的依赖项从[ring.middleware.logger "0.5.0"]替换为[ring-logger-onelog "0.7.6"]
  •   
  • 将要求从[ring.middleware.logger :as logger]替换为[ring.logger.onelog :as logger]
  •   
  • 使用适当的地图而不是关键字参数将选项传递给logger/wrap-with-logger
  •   

您可以运行example app来查看要记录的内容。

还有核心ring-logger库可以处理不同的日志后端(而不是依赖于onelog的ring-logger-onelog,它最终通过log4j ...或slf4j,不确定)。 ring-logger没有内置的request-id,但an example in the README显示了如何自己实现它。