2014-09-03 29 views
1

我注意到很多庫我的應用程序依賴於傾向於做某種日誌初始化,不能在導入時與clj-logging-config很好地玩。在初始化時使用clj-logging-config有沒有辦法繞過log4j.properties?

例如:現在,我已經得到了與配置記錄的方法的應用程序如下:

(defn set-logging-defaults 
    "Set the logging level for the application root" 
    [] 
    (set-loggers! :root {:level :info 
         :out :console 
         :pattern "[%p] %d{MM-dd-yyyy HH:mm:ss} | %m%n"})) 

然後,此方法被調用的配置方法之前,服務器啓動時,例如:

(defn -main [] 
    (init/configure) 
    (server/run-server #'app {:port (Integer. (or (System/getenv "PORT") "8080")) 
         :join? false})) 

但是,我有我的應用程序的核心命名空間的導入路徑korma.db。在執行日誌記錄配置之前,進口發生了,我結束了下面當我啓動我的應用程序(去除korma.db進口將立即刪除此WARN):

log4j:WARN No appenders could be found for logger (com.mchange.v2.log.MLog). 
log4j:WARN Please initialize the log4j system properly. 
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info. 

有沒有辦法解決這個我還沒有想到,它不依賴於在導入時創建log4j.properties文件或執行(set-logging-defaults)?一般來說,這裏推薦的做法是什麼?

回答

1

不,沒有辦法繞過它。我會建議使用一個log4j.properties文件。

2

您可以將您的服務器的所有應用程序邏輯以及與有問題的第三方庫關聯的:require指令放到單獨的名稱空間中。你的主命名空間不會編程要求將此作爲其ns形式的一部分,而是會手動加載它在-main功能和使用eval啓動服務器:

(ns myapp.server 
    (:require [korma.db :as db] ...)) 

(defn start-server [] 
    (server/run-server #'app {:port (Integer. (or (System/getenv "PORT") "8080")) 
          :join? false}) 

你的主命名空間則具有最小的依賴性,並存在只需初始化日誌記錄配置,然後調用服務器:

(ns myapp.main 
    (:require [myapp.init :as init]) 
    (:gen-class)) 

(defn -main [] 
    (init/configure) 
    (require 'myapp.server) 
    (eval '(myapp.server/start-server))) 

這種方法存在一些缺陷。在加載時通​​常會出現的錯誤(例如未解決的符號)現在將在運行時顯示。但它應該讓你看到你所看到的特定問題。

話雖如此,有些時候你可能會想要繼續使用日誌配置文件來處理任何體面大小的項目。通過更改代碼來調整日誌記錄配置在生產環境中通常不是一個可行的選項,並且如果硬編碼日誌記錄配置沒有捕獲足夠的信息來診斷問題,那麼您就是一條小溪。

+0

我最終最終以實際運行應用程序的最大效用的方式使用了lein的project.clj':injections'字段 - 不滿足測試和運行repl,但是做了訣竅。 – Venantius 2014-09-05 22:10:09

+0

一個月後回到這個問題,我已經接受,只是使用log4j.properties配置文件是一種方式。對於我無法解決這個問題的事實,我並不是非常高興,但是在這一點上我嘗試了其他一切,我認爲很明顯,這是讓事情「僅僅工作」的唯一可靠方法。 – Venantius 2014-10-05 08:57:46

相關問題