2014-09-03 28 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

相关问题