Cómo configurar slf4j-simple


Respuestas:


218

Es a través de la propiedad del sistema

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

o simplelogger.propertiesarchivo en el classpath

ver http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html para más detalles


gracias configuré "org.slf4j.simpleLogger.defaultLogLevel" a "error" en System.properties, sin embargo, slf4j todavía registra mensajes de nivel INFO. ¿Alguna idea? Por cierto, ¿dónde debo poner simplelogger.properties?
Gelin Luo

2
prueba org.slf4j.simplelogger.defaultlog en lugar de org.slf4j.simpleLogger.defaultLogLevel. El archivo debe estar en el classpath, paquete predeterminado
Evgeniy Dorofeev

2
En realidad funciona ( defaultLogLevel). Acabo de descubrir que estaba modificando el programa en una carpeta incorrecta ;-) Y defaultlogno funciona. Así que probablemente quieras editar tu respuesta aunque la haya aceptado
Gelin Luo

11
Solo una nota: en realidad ambas respuestas son buenas, dependiendo de la versión de SimpleLogger que esté utilizando. Por ejemplo, defaultLogLevel funciona para 1.7.5, pero defaultlog funciona para 1.6.6. Descubrí esto cuando configuré el registro de mi proyecto y me encontré con esta publicación
Ken Shih,

112

Esta es una muestra simplelogger.propertiesque puede colocar en el classpath (descomente las propiedades que desea 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

1
@RobertHunt ¿Cómo guardar este registro en el archivo?
Devavrata

66
@Devavrata agrega la propiedad org.slf4j.simpleLogger.logFile: el destino de salida que puede ser la ruta a un archivo o los valores especiales "System.out" y "System.err". El valor predeterminado es "System.err". Ver slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt

¿Es posible tener múltiples valores? Si es así, ¿cómo? Como si quisiera org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad

1
@LOLWTFasdasdasdad Desafortunadamente no, solo admite objetivos individuales, ya sea System.out, System.err o una ruta a un archivo. Está diseñado para ser simple, debe considerar una implementación de registro completa como Log4J o Logback si desea funciones más avanzadas.
Robert Hunt

75

Puede cambiarlo programáticamente configurando la propiedad del sistema:

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");

    }
}

Los niveles de registro son ERROR> WARN> INFO> DEBUG> TRACE.

Tenga en cuenta que una vez que se crea el registrador, el nivel de registro no se puede cambiar. Si necesita cambiar dinámicamente el nivel de registro, puede utilizar log4j con SLF4J.


3
"Tenga en cuenta que una vez que se crea el registrador, el nivel de registro no se puede cambiar". - ¿Dónde se especifica esto realmente?
ksl

2
ksl, en org.slf4j.impl.SimpleLogger. Cuando se crea el primer registrador, se ejecuta el método init () y obtiene el nivel de registro predeterminado de las propiedades del sistema. Esto no se actualiza en ningún momento. Además, org.slf4j.impl.SimpleLoggerFactory crea un registrador para una clase solo una vez, por lo tanto, siempre se devuelve el mismo registrador para una clase (o nombre) dada. Sin embargo, es posible tener registradores con diferentes niveles. Entonces, una posible solución podría ser que asigne estos registradores de nivel diferentes a su variable "log" cuando desee cambiar el nivel de registro. No es una solución muy ordenada, pero debería funcionar.
eemelipa

@Eemuli ¿ org.slf4j.impl.SimpleLoggerQuieres decir el código fuente real en lugar de doc?
ksl

¿También es cierto que la LOG_FILE_KEYpropiedad no se puede cambiar una vez que se crea el registrador?
ksl

1
Sí, me refiero al código fuente real. No estoy seguro acerca de LOG_FILE_KEY.
eemelipa

4

Me di cuenta de que Eemuli dijo que no se puede cambiar el nivel de registro después de que se crean, 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 inició sesión 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 mi código de complemento para redirigir su registro a algo como log4j, que podría controlar.

Y no puedo cambiar la configuración de registro de Maven.

Entonces, para calmar algunos mensajes de información ruidosos, descubrí que podía usar una reflexión como esta, para futz con el 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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.