Ao usar log4j, o Logger.log(Priority p, Object message)
método está disponível e pode ser usado para registrar uma mensagem em um nível de registro determinado no tempo de execução. Estamos usando esse fato e esta dica para redirecionar stderr para um logger em um nível de log específico.
slf4j não tem um log()
método genérico que eu possa encontrar. Isso significa que não há como implementar o acima?
slf4j 2.0
. jira.qos.ch/browse/SLF4J-124 Veja minha resposta para detalhes e para uma possívelslf4j 1.x
solução.Respostas:
Não há como fazer isso
slf4j
.Eu imagino que a razão pela qual essa funcionalidade está faltando é que é quase impossível construir um
Level
tipo paraslf4j
que possa ser mapeado com eficiência para o tipoLevel
(ou equivalente) usado em todas as implementações de log por trás da fachada. Como alternativa, os designers decidiram que seu caso de uso é muito incomum para justificar as despesas gerais de suportá-lo.Em relação @ ripper234 's de casos de uso (teste de unidade), eu acho que a solução pragmática é modificar o teste de unidade (s) ao conhecimento hard-wire do que sistema de registro está por trás da fachada slf4j ... ao executar os testes de unidade.
fonte
org.slf4j.Logger
: debug, error, info, trace, warn.Richard Fearn teve a ideia certa, então escrevi a classe completa com base em seu código de esqueleto. Espero que seja curto o suficiente para postar aqui. Copie e cole para se divertir. Eu provavelmente deveria adicionar algum encantamento mágico também: "Este código foi lançado para o domínio público"
fonte
Tente mudar para Logback e use
Acredito que esta será a única chamada para Logback e o resto do seu código permanecerá inalterado. O Logback usa SLF4J e a migração será fácil, apenas os arquivos de configuração xml terão que ser alterados.
Lembre-se de definir o nível de registro de volta depois de terminar.
fonte
Você pode implementar isso usando Java 8 lambdas.
fonte
LevelLogger
), o que não é bom porque geralmente é uma informação muito útil.Isso pode ser feito com um
enum
método auxiliar e:Você poderia adicionar outras variantes de
log
, digamos, se você quisesse equivalentes genéricos de 1 parâmetro ou 2 parâmetro de SLF4Jwarn
/error
/ etc. métodos.fonte
Qualquer um que queira uma solução totalmente compatível com SLF4J para este problema pode dar uma olhada nas extensões Lidalia SLF4J - está no Maven Central.
fonte
Eu só precisava de algo assim e vim com:
uso:
O logger é passado durante a invocação, então as informações da classe devem estar corretas e funciona bem com a anotação @ Slf4j lombok.
fonte
DEBUG
está faltando como constante.LogLevel
como classe elog
como método, o que torna os logs menos significativos.É não possível especificar um nível de log em sjf4j
1.x
fora da caixa. Mas há esperança para o slf4j2.0
corrigir o problema . Na versão 2.0, pode ser assim:Enquanto isso, para slf4j 1.x, você pode usar esta solução alternativa:
Copie esta classe em seu classpath:
Então você pode usá-lo assim:
Isso produzirá um registro como este:
Vale a pena?
LogLevel
O código-fonte como exemplo mínimo está hospedado no GitHub .
fonte
LogMethod
interface precisa ser pública para funcionar com classes fora de seu pacote. Fora isso, funciona conforme o planejado. Obrigado!Não é possível com a API slf4j alterar dinamicamente o nível de log, mas você pode configurar o logback (se usar) por conta própria. Nesse caso, crie uma classe de fábrica para seu logger e implemente o logger root com a configuração necessária.
Depois de configurar o logger root (apenas uma vez é suficiente), você pode delegar a obtenção de um novo logger
Lembre-se de usar o mesmo
loggerContext
.Alterar o nível de log é fácil de fazer com o logger root fornecido em
loggerContext
.fonte
Confirme a resposta Ondrej Skopek
Você obterá o resultado:
fonte
Acabo de encontrar uma necessidade semelhante. No meu caso, slf4j é configurado com o adaptador de registro java (o jdk14). Usando o seguinte snippet de código, consegui alterar o nível de depuração em tempo de execução:
fonte
Com base na resposta de massimo virgilio, também consegui fazer isso com slf4j-log4j usando introspecção. HTH.
fonte
Aqui está uma solução lambda não tão amigável quanto a de @Paul Croarkin de uma maneira (o nível é efetivamente passado duas vezes). Mas acho que (a) o usuário deve passar no Logger; e (b) AFAIU a questão original não era pedir uma maneira conveniente para todos os lugares do aplicativo, apenas uma situação com poucos usos dentro de uma biblioteca.
Como slf4j permite um Throwable (cujo rastreamento de pilha deve ser registrado) dentro do parâmetro varargs , acho que não há necessidade de sobrecarregar o
log
método auxiliar para outros consumidores além de(String, Object[])
.fonte
Consegui fazer isso para a ligação JDK14 solicitando primeiro a instância SLF4J Logger e, em seguida, definindo o nível na ligação - você pode tentar isso para a ligação Log4J.
fonte
O método que utilizo é importar os módulos ch.qos.logback e, em seguida, fazer o cast da instância slf4j Logger em um ch.qos.logback.classic.Logger. Esta instância inclui um método setLevel ().
Para descobrir os níveis de Logging possíveis, você pode explodir a classe ch.qos.logback para ver todos os valores possíveis para Nível :
Os resultados são os seguintes:
fonte
usando a introspecção java, você pode fazer isso, por exemplo:
fonte
não, tem vários métodos, info (), debug (), warn (), etc (isso substitui o campo de prioridade)
dê uma olhada em http://www.slf4j.org/api/org/slf4j/Logger.html para a API Logger completa.
fonte