如何访问log4j.properties文件中的log4j变量

时间:2019-05-13 13:32:51

标签: clojure log4j

我无法从clojure.clj文件访问log4j.properties文件中的变量。

具体来说,我需要能够使用一些clojure逻辑来查看我的log4j.rootLogger级别设置为什么级别。有没有办法在clj文件中引用/ import /:require my log4j文件,以便我可以对log4jfile中设置的变量使用一些逻辑?

我的log4j.properties文件中包含以下内容。

    log4j.rootLogger=INFO, stdout

我希望能够在exceptions.clj文件中使用if语句,以确认何时将log4j.properties文件中的log4j.rootlogger值设置为INFO或OFF或DEBUG。

    (if (log4j.rootlogger=INFO) (prn "rootlogger is set to info") (prn "rootlogger is set to something else"))

1 个答案:

答案 0 :(得分:0)

假设以下内容,我尝试了一下:

  • 如果您使用log4j.properties配置Log4j,则意味着您正在使用Log4j 1.2(已达到使用寿命终止BTW)

我用lein new app log4jdemo创建了一个新项目,添加了对Log4j JAR的依赖关系(从this page获得了工件名称):

project.clj

(defproject log4jdemo "0.1.0-SNAPSHOT"
  :description "FIXME: write description"
  :url "http://example.com/FIXME"
  :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
            :url "https://www.eclipse.org/legal/epl-2.0/"}
  :dependencies [[org.clojure/clojure "1.10.0"]
                 [log4j/log4j "1.2.17"]]
  :main ^:skip-aot log4jdemo.core
  :target-path "target/%s"
  :profiles {:uberjar {:aot :all}})

接下来,我使用以下命令修改了从模板生成的文件core.clj

src / log4jdemo / core.clj

(ns log4jdemo.core
  (:gen-class)
  (:import [org.apache.log4j Logger]))

(defn get-logging-level []
  (-> (Logger/getRootLogger)
      .getEffectiveLevel
      str))

(defn -main
  [& args]
  (println "Effective level:" (get-logging-level)))

最后,让我们添加一个配置文件。请注意,属性文件需要放置在src文件夹中,以便当我们捆绑整个内容时,可以将其作为资源找到(我使用的是WARN日志级别,但是您可以尝试其他Level):

src / log4j.properties

log4j.rootLogger=WARN, stdout

最后,我们将项目作为Uberjar进行构建并运行:

$ lein uberjar
Compiling log4jdemo.core
Created /tmp/log4jdemo/target/uberjar/log4jdemo-0.1.0-SNAPSHOT.jar
Created /tmp/log4jdemo/target/uberjar/log4jdemo-0.1.0-SNAPSHOT-standalone.jar

$ java -jar target/uberjar/log4jdemo-0.1.0-SNAPSHOT-standalone.jar
log4j:ERROR Could not find value for key log4j.appender.stdout
log4j:ERROR Could not instantiate appender named "stdout".
Effective level: WARN

...,这是正确的,在示例中,Log4j属性文件已设置为WARN(lein run也可以,顺便说一句)。