Como configurar slf4j-simple


Respostas:


218

É através da propriedade do sistema

-Dorg.slf4j.simpleLogger.defaultLogLevel=debug

ou simplelogger.propertiesarquivo no caminho de classe

consulte http://www.slf4j.org/api/org/slf4j/impl/SimpleLogger.html para obter detalhes


obrigado, configurei "org.slf4j.simpleLogger.defaultLogLevel" para "error" em System.properties, no entanto, slf4j ainda registra mensagens no nível INFO. Qualquer ideia? BTW, onde devo colocar simplelogger.properties?
Gelin Luo

2
tente org.slf4j.simplelogger.defaultlog em vez de org.slf4j.simpleLogger.defaultLogLevel. O arquivo deve estar no caminho de classe, pacote padrão
Evgeniy Dorofeev

2
Na verdade, ele funciona. defaultLogLevelApenas descobri que estava modificando o programa em uma pasta errada ;-) E defaultlognão funciona. Então você provavelmente quer editar sua resposta, embora eu a aceite
Gelin Luo

11
Apenas uma observação: na verdade, as duas respostas são boas, dependendo da versão do SimpleLogger que você está usando. Por exemplo, defaultLogLevel funciona para 1.7.5, mas defaultlog funciona para 1.6.6. Descobri isso ao configurar meu registro de projeto e vindo sobre este post
Ken Shih

112

Este é um exemplo simplelogger.propertiesque você pode colocar no caminho de classe (remova o comentário das propriedades que deseja 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 Como salvar este log no arquivo?
Devavrata

6
@Devavrata add the property org.slf4j.simpleLogger.logFile- O destino de saída que pode ser o caminho para um arquivo ou os valores especiais "System.out" e "System.err". O padrão é "System.err". Veja slf4j.org/api/org/slf4j/impl/SimpleLogger.html
Robert Hunt

É possível ter vários valores? Se sim, como? Como eu quero org.slf4j.simpleLogger.logFile = test.log, System.err?
LOLWTFasdasd asdad

1
@LOLWTFasdasdasdad Infelizmente não, ele suporta apenas destinos únicos, System.out, System.err ou o caminho para um arquivo. Ele foi projetado para ser simples; você deve considerar uma implementação completa de log como Log4J ou Logback, se desejar recursos mais avançados.
Robert Hunt

74

Você pode alterá-lo programaticamente, definindo a propriedade do 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");

    }
}

Os níveis de log são ERRO> WARN> INFO> DEBUG> TRACE.

Observe que, uma vez criado o logger, o nível do log não pode ser alterado. Se você precisar alterar dinamicamente o nível de criação de log, convém usar o log4j com o SLF4J.


3
"Observe que, uma vez criado o logger, o nível do log não pode ser alterado." - Onde isso é realmente especificado?
ksl

2
ksl, em org.slf4j.impl.SimpleLogger. Quando o primeiro criador de logs é criado, o método init () é executado e busca o nível de log padrão nas propriedades do sistema. Isso não é atualizado a qualquer momento. Além disso, org.slf4j.impl.SimpleLoggerFactory cria um criador de logs para uma classe apenas uma vez, portanto, o mesmo criador sempre é retornado para uma determinada classe (ou nome). No entanto, é possível ter loggers com níveis diferentes. A solução alternativa possível seria atribuir esses registradores de nível diferente à sua variável "log" quando desejar alterar o nível de registro. Não é uma solução muito elegante, mas deve funcionar.
eemelipa

@Eemuli org.slf4j.impl.SimpleLoggerVocê quer dizer o código fonte real em vez de doc?
ksl

Também é verdade que a LOG_FILE_KEYpropriedade também não pode ser alterada depois que o criador de logs é criado?
ksl

1
Sim, quero dizer o código fonte real. Não tenho certeza sobre LOG_FILE_KEY.
eemelipa

4

Percebi que o Eemuli disse que não é possível alterar o nível do log depois que eles são criados - e, embora esse possa ser o design, não é totalmente verdade.

Eu me deparei com uma situação em que estava usando uma biblioteca que fazia logon no slf4j - e estava usando a biblioteca enquanto escrevia um plugin maven mojo.

O Maven usa uma versão (hackeada) do slf4j SimpleLogger, e não consegui que o código do meu plugin redirecionasse seu log para algo como log4j, que eu poderia controlar.

E não consigo alterar a configuração do maven logging.

Portanto, para acalmar algumas mensagens informativas ruidosas, descobri que poderia usar reflexos como este para fazer futz com o SimpleLogger em tempo de execução.

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

Obviamente, note que essa não é uma solução muito estável / confiável ... pois ela será quebrada na próxima vez em que o pessoal do setor trocar de registrador.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.