Clojure:
Registro de Logs

Como fazer:

Clojure se apoia nas facilidades de log do Java, mas você pode acessá-las de uma maneira mais idiomática de Clojure. Vamos dar uma olhada em como você pode usar clojure.tools.logging, que oferece uma abstração simples sobre vários frameworks de log:

Primeiro, adicione uma dependência para clojure.tools.logging e uma implementação de log como log4j no seu project.clj:

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

Agora, vamos registrar algumas mensagens:

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

(defn compute-answer-to-everything []
  (log/debug "Iniciando um cálculo intenso...")
  (Thread/sleep 3000) ; Simulação de um longo cálculo
  (log/info "Cálculo concluído. A resposta é 42.")
  42)

(compute-answer-to-everything)

A saída não mostrará mensagens DEBUG por padrão, já que os níveis de log são normalmente configurados para INFO:

INFO  [seu-namespace] - Cálculo concluído. A resposta é 42.

Você pode configurar os níveis de log e os appenders em um arquivo log4j.properties para obter uma saída mais verbosa, se necessário.

Mergulho Profundo

clojure.tools.logging do Clojure existe há algum tempo e serve como uma ponte entre o código Clojure e o mundo de log do Java. Historicamente, o Java já passou por várias iterações e bibliotecas para registro de logs, como a API de log embutida do Java, log4j, slf4j, e logback.

No Clojure, enquanto você pode usar diretamente os frameworks de log do Java, clojure.tools.logging detecta e delega ao framework de log que encontrar em seu classpath, evitando que você fique estritamente acoplado a uma implementação específica. Isso pode ajudar a manter seu código Clojure mais portátil e modular.

Alternativas ao clojure.tools.logging dentro do ecossistema Clojure incluem bibliotecas como timbre, que é uma biblioteca de log puramente Clojure com recursos como rotação de logs, filtragem e logging assíncrono já inclusos.

Detalhes de implementação são cruciais quando se trata de registro de logs em um ambiente com múltiplas threads como o Clojure. Aqui, imutabilidade e o gerenciamento de efeitos colaterais oferecem vantagens distintas. O registro de logs, como um efeito colateral, deve ser tratado com cuidado para evitar gargalos de desempenho e garantir a segurança entre as threads, algo que a maioria dos frameworks de log do Java já cuida.

Por último, considere o uso de log estruturado, onde os logs são escritos como dados estruturados (como JSON). Isso pode ser extremamente útil para análises e processamentos posteriores, particularmente ao lidar com sistemas distribuídos em larga escala.

Veja Também

Se você quer saber mais, considere consultar estes recursos: