tools.loggingを使ってSLF4J+Logbackでログをとる

(このエントリは, Clojure Contrib Library Advent Calendar 9日目の記事です。)

概要

今日紹介するライブラリはtools.loggingです。tools.loggingは,Javaで実装されたいくつかのロギングライブラリを,共通したインタフェースでClojureから使えるようにするライブラリです。デフォルトでサポートされているロギングライブラリは以下のとおりです。

また,tools.loggingで定義されているプロトコルを実装することにより,それ以外のライブラリもtools.loggingから使用可能になります。
今回は,tools.loggingを使って,実際にSLF4JとLogbackでログを出力する方法を見てみます。

インストール・設定

tools.loggingを使用するためには,tools.logging自体とtools.loggingから使用するライブラリの両方を依存ライブラリとして追加する必要があります。SLF4Jやcommons-loggingを使う場合にはさらに,それらが実装として使用するロギングライブラリやアダプタを依存ライブラリとして追加します。

今回はSLF4JからLogbackを使用するので,tools.loggingとそれらのライブラリをLeiningenのproject.cljへ依存ライブラリとして追加します。

[org.clojure/tools.logging "0.2.6"]
[org.slf4j/slf4j-api "1.7.0"]
[ch.qos.logback/logback-classic "1.0.13"]

また,Logbackを使用するにあたり,設定ファイルのlogback.xmlをクラスパスの通った適当な場所へ配置します。今回の例では以下のような,コンソールへ出力するだけの単純な設定を使います。

<configuration>
  <appender name= "STDOUT" class= "ch.qos.logback.core.ConsoleAppender">
    <encoder>
      <pattern>%d {HH:mm:ss.SSS} [%thread] %-5level %logger {36} - %msg%n</pattern>
    </encoder>
  </appender>
  <root level= "debug">
    <appender-ref ref= "STDOUT" />
  </root>
</configuration>

使い方

tools.loggingの使い方は至って簡単です。ログを出力したい箇所で各ログレベルに対応したマクロを呼び出せばいいだけです。

  • (trace message & more)
  • (debug messsage & more)
  • (info message & more)
  • (warn message & more)
  • (error message & more)
  • (fatal message & more)

各マクロと実際のログレベルの対応は,tools.loggingから呼び出されるライブラリに依存します。たとえば,今回のようにSLF4Jを使う場合には, (SLF4JにFATALに対応するログレベルがないため)errorマクロとfatalマクロのどちらを呼んでもERRORレベルのログとして扱われます。

tools.loggingを使った以下のようなHello Worldを実行してみましょう。

(ns contrib-calendar.tools.logging
  (:require [clojure.tools.logging :as log])
  (:gen-class))

(defn -main [& args]
  (log/info "Hello, World!"))

以下が実行結果です。ログ出力ができました。

$ lein run -m contrib-calendar.tools.logging
15:14:45.040 [main] INFO  contrib-calendar.tools.logging - Hello, World!
$

おわりに

今回はtools.loggingを使ったSLF4JとLogbackでのログ出力の方法について紹介しました。
tools.loggingを使っていると,ロギングライブラリの設定のためにXMLやプロパティファイルを書く必要のあるシチュエーションがよくあります。そういった設定ファイルの記述が面倒だと思う方は,設定がClojureで記述できるなど,よりハイレベルな機能を提供するロギングツールである Timbreや,ロギングの設定に特化した clj-logging-configのようなライブラリを使ってみるといいかもしれません。

次回は@halcat0x15aさんで,data.codecについてです。