构建uberwar时slf4j找不到文件错误

时间:2015-04-16 13:14:19

标签: clojure ring compojure

我想了解为什么我的Ring应用程序试图在编译时打开日志文件。

我在Compojure和Ring中有一个Web服务。该应用程序没有问题,但每当我将应用程序编译为uberwar或运行lein ring server时,我从slf4j得到以下错误。

我不明白是什么原因导致Clojure编译器在编译期间尝试访问此日志文件。我唯一的线索是它只在我加入Korma图书馆时才开始发生。

如果我创建了目录,我可以摆脱错误,但是,我想了解应用程序在编译时尝试打开日志文件的原因。

log4j:ERROR setFile(null,true) call failed.
java.io.FileNotFoundException: /var/log/ege/myservice/myservice.log (No such file or directory)
        at java.io.FileOutputStream.open0(Native Method)
        at java.io.FileOutputStream.open(FileOutputStream.java:270)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:213)
        at java.io.FileOutputStream.<init>(FileOutputStream.java:133)
        at org.apache.log4j.FileAppender.setFile(FileAppender.java:294)
        at org.apache.log4j.RollingFileAppender.setFile(RollingFileAppender.java:207)
        at org.apache.log4j.FileAppender.activateOptions(FileAppender.java:165)
        at org.apache.log4j.config.PropertySetter.activate(PropertySetter.java:307)
        at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:172)
        at org.apache.log4j.config.PropertySetter.setProperties(PropertySetter.java:104)
        at org.apache.log4j.PropertyConfigurator.parseAppender(PropertyConfigurator.java:809)
        at org.apache.log4j.PropertyConfigurator.parseCategory(PropertyConfigurator.java:735)
        at org.apache.log4j.PropertyConfigurator.configureRootCategory(PropertyConfigurator.java:615)
        at org.apache.log4j.PropertyConfigurator.doConfigure(PropertyConfigurator.java:502)

1 个答案:

答案 0 :(得分:1)

log4j配置是应用程序的运行时配置。 Korma在运行时使用log4j配置。因此,在运行lein ring server时,korma使用log4j配置进行日志记录并且log4j日志记录引发错误导致它无法找到日志目录,这并不奇怪。

至于lein checklein ring war期间引发的错误。也许你有一些表单试图连接到数据库,甚至在你的一些命名空间的顶层对数据库进行一些查询。

也许你有这样的事情:

(ns my-app.db
    (:use korma.db)
    (:use korma.core))

(def db  (create-db (mysql {:db "my_db"
                        :user "root"
                        :password ""})))



;; this form below attempts to get a db connection
(def conn (get-connection db))

(defentity users)

;; this form below attempts to query the database
(select users)

当clojure编译时​​,它会执行每个表单,因此,clojure连接到db或查询db。换句话说,clojure在编译期间运行应用程序的一部分。

不相关的注释

除此之外,您应该将log4j配置或任何其他运行时配置分开,以用于开发环境和生产环境。

我通常使用:profiles中的project.clj分隔开发环境和生产环境配置。

:profiles
   {:production
      {:ring
         {:open-browser? false, :stacktraces? false, :auto-reload? false}
       :source-paths ["prod-config"]}
    :dev
      {:dependencies [[ring-mock "0.1.5"] [ring/ring-devel "1.3.1"]]
       :source-paths ["dev-config"]}}

我将我的开发的log4j.properties放在dev-config目录中,生产的log4j.properties放在prod-config目录中。