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). Это может быть чрезвычайно полезным для последующего анализа и обработки, особенно при работе с крупномасштабными распределенными системами.
Смотрите также
Если вы хотите узнать больше, рассмотрите возможность ознакомления с этими ресурсами:
- Документация Clojure Tools Logging: https://github.com/clojure/tools.logging
- Timbre, библиотека логирования для Clojure: https://github.com/ptaoussanis/timbre
- Настройка Log4J в Clojure: http://clojure-doc.org/articles/tutorials/logging_with_log4j.html
- Руководство по Logback для продвинутых настроек: http://logback.qos.ch/manual/
- Руководство по структурированному логированию в Clojure: https://corfield.org/blog/2020/04/28/structured-logging/