Clojure:
Журналирование

Как:

Clojure опирается на средства логирования Java, но вы можете использовать их более идиоматичным для Clojure способом. Давайте посмотрим, как вы можете использовать clojure.tools.logging, который предоставляет простую абстракцию над несколькими фреймворками логирования:

Сначала добавьте зависимость для clojure.tools.logging и реализацию логирования, такую как log4j, в ваш project.clj:

:dependencies [[org.clojure/clojure "1.10.3"]
               [org.clojure/tools.logging "1.1.0"]
               [log4j/log4j "1.2.17"]]

Теперь давайте залогируем некоторые сообщения:

(require '[clojure.tools.logging :as log])

(defn compute-answer-to-everything []
  (log/debug "Начало интенсивных вычислений...")
  (Thread/sleep 3000) ; Имитируем длительные вычисления
  (log/info "Вычисления завершены. Ответ - 42.")
  42)

(compute-answer-to-everything)

По умолчанию в выводе не будут показаны сообщения DEBUG, так как уровни логирования обычно устанавливаются в INFO:

INFO  [ваше-пространство-имен] - Вычисления завершены. Ответ - 42.

Вы можете настроить уровни логирования и аппендеры в файле log4j.properties, чтобы получить более подробный вывод при необходимости.

Глубокое погружение

clojure.tools.logging существует уже довольно давно и служит мостом между кодом Clojure и миром логирования Java. Исторически Java прошла через несколько итераций и библиотек для логирования, таких как встроенный API логирования Java, log4j, slf4j и logback.

В Clojure, хотя вы можете напрямую использовать фреймворки логирования Java, clojure.tools.logging обнаруживает и делегирует выполнение любому фреймворку логирования, который найдет в вашем classpath, избавляя вас от тесной связи с конкретной реализацией. Это может помочь сохранить ваш код Clojure более портативным и модульным.

Альтернативы clojure.tools.logging в экосистеме Clojure включают библиотеки вроде timbre, которая является чистой Clojure библиотекой логирования с возможностями вроде ротации логов, фильтрации и асинхронного логирования “из коробки”.

Детали реализации крайне важны, когда речь идет о логировании в многопоточной среде, такой как Clojure. Здесь неизменяемость и управление побочными эффектами предоставляют явные преимущества. Логирование, как побочный эффект, должно обрабатываться осторожно, чтобы избежать узких мест производительности и обеспечить безопасность потоков, что большинство фреймворков логирования Java уже обеспечивают.

Наконец, рассмотрите структурированное логирование, где логи записываются в виде структурированных данных (например, JSON). Это может быть чрезвычайно полезным для последующего анализа и обработки, особенно при работе с крупномасштабными распределенными системами.

Смотрите также

Если вы хотите узнать больше, рассмотрите возможность ознакомления с этими ресурсами: