Cómo configurar slf4j-simple
api 1.7 y slf4j-simple como implementación. Simplemente no encuentro cómo configurar el nivel de registro con esta combinación.
¿Alguien puede ayudar?
Es a través de la propiedad del sistema
-Dorg.slf4j.simpleLogger.defaultLogLevel=debug
o simplelogger.properties
archivo en el classpath
consulte https://www.slf4j.org/api/org/slf4j/simple/SimpleLogger.html para obtener más detalles
Este es un ejemplo simplelogger.properties
que puede colocar en el classpath (descomenta las propiedades que deseas usar):
# 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
En un proyecto Maven o Gradle, un lugar conveniente "en el classpath" es src/main/resources/simplelogger.properties
.
Puede cambiarlo mediante programación configurando la propiedad del sistema:
public class App {
public static void main(String[] args) {
// for the code below to work, it must be executed before the
// logger is created. see note below
System.setProperty(org.slf4j.impl.SimpleLogger.DEFAULT_LOG_LEVEL_KEY, "TRACE");
org.slf4j.Logger log = LoggerFactory.getLogger(App.class);
log.trace("trace");
log.debug("debug");
log.info("info");
log.warn("warning");
log.error("error");
}
}
Los niveles de registro son ERROR
> WARN
> INFO
> DEBUG
> TRACE
.
Tenga en cuenta que una vez creado el registrador, el nivel de registro no se puede cambiar. Si necesita cambiar dinámicamente el nivel de registro, es posible que desee utilizar log4j con SLF4J.
Noté que Eemuli dijo que no se puede cambiar el nivel de registro después de crearlo, y si bien ese podría ser el diseño, no es del todo cierto.
Me encontré con una situación en la que estaba usando una biblioteca que se registró en slf4j, y estaba usando la biblioteca mientras escribía un complemento maven mojo.
Maven usa una versión (pirateada) de slf4j SimpleLogger y no pude obtener el código de mi complemento para redirigir su registro a algo como log4j, que podía controlar.
Y no puedo cambiar la configuración de registro de Maven.
Entonces, para silenciar algunos mensajes de información ruidosos, descubrí que podía usar una reflexión como esta, para interactuar con SimpleLogger en tiempo de ejecución.
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);
}
Por supuesto, tenga en cuenta que esta no es una solución muy estable/confiable... ya que se romperá la próxima vez que los expertos cambien su registrador.