Clojure:
ロギング

方法:

ClojureはJavaのロギング機構に依存していますが、よりClojureらしい方法でそれらを活用することができます。clojure.tools.loggingの使用方法を見てみましょう。これは複数のロギングフレームワークに対するシンプルな抽象化を提供しています:

まず、project.cljclojure.tools.loggingとロギング実装(例えばlog4j)の依存関係を追加します:

: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 "Starting intense computation...")
  (Thread/sleep 3000) ; 長い計算を模擬
  (log/info "Computation done. The answer is 42.")
  42)

(compute-answer-to-everything)

デフォルトではDEBUGメッセージは表示されません。通常、ログレベルはINFOに設定されています:

INFO  [your-namespace] - Computation done. The answer is 42.

必要に応じて、log4j.propertiesファイルでログレベルとアペンダーを設定して、より詳細な出力を得ることができます。

詳細な潜入

Clojureのclojure.tools.loggingはしばらく前からあり、ClojureコードとJavaロギングの世界の橋渡しをします。歴史的に、JavaはビルトインのログAPI、log4jslf4jlogbackなど、いくつかのロギングライブラリを経てきました。

Clojureでは、Javaのロギングフレームワークを直接使用することもできますが、clojure.tools.loggingはクラスパスで見つかったロギングフレームワークに委譲することで、特定の実装に密接に結び付くことを避けられます。これにより、より移植性とモジュール性の高いClojureコードを保つ手助けになります。

Clojureエコシステム内のclojure.tools.loggingへの代替としては、ログローテーション、フィルタリング、箱出しの非同期ロギング機能などを備えた純粋なClojureロギングライブラリであるtimbreなどのライブラリがあります。

ログは副作用として、特にClojureのようなマルチスレッド環境では慎重に扱われるべきです。不変性と副作用管理は、パフォーマンスのボトルネックを避け、スレッドセーフを保証するために明確な利点を提供します。これは、ほとんどのJavaロギングフレームワークが既にケアしていることです。

最後に、構造化ログについて考えてみましょう。ログを構造化データ(JSONなど)として書くことで、特に大規模な分散システムを扱う際に後での分析や処理に非常に役立ちます。

参照資料

もっと学びたい方は、以下のリソースをチェックしてみてください:

  • Clojure Tools Loggingドキュメンテーション:https://github.com/clojure/tools.logging
  • Timbre、Clojureのロギングライブラリ:https://github.com/ptaoussanis/timbre
  • ClojureでLog4Jを設定する: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/