Как настроить 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
, работает нормально. Я надеюсь, что это может помочь некоторым людям.