Eu quero usar logs no meu programa. Eu ouvi sobre java.util.logging , mas não sei por onde começar.
Existem exemplos do que posso fazer com o log? Como eu usaria o logon no meu próprio programa?
Eu quero usar logs no meu programa. Eu ouvi sobre java.util.logging , mas não sei por onde começar.
Existem exemplos do que posso fazer com o log? Como eu usaria o logon no meu próprio programa?
Respostas:
java.util.logging
evita que você precise carregar mais um arquivo jar com seu aplicativo e funciona bem com um bom Formatador.
Em geral, no topo de todas as aulas , você deve ter:
private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );
Em seguida, você pode apenas usar vários recursos da classe Logger .
Use Level.FINE
para qualquer coisa que esteja depurando no nível superior do fluxo de execução:
LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );
Use Level.FINER
/ Level.FINEST
dentro de loops e em locais onde nem sempre é necessário ver tantos detalhes ao depurar problemas básicos de fluxo:
LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );
Use as versões parametrizadas dos recursos de registro para não gerar toneladas de lixo de concatenação de String que o GC terá que acompanhar. Object[]
como acima é barato, na alocação de pilha normalmente.
No tratamento de exceções, sempre registre os detalhes completos da exceção:
try {
...something that can throw an ignorable exception
} catch( Exception ex ) {
LOGGER.log( Level.SEVERE, ex.toString(), ex );
}
Eu sempre passo ex.toString()
como mensagem aqui, porque quando " grep -n
" for " Exception
" nos arquivos de log, também posso ver a mensagem. Caso contrário, ele estará na próxima linha de saída gerada pelo despejo de pilha, e você precisará ter um RegEx mais avançado para corresponder a essa linha também, o que geralmente gera mais saída do que você precisa olhar.
.fine()
método para iniciar sessão, mas eu não consigo fazer as mensagens exibir ...
Deve declarar o logger como este:
private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());
portanto, se você refatorar o nome da sua classe, a seguir.
Escrevi um artigo sobre java logger com exemplos aqui .
Existem muitos exemplos e também de diferentes tipos de log. Dê uma olhada no pacote java.util.logging .
Código de exemplo:
import java.util.logging.Logger;
public class Main {
private static Logger LOGGER = Logger.getLogger("InfoLogging");
public static void main(String[] args) {
LOGGER.info("Logging an INFO-level message");
}
}
Sem codificar o nome da classe :
import java.util.logging.Logger;
public class Main {
private static final Logger LOGGER = Logger.getLogger(
Thread.currentThread().getStackTrace()[0].getClassName() );
public static void main(String[] args) {
LOGGER.info("Logging an INFO-level message");
}
}
Main.class.getSimpleName()
? Dessa forma, a ferramenta de refatoração irá alterá-la corretamente, se necessário, e, no entanto, não é tão desajeitada quanto a sua segunda solução.
O SLF4J é uma fachada de registro melhor que o Apache Commons Logging (ACL). Possui pontes para outras estruturas de registro, fazendo chamadas diretas para o ACL, Log4J ou Java Util Logging através do SLF4J, para que você possa direcionar toda a saída para um arquivo de log, se desejar, com apenas um arquivo de configuração de log. Por que seu aplicativo usaria várias estruturas de log? Como as bibliotecas de terceiros que você usa, especialmente as mais antigas, provavelmente usam.
O SLF4J suporta várias implementações de log. Ele pode enviar tudo para o padrão, usar o Log4J ou o Logback (recomendado sobre o Log4J).