Как получить доступ к переменным log4j в файле log4j.properties - PullRequest
0 голосов
/ 13 мая 2019

Я не могу получить доступ к переменным в моем файле log4j.properties из файла clojure.clj.

В частности, мне нужно иметь возможность использовать некоторую логику замыкания, чтобы увидеть, на какой уровень установлен мой уровень log4j.rootLogger.Есть ли способ ссылаться на / import /: требовать мой файл log4j в моем файле clj, чтобы я мог использовать некоторую логику для настройки переменных в файле log4jfile?

У меня есть следующее в моем файле log4j.properties.

    log4j.rootLogger=INFO, stdout

Я хочу иметь возможность использовать оператор if в моем файле exceptions.clj, чтобы иметь возможность подтверждать, когда значение log4j.rootlogger в моем файле log4j.properties имеет значение INFO илиВЫКЛ или ОТЛАДКА.

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

1 Ответ

0 голосов
/ 14 мая 2019

Я быстро попробовал предположить следующее:

  • Если вы конфигурируете Log4j с использованием log4j.properties, это означает, что вы используете Log4j 1.2 (который достиг конца срока службы BTW)

Я создал новый проект с lein new app log4jdemo, добавил зависимость от JAR Log4j (получил имя артефакта от этой страницы ):

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, но вы можете попробовать любой другой Уровень ):

ЦСИ / 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 также будет работать, кстати).

...