Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Logging 控制台上未出现Clojure web服务的基本登录_Logging_Clojure_Ring_Datomic - Fatal编程技术网

Logging 控制台上未出现Clojure web服务的基本登录

Logging 控制台上未出现Clojure web服务的基本登录,logging,clojure,ring,datomic,Logging,Clojure,Ring,Datomic,我将在我的Clojure web应用程序中设置应用程序日志记录,我将使用它进行一些Datomic实验。本教程建议我所要做的就是将Clojure的Clojure.tools.logging库添加到我在Leiningen中的项目依赖项中,并且输出应该只显示在我的控制台上。但是,在启动应用程序时,我在控制台或其他地方没有看到任何日志输出。我做错了什么 我是这样被安排的。我的web堆栈是Ring/Compojure,作为嵌入式Jetty独立JAR运行(使用Ring.adapter.Jetty),带有一个

我将在我的Clojure web应用程序中设置应用程序日志记录,我将使用它进行一些Datomic实验。本教程建议我所要做的就是将Clojure的
Clojure.tools.logging
库添加到我在Leiningen中的项目依赖项中,并且输出应该只显示在我的控制台上。但是,在启动应用程序时,我在控制台或其他地方没有看到任何日志输出。我做错了什么

我是这样被安排的。我的web堆栈是Ring/Compojure,作为嵌入式Jetty独立JAR运行(使用
Ring.adapter.Jetty
),带有一个尚未使用数据库的伪API路由

我的
project.clj
(注意:我正在评估Datomic的pro版本,所以我在项目之外进行了GPG设置,以便正确下载这个受保护的JAR):

文件
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}))
(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)))
Compojure应用程序和API处理程序,
src/helloworld/handler.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}))
(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)))
下面是我在尝试运行它时看到的(这也是在多次命中默认端点之后):


因此,
println
确实有效,但日志记录似乎不起作用。

事实证明,这里的问题是包括Datomic库,即使我没有使用它!如果删除datomic pro和joda时间依赖项并重新运行,会发生以下情况:

$ 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日志,以及我的应用程序日志

我认为问题在于:

  • Clojure的日志库从可用的日志后端中选择它最喜欢的日志后端
  • 我正在看的教程假设项目的依赖项(或其任何可传递的依赖项!)中不包含日志库,因此将选择最后一个默认值(java.util.logging)。默认情况下,将登录到控制台
  • 然而,Datomic引入了SLF4J,Clojure日志库非常喜欢它
  • 而SLF4J则没有任何日志适配器可供使用,因为我在项目的依赖项中没有指定任何日志适配器。所以它选择了一个无操作记录器。(谢谢,SLF4J。)
我通过在实际使用的记录器上进行一些调试来验证这一点。我将此添加到
-main

(ns ...
  (require ...
           [clojure.tools.logging.impl :as log-impl]
           ...))
...
(let [logger (log-impl/get-logger log/*logger-factory* *ns*)]
    (println logger))
这向我展示了一些属于SLF4J的NOOP logger类的对象

我通过向我的项目依赖项添加适当的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>

%d{HH:mm:ss.SSS}[%thread]-5级别%logger{36}-%msg%n

这就解决了它

感谢您提供详细的答案和解释!