我想了解为什么我的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)
答案 0 :(得分:1)
log4j配置是应用程序的运行时配置。 Korma在运行时使用log4j配置。因此,在运行lein ring server
时,korma使用log4j配置进行日志记录并且log4j日志记录引发错误导致它无法找到日志目录,这并不奇怪。
至于lein check
或lein 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
目录中。