使用clj-logging-config在初始化时是否有办法解决log4j.properties?

时间:2014-09-03 06:46:58

标签: logging clojure

我注意到我的应用程序所依赖的很多库都倾向于进行某种日志初始化,这种初始化在导入时不能很好地与clj-logging-config一起使用。

例如:现在,我有一个应用程序,其中包含一个按如下方式配置日志记录的方法:

(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}))

但是,我的app核心命名空间的导入路径上有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)?一般来说,推荐的做法是什么?

2 个答案:

答案 0 :(得分: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)))

这种方法有一定的缺点。通常在加载时显示的错误(例如未解析的符号)现在将在运行时出现。但它应该让你了解你所看到的特定问题。

话虽如此,在某些时候你可能会想要继续使用日志配置文件,无论如何都要用于任何体面的项目。在生产环境中进行代码更改以调整日志记录配置通常不是一个可行的选项,如果硬编码的日志记录配置无法捕获足够的信息来诊断问题,那么您只是一条小溪。

答案 1 :(得分:1)

不,没有办法绕过它。我建议使用log4j.properties文件。