Heim >Java >javaLernprogramm >Meldet sich Ihre Java-Protokolldienstprogrammklasse selbst als Quelle Ihrer Protokolle? Erfahren Sie, wie Sie das Problem beheben können!

Meldet sich Ihre Java-Protokolldienstprogrammklasse selbst als Quelle Ihrer Protokolle? Erfahren Sie, wie Sie das Problem beheben können!

Barbara Streisand
Barbara StreisandOriginal
2024-10-13 06:13:30504Durchsuche

Is your Java log utility class reporting itself as the source of your logs? Learn how to fix it!

In der schnelllebigen Umgebung der modernen Softwareentwicklung ist eine effektive Protokollierung für effizientes Debugging und Systemüberwachung von entscheidender Bedeutung. Inkonsistente oder ungenaue Zeilennummern in Protokollausgaben können jedoch die Fehlerbehebung zeitaufwändig machen. Kürzlich habe ich festgestellt, dass unser internes Protokollierungsdienstprogramm sich selbst als Quelle der Protokolle meldet. Dies musste behoben werden, um die Protokollgenauigkeit zu verbessern.

Das Problem

Wenn Sie eine benutzerdefinierte Dienstprogrammklasse zum Verarbeiten von Protokollen verwenden, beginnt diese, sich selbst als Quelle des Protokolls zu melden, da die Dienstprogrammklasse letztendlich das eigentliche Protokollframework aufruft (in meinem Fall war es SLF4J). , mit Log4J2 als Backend).

Wenn die Dienstprogrammklasse also InternalLogger heißt, sieht das Protokoll etwa so aus:

2024-10-11T18:10:57,345 [finagle/netty4-6] (InternalLogger.java:34) INFO ...  

Hier verweisen die gemeldete Quelldatei und die Zeilennummer auf einen Speicherort innerhalb des Protokollierungsdienstprogramms selbst und nicht auf die Stelle, an der der Protokollaufruf tatsächlich im Anwendungscode erfolgte. Dieses Verhalten verringert die Effektivität von Protokollen beim Debuggen und der schnellen Lokalisierung von Problemen.

Die Lösung

Zuerst habe ich daran gedacht, den Stack-Trace manuell durchzugehen und einige Elemente herauszufiltern, bevor ich die Zeilennummer melde. Dieser Ansatz wäre sehr kostspielig und ich wollte unseren Protokollierungsprozess nicht verlangsamen.

Glücklicherweise habe ich in dieser StackOverflow-Antwort herausgefunden, dass SLF4J eine Schnittstelle namens LocationAwareLogger bereitstellt, die Log4J2 unterstützt, sodass wir die Utility-Klasse filtern können, indem wir einfach den FQCN (Fully Qualified Class Name) der Log Utility-Klasse übergeben.

Meine ursprüngliche Utility-Klasse sah ungefähr so ​​aus:

public class InternalLogger {

  private static final Logger LOG = LoggerFactory.getLogger(InternalLogger.class);

  public void log(EventLog eventLog) {
    //... get message and logLevel from eventLog
    switch (logLevel) {
      case DEBUG:
        LOG.debug(message);
        break;
      case WARN:
        LOG.warn(message);

Für diese Lösung habe ich die Logger-Klasse FQCN deklariert und eine private Hilfsfunktion zum Protokollieren mit einem LocationAwareLogger hinzugefügt:

private static final String LOGGER_UTIL_FQCN = InternalLogger.class.getName();

  private void locationAwareLog(int level, String message) {
    ((LocationAwareLogger) LOG).log(null, LOGGER_UTIL_FQCN, level, message, null, null);
  }

Und meinen alten Code geändert, um ihn aufzurufen, wenn er unterstützt wird:

switch (logLevel) {
  case DEBUG:
    if (LOG instanceof LocationAwareLogger) {
      locationAwareLog(LocationAwareLogger.DEBUG_INT, message);
    } else {
      LOG.debug(message);
    }
    break;
  case WARN:
    if (LOG instanceof LocationAwareLogger) {
      locationAwareLog(LocationAwareLogger.WARN_INT, message);
    } else {
      LOG.warn(message);
    }
//...

Leider bietet SLF4J keine Möglichkeit, die Ebene als Argument bereitzustellen (d. h. LOG.log(level, message)). Wenn dies der Fall wäre, wäre der Code etwas weniger ausführlich.

Nach der Implementierung dieser Änderung geben Protokolle nun die Leitungsnummer des Anrufers genau an, was die Rückverfolgbarkeit erheblich verbessert:

2024-10-11T18:45:26,692 [finagle/netty4-6] (ActualLogic.java:1059) INFO ...

Beachten Sie den Unterschied: InternalLogger.java:34 im Vergleich zu ActualLogic.java:1059, der eine genauere Position des Protokollursprungs im Anwendungscode angibt.

Abschluss

Durch die Integration des LocationAwareLogger von SLF4J habe ich unser Protokollierungssystem von einer Quelle der Verwirrung in ein präzises Diagnosetool verwandelt. Diese Änderung ermöglicht eine genaue Meldung der Leitungsnummer des Anrufers anstelle der des Protokollierungsdienstprogramms, was unsere Fähigkeit, Probleme schnell und genau zu diagnostizieren, erheblich verbessert.

Diese Verbesserung optimiert nicht nur das Debuggen, sondern verkürzt auch die Reaktionszeiten bei der Behebung von Softwareproblemen.

Entwickler, die vor ähnlichen Herausforderungen stehen, sollten diesen Ansatz in Betracht ziehen, um die Effektivität ihrer Protokollierungssysteme zu steigern. Mit klareren und genaueren Protokollen können sie ehemals mehrdeutige Daten in umsetzbare Erkenntnisse umwandeln und so sowohl die betriebliche Effizienz als auch die Softwarezuverlässigkeit verbessern. Eine optimierte Protokollierung ist entscheidend, um die Herausforderungen der heutigen schnelllebigen Entwicklungslandschaft zu meistern und qualitativ hochwertige Softwareergebnisse sicherzustellen.

Das obige ist der detaillierte Inhalt vonMeldet sich Ihre Java-Protokolldienstprogrammklasse selbst als Quelle Ihrer Protokolle? Erfahren Sie, wie Sie das Problem beheben können!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn