Buoni esempi con java.util.logging [chiuso]


273

Voglio usare i registri nel mio programma. Ho sentito parlare di java.util.logging , ma non so come iniziare.

Ci sono esempi di cosa posso fare con la registrazione? Come utilizzerei la registrazione nel mio programma?


7
Puoi iniziare qui: slf4j.org/manual.html
Jeremy,

1
Sono d'accordo con Steven Vascellaro. Sono stanco di vedere gli oggetti utili distrutti a causa della polemica degli argomenti senza fine pratico. Inoltre, rispettosamente in disaccordo con Jeremy, poiché OP ha chiesto di java.util.logging. Sono anche interessato alla registrazione nativa (grazie per la risposta, grwww!)
NOP

Per registrare i dati in una riga: log.log (Level.INFO, "Il mio messaggio {0}", nuovo oggetto [] {myDataId});
Mitja Gustin,

Risposte:


335

java.util.logging ti impedisce di dover salvare un altro file jar con la tua applicazione, e funziona bene con un buon Formatter.

In generale, ai vertici di ogni classe , dovresti avere:

private static final Logger LOGGER = Logger.getLogger( ClassName.class.getName() );

Quindi, puoi semplicemente usare varie strutture della classe Logger .


Utilizzare Level.FINEper tutto ciò che è il debug al livello più alto del flusso di esecuzione:

LOGGER.log( Level.FINE, "processing {0} entries in loop", list.size() );

Utilizzare Level.FINER/ Level.FINESTall'interno dei loop e in luoghi in cui potrebbe non essere sempre necessario visualizzare molti dettagli durante il debug dei problemi di flusso di base:

LOGGER.log( Level.FINER, "processing[{0}]: {1}", new Object[]{ i, list.get(i) } );

Utilizzare le versioni parametrizzate delle strutture di registrazione per evitare di generare tonnellate di immondizia di concatenazione di stringhe con cui GC dovrà tenere il passo. Object[]come sopra è economico, in genere nell'allocazione dello stack.


Con la gestione delle eccezioni, registra sempre i dettagli completi dell'eccezione:

try {
    ...something that can throw an ignorable exception
} catch( Exception ex ) {
    LOGGER.log( Level.SEVERE, ex.toString(), ex );
}

Passo sempre ex.toString()come messaggio qui, perché quando " grep -n" per " Exception" nei file di registro riesco a vedere anche il messaggio. Altrimenti, si troverà sulla riga successiva di output generata dal dump dello stack e devi avere un RegEx più avanzato per abbinare anche quella riga, che spesso ti dà più output di quello che devi guardare.


3
Questo scrive su un file di qualche tipo. Non riuscivo ancora a farlo funzionare nel mio programma. Ho la linea iniziale che hai ma nulla è stato lavorato finora.
Doug Hauf,

5
Come visualizzi i registri? Una libreria che sto utilizzando inizializza gli oggetti Logger e utilizza il .fine()metodo per accedere, ma non riesco a visualizzare i messaggi ...
Anubian Noob

7
Ho programmato in Java dal 1998. Ho sempre trovato che il logging in Java era molto più di un mal di testa di quanto fosse necessario. Questa è di gran lunga la spiegazione più semplice di come accedere a Java che ho letto. Anche conciso.
Steve McLeod,

30
È interessante che nessuno abbia menzionato, dove è possibile trovare i file di registro.
Ahmedov,

4
Se ti stai chiedendo dove vanno i registri, assicurati di aver impostato un gestore per il logger. Per inviare semplicemente i registri alla console, utilizzare un nuovo ConsoleHandler e aggiungerlo al registratore utilizzando il metodo addHandler. Assicurati di chiamare setLevel sia sul logger che sul gestore.
Craig Brown,

67

Dovrebbe dichiarare il logger in questo modo:

private final static Logger LOGGER = Logger.getLogger(MyClass.class.getName());

quindi se rifatti il ​​nome della tua classe, ne consegue.

Ho scritto un articolo sul logger Java con esempi qui .


53

Esistono molti esempi e anche di tipi diversi per la registrazione. Dai un'occhiata al pacchetto java.util.logging .

Codice di esempio:

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

Senza codificare il nome della 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");
  }
}

15
Perché non impostare il nome registro come Main.class.getSimpleName()? In questo modo lo strumento di refactoring lo cambierà correttamente se necessario e, tuttavia, non è così grosso come la tua seconda soluzione.
Pijusn,

3
Fare uno stack stack per un nome logger è hack, lento e poco ortodosso. Si romperà anche e ti darà nomi strani per proxy AOP o altri straordinari codificatori di byte.
Adam Gent,

9
-1 per il settore stacktrace. È lento e potenzialmente impedisce l'ottimizzazione del compilatore.
phooji,

4
Perché la "lentezza" è importante quando si inizializza il logger? Le menzioni di lentezza sono ciò che la maggior parte delle persone chiamerebbe ottimizzazione prematura (Sì, il codice sembra un po 'hacker).
Mikkom,

3
@AndrewMcKinlay In quale situazione si rompe qualcosa? Se si suppone che il tag logger sia lo stesso del nome della classe, sembra perfettamente che lo faccia. Gli strumenti di refactoring lo rinomineranno automaticamente mentre, se fosse una stringa codificata, lo strumento di refactoring potrebbe saltarlo o dire "Vuoi anche rinominarlo?".
Pijusn,

23

SLF4J è una facciata di registrazione migliore di Apache Commons Logging (ACL). Ha ponti verso altri framework di registrazione, facendo chiamate dirette a ACL, Log4J o Java Util Logging tramite SLF4J, in modo da poter indirizzare tutto l'output a un file di registro, se lo si desidera, con un solo file di configurazione del registro. Perché l'applicazione dovrebbe utilizzare più framework di registrazione? Perché probabilmente le librerie di terze parti che usi, specialmente quelle più vecchie.

SLF4J supporta varie implementazioni di registrazione. Può produrre tutto in modalità standard, usare Log4J o Logback (consigliato su Log4J).

http://www.slf4j.org/

http://logback.qos.ch/


9

Userei minlog , personalmente. È estremamente semplice, poiché la classe di registrazione è composta da poche centinaia di righe di codice.


3
Per un ingombro minimo, questa è la libreria da scegliere.
h3xStream

0

Suggerirei di utilizzare l'utilità di registrazione dei beni comuni di Apache. È altamente scalabile e supporta file di registro separati per diversi logger. Vedi qui .


11
Buon consiglio! cerca comunque di rispondere a ciò che chiedono, altrimenti lascia un commento;)
Ordiel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.