Gute Beispiele mit java.util.logging [geschlossen]

273

Ich möchte Protokolle in meinem Programm verwenden. Ich habe von java.util.logging gehört, weiß aber nicht, wie ich anfangen soll.

Gibt es Beispiele dafür, was ich mit der Protokollierung tun kann? Wie würde ich die Protokollierung in meinem eigenen Programm verwenden?

Renato Dinhani
quelle
7
Sie können hier beginnen: slf4j.org/manual.html
Jeremy
1
Ich stimme Steven Vascellaro zu. Ich bin es leid zu sehen, dass hilfreiche Gegenstände zerstört werden, weil die Themenüberwachung kein praktisches Ende hat. Darüber hinaus widersprechen Sie Jeremy respektvoll, da OP nach java.util.logging gefragt hat. Ich interessiere mich auch für native Protokollierung (danke für die Antwort, grwww!)
NOP
So protokollieren Sie Daten in einer Zeile: log.log (Level.INFO, "Meine Nachricht {0}", neues Objekt [] {myDataId});
Mitja Gustin

Antworten:

335

java.util.logging verhindert, dass Sie eine weitere JAR-Datei mit Ihrer Anwendung herumtragen müssen, und dies funktioniert gut mit einem guten Formatierer.

Im Allgemeinen sollten Sie an der Spitze jeder Klasse Folgendes haben:

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

Dann können Sie einfach verschiedene Funktionen der Logger- Klasse verwenden.


Verwenden Sie Level.FINEfür alles , was ist das Debuggen auf der obersten Ebene der Ausführungsablauf:

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

Verwenden Sie Level.FINER/ Level.FINESTinnerhalb von Schleifen und an Stellen, an denen Sie beim Debuggen grundlegender Ablaufprobleme möglicherweise nicht immer so viele Details sehen müssen:

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

Verwenden Sie die parametrisierten Versionen der Protokollierungsfunktionen, um zu verhindern, dass Tonnen von String-Verkettungsmüll generiert werden, mit dem GC Schritt halten muss. Object[]wie oben ist billig, auf der Stapelzuordnung in der Regel.


Protokollieren Sie bei der Ausnahmebehandlung immer die vollständigen Ausnahmedetails:

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

Ich übergebe hier immer ex.toString()die Nachricht, denn wenn ich dann in Protokolldateien " grep -n" für " Exception" bin, kann ich die Nachricht auch sehen. Andernfalls wird es in der nächsten Ausgabezeile angezeigt, die vom Stapelspeicherauszug generiert wird, und Sie müssen über ein erweitertes RegEx verfügen, um auch dieser Zeile zu entsprechen. Dadurch erhalten Sie häufig mehr Ausgabe, als Sie durchsehen müssen.

grwww
quelle
3
Schreibt dies in eine Datei? Ich konnte es in meinem Programm noch nicht zum Laufen bringen. Ich habe die erste Zeile, die Sie haben, aber bisher wurde noch nichts gearbeitet.
Doug Hauf
5
Wie sehen Sie die Protokolle? Eine Bibliothek, die ich verwende, initialisiert Logger-Objekte und verwendet die .fine()Methode zum Protokollieren, aber ich kann die Nachrichten scheinbar nicht anzeigen lassen ...
Anubian Noob
7
Ich programmiere seit 1998 in Java. Ich habe immer festgestellt, dass das Anmelden in Java viel mehr Kopfschmerzen bereitet, als es sein muss. Dies ist bei weitem die einfachste Erklärung, wie man sich in Java anmeldet, die ich gelesen habe. Prägnant auch.
Steve McLeod
30
Es ist interessant, dass niemand erwähnt hat, wo man die Protokolldateien finden kann.
Ahmedov
4
Wenn Sie sich fragen, wohin die Protokolle führen, stellen Sie sicher, dass Sie einen Handler für den Logger eingerichtet haben. Um einfach Protokolle an die Konsole auszugeben, verwenden Sie einen neuen ConsoleHandler und fügen Sie diesen mithilfe der addHandler-Methode zu Ihrem Logger hinzu. Stellen Sie sicher, dass Sie setLevel sowohl für den Logger als auch für den Handler aufrufen.
Craig Brown
67

Sollte Logger wie folgt deklarieren:

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

Wenn Sie also Ihren Klassennamen umgestalten, folgt dieser.

Ich habe hier einen Artikel über Java Logger mit Beispielen geschrieben .

Hanoo
quelle
53

Es gibt viele Beispiele und auch verschiedene Arten für die Protokollierung. Schauen Sie sich das Paket java.util.logging an.

Beispielcode:

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

Ohne Hardcodierung des Klassennamens :

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
quelle
15
Warum nicht den Protokollnamen als Main.class.getSimpleName()festlegen? Auf diese Weise wird das Refactoring-Tool es bei Bedarf ordnungsgemäß ändern, und dennoch ist es nicht so umständlich wie Ihre zweite Lösung.
Pijusn
3
Das Erstellen eines Stacktraces für einen Loggernamen ist hack, langsam und unorthodox. Es wird auch brechen und Ihnen seltsame Namen für AOP-Proxys oder andere außergewöhnliche Byte-Codierungen geben.
Adam Gent
9
-1 für das Stacktrace-Geschäft. Es ist langsam und verhindert möglicherweise Compiler-Optimierungen.
Phooji
4
Warum sollte die "Langsamkeit" bei der Initialisierung des Loggers überhaupt eine Rolle spielen? Erwähnungen von Langsamkeit sind das, was die meisten Leute als vorzeitige Optimierung bezeichnen würden (Ja, der Code sieht ein bisschen hackisch aus).
Mikkom
3
@ AndrewMcKinlay In welcher Situation bricht etwas? Wenn das Logger-Tag mit dem Klassennamen identisch sein soll, scheint dies vollkommen in Ordnung zu sein. Refactoring-Tools werden es automatisch umbenennen. Wenn es sich um eine fest codierte Zeichenfolge handelt, kann das Refactoring-Tool diese entweder überspringen oder sagen: "Möchten Sie dies auch umbenennen?".
Pijusn
23

SLF4J ist eine bessere Protokollierungsfassade als Apache Commons Logging (ACL). Es verfügt über Brücken zu anderen Protokollierungsframeworks, sodass direkte Aufrufe von ACL, Log4J oder Java Util Logging über SLF4J erfolgen, sodass Sie die gesamte Ausgabe mit nur einer Protokollkonfigurationsdatei auf eine Protokolldatei leiten können, wenn Sie dies wünschen. Warum sollte Ihre Anwendung mehrere Protokollierungsframeworks verwenden? Weil Bibliotheken von Drittanbietern, die Sie verwenden, wahrscheinlich ältere, dies wahrscheinlich tun.

SLF4J unterstützt verschiedene Protokollierungsimplementierungen. Es kann alles an Standard-Out ausgeben, Log4J oder Logback verwenden (empfohlen gegenüber Log4J).

http://www.slf4j.org/

http://logback.qos.ch/

bcody
quelle
9

Ich persönlich würde minlog verwenden . Es ist sehr einfach, da die Protokollierungsklasse einige hundert Codezeilen umfasst.

Chris Dennett
quelle
3
Für minimalen Platzbedarf ist dies die Bibliothek, die Sie auswählen müssen.
h3xStream
0

Ich würde vorschlagen, dass Sie das Common Logging-Dienstprogramm von Apache verwenden. Es ist hoch skalierbar und unterstützt separate Protokolldateien für verschiedene Protokollierer. Siehe hier .

nIKUNJ
quelle
11
Guter Vorschlag! versuchen Sie trotzdem zu beantworten, was sie fragen, sonst hinterlassen Sie einfach einen Kommentar;)
Ordiel