Bons exemplos usando java.util.logging [fechado]

273

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?

Renato Dinhani
fonte
7
Você pode começar aqui: slf4j.org/manual.html
Jeremy
1
Eu concordo com Steven Vascellaro. Estou cansado de ver itens úteis destruídos por causa do policiamento de tópicos sem fim prático. Além disso, discorde respeitosamente de Jeremy, pois o OP perguntou sobre java.util.logging. Também estou interessado na exploração madeireira nativa (obrigado pela resposta, grwww!)
NOP
Para registrar dados em uma linha: log.log (Level.INFO, "Minha mensagem {0}", novo Object [] {myDataId});
Mitja Gustin

Respostas:

335

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.FINEpara 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.FINESTdentro 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.

grwww
fonte
3
Isso grava em um arquivo de algum tipo. Ainda não consegui fazê-lo funcionar no meu programa. Eu tenho a linha inicial que você tem, mas nada foi trabalhado até agora.
Doug Hauf
5
Como você visualiza os logs? Uma biblioteca que estou usando inicializa Logger objetos e usa o .fine()método para iniciar sessão, mas eu não consigo fazer as mensagens exibir ...
Anubian Noob
7
Venho programando em Java desde 1998. Sempre achei o logon em Java muito mais complicado do que deveria. Essa é de longe a explicação mais direta de como fazer login em Java que eu já li. Conciso também.
21415 Steve McLeod
30
É interessante que ninguém tenha mencionado, onde é possível encontrar os arquivos de log.
Ahmedov 22/06
4
Se você está se perguntando para onde vão os logs, verifique se configurou um manipulador para o criador de logs. Para simplesmente gerar logs para o console, use um novo ConsoleHandler e adicione-o ao seu logger usando o método addHandler. Certifique-se de chamar setLevel no criador de logs e no manipulador.
Craig Brown
67

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 .

hanoo
fonte
53

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");
  }
}
Ankit
fonte
15
Por que não definir o nome do log como 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.
Pijusn 6/03/03
3
Fazer um rastreamento de pilha para um nome de criador de logs é hack, lento e pouco ortodoxo. Ele também quebrará e fornecerá nomes estranhos para proxies de AOP ou outros códigos de bytes extraordinários.
Adam Gent
9
-1 para o negócio de stacktrace. É lento e potencialmente impede otimizações do compilador.
Phooji
4
Por que a "lentidão" é importante ao inicializar o criador de logs? Menções à lentidão são o que a maioria das pessoas chamaria de otimização prematura (Sim, o código parece um pouco hackiano).
Mikkom
3
@AndrewMcKinlay Em que situação isso quebra alguma coisa? Se a tag do logger deve ser igual ao nome da classe, parece perfeitamente adequado fazê-lo. As ferramentas de refatoração irão renomeá-lo automaticamente enquanto, se for uma sequência codificada, a ferramenta de refatoração poderá ignorá-lo ou dizer "Você também deseja renomear isso?".
Pijusn
23

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).

http://www.slf4j.org/

http://logback.qos.ch/

bcody
fonte
9

Eu usaria minlog , pessoalmente. É extremamente simples, pois a classe de log é de algumas centenas de linhas de código.

Chris Dennett
fonte
3
Para um espaço mínimo, essa é a biblioteca que você deve escolher.
H3xStream
0

Eu sugeriria que você usasse o utilitário de log comum do Apache. É altamente escalável e suporta arquivos de log separados para diferentes registradores. Veja aqui .

nIKUNJ
fonte
11
Boa sugestão! no entanto, tente responder o que eles pedem, caso contrário, deixe um comentário;)
Ordiel