Как настроить slf4j-просто

166

API 1.7 и slf4j-просто как реализация. Я просто не могу найти, как настроить уровень ведения журнала с помощью этой комбинации.

Кто-нибудь может помочь?

Гелин Ло
источник
По умолчанию INFO на стандартный вывод, FWIW: saltnlight5.blogspot.com/2013/08/...
rogerdpack

Ответы:

218

Это либо через системное свойство

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

или simplelogger.propertiesфайл на пути к классам

см. http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html для получения подробной информации.

Евгений Дорофеев
источник
спасибо, я установил «org.slf4j.simpleLogger.defaultLogLevel» в «error» в System.properties, однако slf4j все еще регистрирует сообщения уровня INFO. Любая идея? Кстати, где я должен положить 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 add the property 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, если вам нужны более продвинутые функции.
Роберт Хант
75

Вы можете программно изменить его, установив системное свойство:

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.

eemelipa
источник
3
«Обратите внимание, что после создания регистратора уровень журнала не может быть изменен». - Где это на самом деле указано?
Ksl
2
ksl, в org.slf4j.impl.SimpleLogger. Когда создается первый регистратор, запускается метод init (), который выбирает уровень ведения журнала по умолчанию из системных свойств. Это не обновляется в любой момент. Кроме того, org.slf4j.impl.SimpleLoggerFactory создает регистратор для класса только один раз, таким образом, один и тот же регистратор всегда возвращается для данного класса (или имени). Однако возможно наличие регистраторов с другим уровнем. Поэтому возможный обходной путь может заключаться в том, что вы назначаете эти различные регистраторы уровня своей переменной «log», когда хотите изменить уровень ведения журнала. Это не очень аккуратное решение, но должно работать.
eemelipa
@Eemuli org.slf4j.impl.SimpleLoggerВы имеете в виду фактический исходный код, а не документ?
ksl
Также верно, что LOG_FILE_KEYсвойство не может быть изменено после создания регистратора?
ksl
1
Да, я имею в виду фактический исходный код. Я не уверен насчет LOG_FILE_KEY.
eemelipa
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);
    }

Конечно, обратите внимание, что это не очень стабильное / надежное решение ... так как оно сломается в следующий раз, когда мавенцы поменяют свой регистратор.

user2163960
источник