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?
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?
Risposte:
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.FINE
per 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.FINEST
all'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.
.fine()
metodo per accedere, ma non riesco a visualizzare i messaggi ...
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 .
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");
}
}
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.
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).