web-dev-qa-db-ja.com

コマンドラインでログバックロガーレベルを設定することは可能ですか?

Log4Jを使用すると、アプリケーション内の特定のロガーにコマンドラインからログを記録させたいレベルを渡すことができます。 「-Dlog4j.logger.com.whatever.MyClass = DEBUG」。 Logbackに同様の機能が見つかりません。 FAQによれば、あなたができるように思えるのは、変数置換を使用してルートロガーのレベルを設定することだけです。私が不足しているものがありますか、Logbackはこれをサポートしていませんか?ありがとう。

30
bfancher

はい、そのような機能はないようです。私が理解しているように、それは、そのログバック構成がより複雑であり、フラットな文字列プロパティによって合理的な構成の柔軟性を達成するのが非常に難しいからです。なぜなら、私見では、それは悪い習慣を助長する-システムプロパティを配置しすぎる-肥大化した実行スクリプトまたはコマンドラインにつながり、個別のログ設定ファイルよりも管理が難しいからです。

ただし、いくつかのオプションを提案できます。

  • 使用する ${sys.prop.var.name} logback.xml構成ファイルの置換
  • logback.xmlをローカルにコピーし、必要なロガーレベルで変更して、-Dlogback.configurationFile=/path/to/customised/logback.xml。 「Logback-classicは、構成ファイルの変更をスキャンし、構成ファイルが変更されると自動的に再構成できる」ことに注意してください。そのため、ログレベルを変更するためにプロセスを再起動する必要さえありません。
  • DIY:システムプロパティを読み取り、起動時にログレベルにプロパティを適用するコードをアプリケーションに追加します。
22
kan

これは古い質問であることは知っていますが、SysPropsからLogback Loggerレベルを初期化するためのソリューションコードが必要な場合はこちらにあります。 Slf4jのLoggerFactoryを使用してLogback Loggerを取得することに注意してください。 Java 8ラムダを使用していますが、簡単にJava 7以下に変換できます。

mainメソッドの最初にSysPropLogbackConfigurator.applyOnce()を追加するだけです。複数回呼び出された場合、静的イニシャライザはプロパティの再スキャンを防ぎます。

package com.yourpackage;

import org.slf4j.LoggerFactory;
import ch.qos.logback.classic.Level;

/**
 * Looks into System.properties for props -DLOG.loggerName=LEVEL to set Logback levels at startup
 * If LEVEL is empty (setting -DLOG.loggerName without level), it erases a previously set level and will inherit from parent logger
 */
public class SysPropLogbackConfigurator {

    public static final String PROP_PREFIX = "LOG.";

    public static void apply() {
        System.getProperties().stringPropertyNames().stream().filter(name -> name.startsWith(PROP_PREFIX)).forEach(SysPropLogbackConfigurator::applyProp);
    }

    public static void applyOnce() {
        OnceInitializer.emptyMethodToForceInit();//force static init. applySysPropsToLogback will be called only once
    }

    private static void applyProp(final String name) {
        final String loggerName = name.substring(PROP_PREFIX.length());
        final String levelStr = System.getProperty(name, "");
        final Level level = Level.toLevel(levelStr, null);
        ((ch.qos.logback.classic.Logger) LoggerFactory.getLogger(loggerName)).setLevel(level);
    }

    private static class OnceInitializer {
        static {
            apply();
        }

        static void emptyMethodToForceInit() {
        };
    }
}
7
Benoît

[〜#〜] faq [〜#〜] に記載されているとおり:

ログバックでは、コマンドラインからログを無効にすることはできません。ただし、構成ファイルで許可されている場合は、Javaシステムプロパティを使用して、コマンドラインでロガーのレベルを設定できます。

したがって、@ kanが前述したように、他のオプションを使用する必要があります。

2
Dag