本当は怖いHPC

HPC屋の趣味&実益ブログ

Clojure記事紹介<百日修行>(3):「ログの基本」

Clojure記事紹介<百日修行>では、英文で書かれたClojureの記事を要約してひたすら紹介していきます。モットーは「質より量」です。

紹介記事

Clojure in Production: Logging

レベル:初級〜中級

この記事では、「Clojure in production」シリーズとして、ログについて書かれています。ログ出力の方法について、初心者向けの基本的なチュートリアルとなっています。

取り上げられているライブラリ:

  • tools.logging

tools.logging + log4jが基本

ログ出力の基本は、Javaのライブラリであるlog4jを使うことです。 tools.loggingはそれ以外のライブラリもサポートしていますが、ひとまずはこれが基本となるでしょう。この記事の前半では、log4jおよびtools.loggingを使うためのleiningenと設定ファイルresources/log4j.propertiesの書き方、そしてログレベル(TRACE, DEBUG, INFO, WARN, ERROR, FATAL)の設定の仕方が説明されています。この部分をコピペするだけで、とりあえず使うことが出来ます。

log4j.rootLogger=ERROR, file

log4j.logger.rabbet.core=INFO

log4j.appender.file=org.apache.log4j.RollingFileAppender
log4j.appender.file.File=log/rabbet.log
log4j.appender.file.MaxFileSize=1MB
log4j.appender.file.MaxBackupIndex=10
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss.SSS} | %-5p | %t | %c | %m%n

正直プロパティファイルの書き方はよくわからないところが多いのですが、最初にコピペしてしまえば、使い方は簡単です

(ns rabbet.core (:require [clojure.tools.logging :as log]))
;; Output log statements at various levels:
(log/trace "This is the lowest (least important) log level")
(log/debug "For programmer info...")
(log/warn "Something bad might have happened.")
;; You can dump all kinds of things out to the log: 
(log/info "this happened:" {:foo 12 :bar :quux} "that was fun!") 
;; Exceptions have a special arity: 
(try (/ 10 (dec 1)) ;; <-- dividing by zero rarely works.
   (catch Exception e (log/error e "Dividing failed!")))

次に、一歩進んで、出力先の設定、出力フォーマットの変更、そして動的な設定も説明されています。このあたりは、Javaについて書かれた資料を見ながらClojure向けに脳内変換して調べざるを得ないことが多いので、Clojure視点で書かれているのは助かります。特に、動的な設定について書かれているのは勉強になりました。

オマケ:スタックトレースの見方

記事のオマケとして、例外発生時のスタックトレースに慣れていない人のために、スタックトレースの解読の仕方が説明されています。

スタックトレースが長くて読みにくいという点は、Clojureの(数少ない:)欠点の一つですが、コツをつかむとそれほど苦労せずに読むことが出来ます。

この記事で述べられているのは まずスタックトレースを上から順に見ましょう 冒頭には、発生した例外の種類が書かれています(例:java.lang.ArithmeticException)。通常はこの情報は役に立ちます。 例外のメッセージも確認しましょう。 どこで例外が投げられたか確認しましょう。非常に長いリストが出力されていますが、本当に見るべき箇所は多くありません。clojure.coreやjavaのレベルでバグがあると言うことは稀なので、飛ばしましょう。自分が書いているプログラムのネームスペースが出てきたら、きっとそこが本当の問題です。

というわけで、tools.loggingとlog4jを使ったログ出力についての記事を紹介しました。

【広告】