第62回 ロギングその1
今回から「ロギング」をテーマにしていきます。
システムを構築・運用するにあたり、ログをとることは非常に重要です。
ログを見ることで、障害の原因を特定できたり、障害の予防を行える場合もあります。
ユーザーの利用状況を分析することも可能であり、統計をとることもできます。
逆に考えると、ログをとっていないシステムは上記を行えないのです。
そんなシステムの管理を任されたら、想像するだに恐ろしいですね。
Javaでログを扱う場合、Log4J、Apache Commons Logging等が非常に有名です。
ただ、しばらくはそんなに高機能なものが必要ではないので、J2SE1.4で導入されたjava.util.loggingパッケージを使っていきます。
以下のサンプルコードでは、Loggerクラスのglobalフィールドを利用しています。
残念ながらJava6ではglobalフィールドは非推奨となってしまい、
getLogger(Logger.GLOBAL_LOGGER_NAME)という形で使うことになりました。
使用しているのは全てログを出力するメソッドです。(J2SE1.4以上対応)
import java.util.logging.Logger; public class LogTest { public static void main(String[] args) { // Java5まで Logger.global.severe("SEVERE は重大な障害を示すメッセージレベルです。 "); Logger.global.warning("WARNING は潜在的な問題を示すメッセージレベルです。 "); Logger.global.info("INFO はメッセージを情報として提供するメッセージレベルです。 "); Logger.global.config("CONFIG は静的な構成メッセージのメッセージレベルです。"); Logger.global.fine("FINE はトレース情報を提供するメッセージレベルです。 "); Logger.global.finer("FINER はかなり詳細なトレースメッセージを示します。 "); Logger.global.finest("FINEST は非常に詳細なトレースメッセージを示します。 "); // Java6 // Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) .severe("SEVERE は重大な障害を示すメッセージレベルです。 "); // Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) .warning("WARNING は潜在的な問題を示すメッセージレベルです。 "); // Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) .info("INFO はメッセージを情報として提供するメッセージレベルです。 "); // Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) .config("CONFIG は静的な構成メッセージのメッセージレベルです。"); // Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) .fine("FINE はトレース情報を提供するメッセージレベルです。 "); // Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) .finer("FINER はかなり詳細なトレースメッセージを示します。 "); // Logger.getLogger(Logger.GLOBAL_LOGGER_NAME) .finest("FINEST は非常に詳細なトレースメッセージを示します。 "); } }
実行してみると、メッセージが出力されないメソッドがあることに気づくでしょう。
ロギングには「ログレベル」という概念があり、設定されたログレベルに満たない場合、メッセージは出力されないのです。
ログレベルには、SEVERE、WARNING、INFO、CONFIG、FINE、FINER、FINESTの7段階があり、SEVEREが最高、FINESTが最低となっています。
java.util.loggingパッケージにはログレベルを定義するLevelクラスがあるので、詳しくはLevelクラスのAPIを参照してください。
デフォルトではログレベルはINFOに設定されているので、INFO以上のメッセージのみ出力されるのです。
では、ロギングに関するデフォルトの設定はどこでされているのでしょうか。
実はJREのlibフォルダの中のlogging.propertiesファイルでされています。
下記の箇所を変更することで、サンプルソースの出力結果を変更できます。
# Default global logging level. # This specifies which kinds of events are logged across # all loggers. For any given facility this global level # can be overriden by a facility specific level # Note that the ConsoleHandler also has a separate level # setting to limit messages printed to the console. .level= INFO
ログレベルの切り替えにより、ソースに手を加えずに、状況に応じて必要な出力を得られます。
ログレベルはsyslog、Apache等でも出てくる一般的な概念なので、しっかり覚えておきましょう。