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

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

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

5 ответов

Решение

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

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

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

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

Это образец 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

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

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.

Я заметил, что 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);
    }

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

Я не знаю почему. я использую иorg.slf4j.simpleLogger.showDatetime, это не работает.

Я просматриваю исходный код класса SimpleLogger и получаю эту часть кода

      static {
      // Add props from the resource simplelogger.properties
      InputStream in = (InputStream)AccessController.doPrivileged(
              new PrivilegedAction() {
                  public Object run() {
                      ClassLoader threadCL = Thread.currentThread().getContextClassLoader();
                      if (threadCL != null) {
                          return threadCL.getResourceAsStream(CONFIGURATION_FILE);
                      } else {
                          return ClassLoader.getSystemResourceAsStream(CONFIGURATION_FILE);
                      }
                  }
              });
      if(null != in) {
          try {
              simpleLoggerProps.load(in);
              in.close();
          } catch(java.io.IOException e) {
              // ignored
          }
      }

      showLogName    = getBooleanProperty(systemPrefix + "showlogname",      showLogName);
      showShortName  = getBooleanProperty(systemPrefix + "showShortLogname", showShortName);
      showDateTime   = getBooleanProperty(systemPrefix + "showdatetime",     showDateTime);
      showThreadName = getBooleanProperty(systemPrefix + "showthreadname",   showThreadName);
      dateTimeFormat = getStringProperty(systemPrefix + "dateTimeFormat",    dateTimeFormat);

      if(showDateTime) {
          try {
              dateFormatter = new SimpleDateFormat(dateTimeFormat);
          } catch(IllegalArgumentException e) {
              Util.report("Bad date format in " + CONFIGURATION_FILE + "; reverting to default", e);
              // If the format pattern is invalid - use the default format
              dateTimeFormat = DEFAULT_DATE_TIME_FORMAT;
              dateFormatter = new SimpleDateFormat(dateTimeFormat);
          }
      }
  }

systemPrefix + "showdatetime"являетсяorg.slf4j.simplelogger.showdatetimeКогда я пытаюсь написатьorg.slf4j.simplelogger.showdatetime=trueкsimplelogger.properties, работает нормально. Я надеюсь, что это может помочь некоторым людям.

Другие вопросы по тегам