Отсутствует * out * в Clojure с Lein и Ring

Я использую Lein 2 и сидр 0.7.0. Я сделал образец кольцевого приложения, в котором для запуска используется кольцо / пристань.

(ns nimbus-admin.handler
  (:require [compojure.core :refer :all]
            [compojure.handler :as handler]
            [clojure.tools.nrepl.server :as nrepl-server]
            [cider.nrepl :refer (cider-nrepl-handler)]
            [ring.adapter.jetty :as ring]
            [clojure.tools.trace :refer [trace]]
            [ring.util.response :refer [resource-response response redirect content-type]]
            [compojure.route :as route])
  (:gen-class))


(defroutes app-routes 
  (GET "/blah" req "blah")
  (route/resources "/")
  (route/not-found (trace "not-found" "Not Found")))

(def app (handler/site app-routes))

(defn start-nrepl-server []
  (nrepl-server/start-server :port 7888 :handler cider-nrepl-handler))

(defn start-jetty [ip port]
  (ring/run-jetty app {:port port :ip ip}))

(defn -main
  ([] (-main 8080 "0.0.0.0"))
  ([port ip & args] 
     (let [port (Integer. port)]
       (start-nrepl-server)
       (start-jetty ip port))))

затем подключитесь к нему с помощью сидра, например:

cider-connect 127.0.0.1 7888

Я могу перейти к своему сайту и формам eval в emacs, и он обновит то, что работает в моем сеансе nrepl, так что это здорово.

Я не вижу вывода, либо с (print "test") (println "test") (trace "out" 1)

Наконец, мой файл проекта:

(defproject nimbus-admin "0.1.0"
  :description ""
  :url ""
  :min-lein-version "2.0.0"
  :dependencies [[org.clojure/clojure "1.6.0"]
                 [com.climate/clj-newrelic "0.1.1"]
                 [com.ashafa/clutch "0.4.0-RC1"]
                 [ring "1.3.1"]
                 [clj-time "0.8.0"]
                 [midje "1.6.3"]
                 [org.clojure/tools.nrepl "0.2.6"]
                 [ring/ring-json "0.3.1"]
                 [org.clojure/tools.trace "0.7.8"]
                 [compojure "1.1.9"]
                 [org.clojure/data.json "0.2.5"]
                 [org.clojure/core.async "0.1.346.0-17112a-alpha"]
                 ]
  :plugins [[lein-environ "1.0.0"]
            [cider/cider-nrepl "0.7.0"]]
  :main nimbus-admin.handler)

Я запускаю сайт с lein run

Изменить Я МОГУ видеть вывод ТОЛЬКО при использовании (.println System/out msg)


person Steve    schedule 12.03.2014    source источник


Ответы (4)


Вы пробовали (.println System/out msg)? У меня была такая же проблема, и это сработало для меня.

person Chris    schedule 22.10.2014
comment
Хорошо, это работает! А вот трое других - нет! Что тут происходит?! - person Steve; 24.10.2014
comment
Хотел бы я знать. Я считаю, что проблема вызвана попыткой печати через несколько потоков. Не уверен, почему мой метод работает, а другие терпят неудачу. Список рассылки clojure может быть лучшим вариантом. - person Chris; 24.10.2014

Можно просто вручную вставить операторы печати в свой код. Если вы хотите распечатать информацию о каждом запросе, вы можете добавить промежуточное ПО. Обработчик, который вы передаете на причал, - это функция от запросов на кольцо до ответов на звонок. Запрос на звонок и ответы - это просто карты, см. спецификацию кольца, чтобы узнать, какие ключи они должны содержать. Промежуточное ПО - это просто функция, которая принимает обработчик в качестве первого аргумента и возвращает обработчик.

Пример функции промежуточного программного обеспечения для вывода основной информации о запросах и ответах:

(defn log-middleware [handler]
  (fn [request]
    (let [response (handler request)]
      (println "=>" (name (:request-method request)) ":" (:uri request))
      (println "<=" (:status request))
      response)))

Это промежуточное программное обеспечение должно печатать в буфер реплики сидра, но сидр иногда ведет себя странно и отправляет вывод в *Messages* или в буфер сервера nrepl.

Вы используете это промежуточное ПО, применяя его к своим обработчикам:

 (def application (log-middleware (handler/site routes)))

Заголовки можно распечатать следующим образом: просто получите поле :headers из карты запроса и распечатайте его.

person ChrisBlom    schedule 18.07.2014
comment
Когда я помещаю в свой код операторы clojure.tools.trace / trace или println или print, они нигде не появляются. Они не отображаются в моем буфере для сидра или в журнале работающего сайта. Это не работает, когда я использую cider-jack-in или cider-connect для подключения к работающему сайту. - person Steve; 20.10.2014

Вам может помочь библиотека Prone. Он имеет промежуточное программное обеспечение кольца для улучшения отчетов об исключениях, которое также имеет возможность отладки. При отладке вы можете проверить любые локальные привязки, а также запрос Ring.

Вот видео, демонстрирующее, как это работает.

person Odinodin    schedule 28.09.2014

Используйте (flush) после print выражений для принудительного вывода.

person David L    schedule 09.06.2015