【问题标题】:slf4j File Not Found error when building uberwar构建 uberwar 时 slf4j File Not Found 错误
【发布时间】:2015-04-16 13:14:19
【问题描述】:

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

我在 Compojure 和 Ring 中有一个网络服务。该应用程序可以正常运行,但是每当我将应用程序编译为 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)

【问题讨论】:

  • 您的 src/ 目录或其他类路径中有 log4j.properties 或 log4j.xml 吗?
  • 是的,我在 src 目录中有 log4j.properties 文件。

标签: clojure ring compojure


【解决方案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 配置或任何其他运行时配置分开。

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

: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 目录中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-21
    • 2016-08-25
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2013-08-12
    • 2011-08-31
    相关资源
    最近更新 更多