slf4j-simpleの設定方法


回答:


218

システムプロパティを介して

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

またはsimplelogger.propertiesクラスパス上のファイル

詳細については、http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.htmlを参照してください


おかげで、System.propertiesで「org.slf4j.simpleLogger.defaultLogLevel」を「error」に設定しましたが、slf4jは引き続きINFOレベルのメッセージをログに記録します。何か案が?ところで、simplelogger.propertiesはどこに置くべきですか?
Gelin Luo 2013

2
org.slf4j.simpleLogger.defaultLogLevelの代わりにorg.slf4j.simplelogger.defaultlogを試してください。ファイルはクラスパス、デフォルトパッケージ上にある必要があります
Evgeniy Dorofeev 2013年

2
実際には(defaultLogLevel)は機能しますdefaultlog。間違ったフォルダでプログラムを変更していたことがわかりました;-) 機能しません。私はそれを受け入れましたが、おそらくあなたはあなたの答えを編集したいでしょう
Gelin Luo

11
注:使用しているSimpleLoggerのバージョンによっては、どちらの回答も適切です。たとえば、defaultLogLevelは1.7.5で機能しますが、defaultlogは1.6.6で機能します。これは、プロジェクトのログを構成してこの投稿
Ken Shih

112

これはsimplelogger.properties、クラスパスに配置できるサンプルです(使用するプロパティのコメントを外します)。

# SLF4J's SimpleLogger configuration file
# Simple implementation of Logger that sends all enabled log messages, for all defined loggers, to System.err.

# Default logging detail level for all instances of SimpleLogger.
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, defaults to "info".
#org.slf4j.simpleLogger.defaultLogLevel=info

# Logging detail level for a SimpleLogger instance named "xxxxx".
# Must be one of ("trace", "debug", "info", "warn", or "error").
# If not specified, the default logging detail level is used.
#org.slf4j.simpleLogger.log.xxxxx=

# Set to true if you want the current date and time to be included in output messages.
# Default is false, and will output the number of milliseconds elapsed since startup.
#org.slf4j.simpleLogger.showDateTime=false

# The date and time format to be used in the output messages.
# The pattern describing the date and time format is the same that is used in java.text.SimpleDateFormat.
# If the format is not specified or is invalid, the default format is used.
# The default format is yyyy-MM-dd HH:mm:ss:SSS Z.
#org.slf4j.simpleLogger.dateTimeFormat=yyyy-MM-dd HH:mm:ss:SSS Z

# Set to true if you want to output the current thread name.
# Defaults to true.
#org.slf4j.simpleLogger.showThreadName=true

# Set to true if you want the Logger instance name to be included in output messages.
# Defaults to true.
#org.slf4j.simpleLogger.showLogName=true

# Set to true if you want the last component of the name to be included in output messages.
# Defaults to false.
#org.slf4j.simpleLogger.showShortLogName=false

1
@RobertHuntこのログをファイルに保存する方法は?
Devavrata 2015年

6
@Devavrataはプロパティを追加しますorg.slf4j.simpleLogger.logFile-ファイルへのパス、または特別な値 "System.out"と "System.err"になる出力ターゲット。デフォルトは「System.err」です。slf4j.org/api/org/slf4j/impl/SimpleLogger.htmlを
Robert Hunt

複数の値を持つことは可能ですか?はいの場合はどうですか?私のようにorg.slf4j.simpleLogger.logFile = test.log、System.err?
LOLWTFasdasd asdad

1
@LOLWTFasdasdasdad残念ながら、単一のターゲット(System.out、System.err、またはファイルへのパス)しかサポートしていません。シンプルに設計されているため、より高度な機能が必要な場合は、Log4JやLogbackなどの完全なロギング実装を検討する必要があります。
ロバートハント

74

システムプロパティを設定することで、プログラムで変更できます。

public class App {

    public static void main(String[] args) {

        System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");

        final org.slf4j.Logger log = LoggerFactory.getLogger(App.class);

        log.trace("trace");
        log.debug("debug");
        log.info("info");
        log.warn("warning");
        log.error("error");

    }
}

ログレベルはERROR> WARN> INFO> DEBUG> TRACEです。

ロガーが作成されると、ログレベルを変更できないことに注意してください。ロギングレベルを動的に変更する必要がある場合は、log4jをSLF4Jとともに使用することができます。


3
「ロガーが作成されると、ログレベルは変更できないことに注意してください。」-これは実際にどこに指定されていますか?
ksl 2015年

2
ksl、org.slf4j.impl.SimpleLogger内。最初のロガーが作成されると、init()メソッドが実行され、システムプロパティからデフォルトのログレベルを取得します。これはどの時点でも更新されません。また、org.slf4j.impl.SimpleLoggerFactoryはクラスのロガーを1回だけ作成するため、指定されたクラス(または名前)に対して常に同じロガーが返されます。ただし、レベルの異なるロガーを使用することは可能です。したがって、可能な回避策は、ロギングレベルを変更するときに、これらの異なるレベルのロガーを「ログ」変数に割り当てることです。それは非常にきちんとした解決策ではありませんが、うまくいくはずです。
eemelipa 2015年

@Eemuli Doc org.slf4j.impl.SimpleLoggerではなく実際のソースコードを意味しますか?
ksl

LOG_FILE_KEYロガーが作成された後もプロパティを変更できないことは本当ですか?
ksl

1
はい、実際のソースコードを意味します。LOG_FILE_KEYについてはわかりません。
eemelipa 2016

4

Eemuliがログレベルを作成した後で変更することはできないと言っていることに気づきました。これは設計である可能性もありますが、完全に真実ではありません。

slf4jにログを記録するライブラリを使用していて、Maven mojoプラグインの作成中にライブラリを使用している状況に遭遇しました。

Mavenはslf4j SimpleLoggerの(ハッキングされた)バージョンを使用しており、自分の制御できるlog4jのようなものにログを再ルーティングするプラグインコードを取得できませんでした。

また、Mavenのログ設定を変更することはできません。

だから、いくつかの騒々しい情報メッセージを静めるために、私はこのようなリフレクションを使用して、実行時にSimpleLoggerでファッツすることができることを発見しました。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.spi.LocationAwareLogger;
    try
    {
        Logger l = LoggerFactory.getLogger("full.classname.of.noisy.logger");  //This is actually a MavenSimpleLogger, but due to various classloader issues, can't work with the directly.
        Field f = l.getClass().getSuperclass().getDeclaredField("currentLogLevel");
        f.setAccessible(true);
        f.set(l, LocationAwareLogger.WARN_INT);
    }
    catch (Exception e)
    {
        getLog().warn("Failed to reset the log level of " + loggerName + ", it will continue being noisy.", e);
    }

もちろん、これは非常に安定した/信頼性の高いソリューションではありません...次回、Mavenの人々がロガーを変更するときに壊れるので注意してください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.