今回は、「Logback」を使用したアプリケーションを実行して、コンソールに次のような情報が表示されたときの発生原因、解決方法を紹介していきます。
【コンソール表示例】
INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback.groovy]
INFO in ch.qos.logback.classic.LoggerContext[default] - Could NOT find resource [logback-test.xml]
INFO in ch.qos.logback.classic.LoggerContext[default] - Found resource [logback.xml] at [file:/logback.xml]
INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - debug attribute not set
INFO in ch.qos.logback.core.joran.action.AppenderAction - About to instantiate appender of type [ch.qos.logback.core.ConsoleAppender]
INFO in ch.qos.logback.core.joran.action.AppenderAction - Naming appender as [STDOUT]
WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This appender no longer admits a layout as a sub-component, set an encoder instead.
WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
INFO in ch.qos.logback.classic.joran.action.RootLoggerAction - Setting level of ROOT logger to DEBUG
INFO in ch.qos.logback.core.joran.action.AppenderRefAction - Attaching appender named [STDOUT] to Logger[ROOT]
INFO in ch.qos.logback.classic.joran.action.ConfigurationAction - End of configuration.
INFO in ch.qos.logback.classic.joran.JoranConfigurator@26794848 - Registering current configuration as safe fallback point
検証環境
検証に使用した環境/ライブラリを次に記載します。
- Logback
- バージョン:1.0.7
表示内容
コンソールの表示内容は、「Logback」の構成情報(logback.xmlなどの設定情報)を解析した結果が表示されます。
使用する設定ファイルやさまざまな情報が表示されるため、構成情報が正しく設定できているかなどを確認するためには有用な情報になります。
発生原因
コンソールに解析した結果が表示される原因は、次のようなものがあります。
デバッグ設定を有効
構成情報のデバッグ設定を有効にしている場合は、解析した結果が表示されるようになります。
設定ファイル
設定ファイルでの設定例は、次のようになります。
【設定例】
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration debug="true">
...
</configuration>
「configuration」のタグに「debug="true"」の属性を指定している場合は、構成情報のデバッグ設定は有効になります。
システムプロパティ
システムプロパティでの設定例は、次のようになります。
【設定例】
-Dlogback.debug=true
「logback.debug」に「true」を指定している場合は、構成情報のデバッグ設定は有効になります。
特定レベルの表示
構成情報の解析した結果として、特定レベル(警告、異常)を表示する理由が発生した場合は、解析した結果が表示されるようになります。
【「Logback」ソース(一部抜粋)】
検証対象バージョンの「Logback」の該当処理の一部を抜粋したソースは、次になります。
/**
* Print the contents of the context status, but only if they contain
* warnings or errors occurring later then the threshold.
*
* @param context
*/
public static void printInCaseOfErrorsOrWarnings(Context context, long threshold) {
if (context == null) {
throw new IllegalArgumentException("Context argument cannot be null");
}
StatusManager sm = context.getStatusManager();
if (sm == null) {
ps.println("WARN: Context named \"" + context.getName() + "\" has no status manager");
} else {
StatusUtil statusUtil = new StatusUtil(context);
if (statusUtil.getHighestLevel(threshold) >= ErrorStatus.WARN) {
print(sm, threshold);
}
}
}
特定レベルの判定は、「statusUtil.getHighestLevel(threshold) >= ErrorStatus.WARN」で実施しています。警告以上の表示情報が存在する場合は、「print(sm, threshold)」にて表示処理を実行します。
全体のソースについては、次の「GitHub」を確認してください。
解決方法
コンソールに解析した結果が表示されないようにする方法は、次のようになります。
デバッグ設定を無効
構成情報のデバッグ設定を無効にします。
設定ファイル
設定ファイルでの設定方法は、次のようになります。
- 「configuration」のタグに「debug="false"」の属性を指定する。
- 「configuration」のタグに「debug」の属性を指定しない。
設定ファイルでの設定例は、次のようになります。
【設定例】
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration debug="false">
...
</configuration>
システムプロパティ
システムプロパティでの設定方法は、次のようになります。
- 「logback.debug」に「false」を指定する。
- 「logback.debug」を指定しない。
システムプロパティでの設定例は、次のようになります。
【設定例】
-Dlogback.debug=false
特定レベルの表示内容を修正
特定レベルの表示内容には、構成情報を修正することで対応することができるものもあります。最初に紹介した表示例では、警告レベルとして次のような情報が表示されています。
【コンソール表示例】
WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - This appender no longer admits a layout as a sub-component, set an encoder instead.
WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - To ensure compatibility, wrapping your layout in LayoutWrappingEncoder.
WARN in ch.qos.logback.core.ConsoleAppender[STDOUT] - See also http://logback.qos.ch/codes.html#layoutInsteadOfEncoder for details
内容を確認すると1行目に「appender」の使用方法に誤りがあることを示す情報が表示されていました。
【設定ファイル例(警告表示あり)】
誤りがある設定ファイル例は、次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<Pattern>%msg%n</Pattern>
</layout>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
警告表示される理由は、「appender」タグに「layout」タグではなく「encoder」タグを使用することが推奨されているためです。
「Logback」の公式サイトにも非推奨の記載と修正方法が記載されています。詳細は、次の公式サイトも確認してみてください。
【設定ファイル例(警告表示なし)】
誤りを修正した設定ファイル例は、次のようになります。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>%msg%n </Pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT" />
</root>
</configuration>
「layout」のタグを「encoder」のタグに変更しています。
解析した結果の表示方法を変更
構成情報の解析した結果をすべて表示しないようにする場合は、構成情報に「statusListener」の値として「ch.qos.logback.core.status.NopStatusListener」を指定します。
指定方法の詳細については、次の公式サイトから「statusListener」の文字列を検索して参考にしてみてください。
設定ファイル
設定ファイルでの設定例は、次のようになります。
【設定例】
<configuration>
<statusListener class="ch.qos.logback.core.status.NopStatusListener" />
</configuration>
「statusListener」のタグに「class="ch.qos.logback.core.status.NopStatusListener"」の属性を指定します。
システムプロパティ
システムプロパティでの設定例は、次のようになります。
【設定例】
-Dlogback.statusListenerClass=ch.qos.logback.core.status.NopStatusListener
「logback.statusListenerClass」に「ch.qos.logback.core.status.NopStatusListener」を指定します。
「ch.qos.logback.core.status.NopStatusListener」は、「Logback」の「1.0.8」で追加された機能になります。該当バージョン未満の場合は、この方法は使用することができません。実行すると次のような例外情報が表示されます。
ERROR in ch.qos.logback.core.joran.action.StatusListenerAction - Could not create an StatusListener of type [ch.qos.logback.core.status.NopStatusListener]. ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type ch.qos.logback.core.status.NopStatusListener
at ch.qos.logback.core.util.DynamicClassLoadingException: Failed to instantiate type ch.qos.logback.core.status.NopStatusListener
まとめ
「Logback」を使用したアプリケーションを実行するときに、表示される情報の制御方法について紹介しました。