我正在关注this tutorial在我的Clojure网络应用程序中设置应用程序日志记录,我将用于一些Datomic实验。该教程建议我所要做的就是将Clojure的clojure.tools.logging
库添加到我在Leiningen的项目依赖项中,输出应该只显示在我的控制台上。但是,在启动应用程序时,我没有在控制台或其他地方看到任何日志记录输出。我做错了什么?
以下是我的设置方式。我的Web堆栈是Ring / Compojure,作为嵌入式Jetty独立JAR(使用ring.adapter.jetty
)运行,使用虚拟API路径,但尚未使用该数据库。
我的project.clj
(注意:我正在评估Datomic的专业版,所以我已经完成了GPG设置项目,以便正确下载受保护的JAR):
(defproject helloworld "0.1.0-SNAPSHOT"
:description "FIXME: write description"
:url "http://example.com/FIXME"
:min-lein-version "2.0.0"
:repositories {
"my.datomic.com" {:url "https://my.datomic.com/repo" :creds :gpg}}
:dependencies [[org.clojure/clojure "1.6.0"]
[compojure "1.3.1"]
[ring/ring-defaults "0.1.2"]
[ring/ring-json "0.3.1"]
[ring/ring-defaults "0.1.2"]
[ring/ring-jetty-adapter "1.4.0"]
[org.clojure/tools.logging "0.3.1"]
[com.datomic/datomic-pro "0.9.5198" :exclusions [joda-time]]
[joda-time "2.8.1"]]
:plugins [[lein-ring "0.8.13"]]
:ring {:handler helloworld.handler/app}
:main helloworld.core
:aot [helloworld.core]
:profiles
{:dev {:dependencies [[javax.servlet/servlet-api "2.5"]
[ring-mock "0.1.5"]]}})
文件src/helloworld/core.clj
:
(ns helloworld.core
(:require [clojure.tools.logging :as log]
[ring.adapter.jetty :as jetty]
[helloworld.handler :refer [app]])
(:gen-class))
(defn -main [& args]
(println "Hello, world!")
(log/info "Service is running!")
(jetty/run-jetty app {:port 8080}))
Compojure应用和API处理程序src/helloworld/handler.clj
:
(ns helloworld.handler
(:require [clojure.tools.logging :as log]
[compojure.core :refer :all]
[compojure.route :as route]
[ring.middleware.defaults :refer [wrap-defaults api-defaults]]
[ring.middleware.json :as json-middleware]
[ring.util.response :refer [response]]))
(def dummy-entity {:id 1 :name "Hello, world!"})
(defroutes app-routes
(GET "/" []
(log/info "Getting all the things!")
(response [dummy-entity]))
(route/not-found "Not Found"))
(def app
(->
(wrap-defaults app-routes api-defaults)
(json-middleware/wrap-json-body)
(json-middleware/wrap-json-response)))
这是我在尝试运行时看到的内容(这也是在几次点击默认端点之后):
$ lein run
Hello, world!
所以println
肯定有效,但记录似乎并非如此。
答案 0 :(得分:6)
事实证明,这里的问题包括Datomic库,即使我没有使用它!如果我删除了datomic-pro和joda-time依赖关系并重新运行,会发生什么:
$ lein run
2015-07-12 12:50:36.305:INFO::main: Logging initialized @1599ms
Hello, world!
Jul 12, 2015 12:50:38 PM clojure.tools.logging$eval18$fn__22 invoke
INFO: Service is running!
2015-07-12 12:50:38.167:INFO:oejs.Server:main: jetty-9.2.10.v20150310
2015-07-12 12:50:38.225:INFO:oejs.ServerConnector:main: Started ServerConnector@510a6f62{HTTP/1.1}{0.0.0.0:8080}
2015-07-12 12:50:38.226:INFO:oejs.Server:main: Started @3520ms
Jul 12, 2015 12:50:42 PM clojure.tools.logging$eval18$fn__22 invoke
INFO: Getting all the things!
所以现在我也得到了一堆Jetty日志,以及我的应用日志。
我认为问题是:
我通过对实际使用的记录器进行一些调试来验证这一点。我将其添加到-main
:
(ns ...
(require ...
[clojure.tools.logging.impl :as log-impl]
...))
...
(let [logger (log-impl/get-logger log/*logger-factory* *ns*)]
(println logger))
这向我展示了一些属于SLF4J的NOOP记录器类的对象。
我通过在项目依赖项中添加适当的SLF4J适配器来修复。我选择使用Logback:
[com.datomic/datomic-pro "0.9.5198"
:exclusions [joda-time org.slf4j/slf4j-nop org.slf4j/slf4j-log4j12]]
[ch.qos.logback/logback-classic "1.1.3"]
要进行配置,我在resources/logback.xml
中添加了以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="CONSOLE" />
</root>
</configuration>
那就修好了!