Clojure 如何抑制ANSI着色环.middleware.logger放入日志中?

Clojure 如何抑制ANSI着色环.middleware.logger放入日志中?,clojure,ring,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 - Starti

我继承了一个项目,它通过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彩色。在a939字段上方有一个类似于请求id的东西,以及开始、完成和状态代码,这些代码用ANSI颜色表示。这有一个令人不快的副作用,那就是在Splunk中对日志进行正则化很有挑战性,因为现在有一些控制字符,它们现在显示为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着色?

似乎ring.middleware.logger默认实现了ANSI着色,并且没有配置选项可以轻松禁用它,而不提供您自己的预日志记录器、后日志记录器等

但是,您有可能创建一个解决方案:ring.middleware.logger用于应用ANSI颜色。clansi提供宏来禁用着色

您可以编写自己的中间件来包装ring.middleware.logger:


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

迁移路径非常平滑,如图所示:

将project.clj中的依赖项从[ring.middleware.logger 0.5.0]替换为[ring logger onelog 0.7.6] 将require从[ring.logger.onelog:as logger]替换为[ring.logger.onelog:as logger] 使用正确的映射而不是关键字参数将选项传递给logger/wrap with logger。 有一个可以运行以查看将记录哪些内容的


还有一个核心库,它可以处理不同的日志后端,而不是依赖于onelog的环日志记录器onelog,它最终会通过log4j。。。或者slf4j,不确定。ring logger没有内置请求id,但有一个显示了如何自己实现它。

回答不错,这会起作用,但我有点不愿意集成clojure逻辑,我不完全理解。我想是时候弄清楚具体化是什么意思了……不过听起来像是一种疾病,或者至少是一种暴力;。如果[ring.logger.onelog]能够在不添加任何中间件的情况下获得请求ID概念,那就太好了。哦,嘿,我的错。[ring.logger onelog 0.7.6]工作得很好。我似乎有一个请求ID,没有混乱,没有麻烦。谢谢。
(defn wrap-no-ansi-colors [handler]
  (fn [rq]
    (without-ansi
      (handler rq))))

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