Як налаштувати slf4j-simple


Відповіді:


218

Це або через власність системи

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

або simplelogger.propertiesфайл на класі

див. http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html для отримання детальної інформації


дякую, що я встановив "org.slf4j.simpleLogger.defaultLogLevel" на "помилку" в System.properties, проте slf4j все ще реєструє повідомлення рівня ІНФО. Будь-яка ідея? До речі, де я повинен розмістити simplelogger.properties?
Гелін Луо

2
спробуйте org.slf4j.simplelogger.defaultlog замість org.slf4j.simpleLogger.defaultLogLevel. Файл повинен бути на уроці, пакет за замовчуванням
Євгеній Дорофєєв,

2
Насправді це ( defaultLogLevel) працює. Просто знайшли, що я змінював програму в неправильній папці ;-) І defaultlogне працює. Тож ви, мабуть, хочете відредагувати свою відповідь, хоча я її прийняв
Гелін Луо

11
Лише зауваження: насправді обидві відповіді хороші, залежно від версії SimpleLogger, яку ви використовуєте. Наприклад, defaultLogLevel працює для 1.7.5, але defaultlog працює для 1.6.6. Про це я дізнався, коли налаштовував свій журнал проектів і заходив на цю посаду
Кен Ших

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 Як зберегти цей логін у файл?
Деваврата

6
@Devavrata додати властивість org.slf4j.simpleLogger.logFile- ціль виводу, яка може бути шлях до файлу, або спеціальні значення "System.out" та "System.err". За замовчуванням - "System.err". Дивіться slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Роберт Хант

Чи можливо мати кілька значень? Якщо так, то як? Наче я хочу 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");

    }
}

Рівень журналу - ПОМИЛКА> ЗАПЕРЕДЖЕННЯ> ІНФОРМАЦІЯ> ВІДМІТКА> ТРАС.

Зауважте, що після створення реєстратора рівень журналу не може бути змінений. Якщо вам потрібно динамічно змінити рівень реєстрації, можливо, ви хочете використовувати log4j зі SLF4J.


3
"Зауважте, що після створення журналу рівень журналу не може бути змінений." - Де це фактично вказано?
ksl

2
ksl, в org.slf4j.impl.SimpleLogger. Коли створено перший реєстратор, запускається метод init () і він вибирає рівень реєстрації за замовчуванням із властивостей системи. Це не оновлюється в будь-який момент. Також org.slf4j.impl.SimpleLoggerFactory створює реєстратор для класу лише один раз, таким чином, той самий реєстратор завжди повертається для даного класу (або імені). Однак можливо мати реєстратори різного рівня. Таким можливим вирішенням може бути те, що ви призначаєте ці реєстратори різних рівнів своїй змінній "log", коли ви хочете змінити рівень журналу. Це не дуже охайне рішення, але має працювати.
eemelipa

@Eemuli org.slf4j.impl.SimpleLoggerВи маєте на увазі фактичний вихідний код, а не doc?
ksl

Чи правда також, що LOG_FILE_KEYвластивість не можна змінити як тільки створити реєстратор?
ksl

1
Так, я маю на увазі фактичний вихідний код. Я не впевнений у LOG_FILE_KEY.
eemelipa

4

Я помітив, що Еемулі сказав, що ви не можете змінити рівень журналу після їх створення - і хоча це може бути дизайн, це не зовсім правда.

Я зіткнувся з ситуацією, коли я використовував бібліотеку, яка ввійшла до 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, змінять свій реєстратор.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.