2012-03-28 4 views
4

Ich versuchte Logback, aber es schuf eine Tonne Müll. Hat jemand von einem guten für Java in Echtzeit gehört?Was ist eine gute Logging-Bibliothek für Echtzeitsysteme (schnell ohne Objekterstellung)?


@Bernie: Ich habe eine Schleife hat 1M Cache gespeicherten Nachrichten Protokollierung und der GC wurde verrückt.

+0

„Diese Frage zeigt keine Forschungsanstrengungen“ so habe ich downvoted. Wenn Sie mit Ihren bisherigen Recherchen bearbeiten - auf diese Weise profitiert die gesamte Community - dann werde ich umgehend den Downvote entfernen. Vielen Dank und viel Glück mit Ihrem Problem. – bernie

+1

Danke, @JohnPristine. Downvote entfernt – bernie

Antwort

2

Sie können einen Blick auf CoralLog von Coral Blocks entworfen (mit denen ich angegliedert), die Null Müll produziert und hat eine durchschnittliche Latenz von 53 Nanosekunden beim Protokollieren einer 64-Byte-Nachricht. In Bezug auf den Durchsatz kann es protokollieren 2,6 Millionen 64-Byte-Nachrichten pro Sekunde mit Zeitstempeln und 3,5 Millionen 64-Byte-Nachrichten pro Sekunde ohne Zeitstempel. Die vollständigen Benchmark-Ergebnisse sind zu sehen here.

Wenn Sie die Nachrichtengröße auf 16 Byte reduzieren, können Sie 5,2 Millionen Nachrichten pro Sekunde ohne Zeitstempel protokollieren.

Es folgt ein einfaches Durchsatztest:

package com.coralblocks.corallog.bench; 

import java.io.File; 
import java.nio.ByteBuffer; 

import com.coralblocks.corallog.AsyncThread; 
import com.coralblocks.corallog.Log; 
import com.coralblocks.corallog.Logger; 

public class PerformanceTest4 { 

    public static void main(String[] args) throws Exception { 

     int batchSize = Integer.parseInt(args[0]); 
     int passes = Integer.parseInt(args[1]); 
     int msgSize = Integer.parseInt(args[2]); 

     byte[] msgBytes = new byte[msgSize]; 

     // build a dummy message: 
     for(int i = 0; i < msgBytes.length; i++) { 
      msgBytes[i] = (byte) String.valueOf(i % 10).charAt(0); 
     } 

     ByteBuffer bb = ByteBuffer.wrap(msgBytes); 

     Log.setIncludeTopHeader(false); 

     String dir = "."; 
     String filename = "throughput.log"; 

     Logger logger; 
     boolean isMmap = System.getProperty("logMemoryMappedFile", "true").equals("true"); 

     if (isMmap) { 
      logger = Log.createMemoryMappedLogger(dir, filename, null /* no timestamps */, false /* not synchronized */, true /* asynchronous */); 
     } else { 
      logger = Log.createLogger(dir, filename, null, false, true); 
     } 

     int count = 0; 

     while(count < passes) { 

      long start = System.nanoTime(); 

      for(int i = 0; i < batchSize; i++) { 
      bb.position(0); 
      logger.log(bb); 
      } 

      long time = System.nanoTime() - start; 

      double seconds = (((double) time)/1000000000L); 

      System.out.println("Batch " + (count + 1) + " took: " + seconds + " s"); 

      count++; 
     } 

     logger.drainCloseAndWait(); 

     boolean deleteFile = System.getProperty("deleteFile", "true").equals("true"); 

     if (deleteFile) { 
      File f = new File(dir, filename); 
      f.delete(); 
     } 

     AsyncThread.drainAndDie(); // just so the vm will exit... (async thread is not daemon) 
    } 
} 
15

Ich habe eine Bibliothek, die Text oder Binärdaten in weniger als einer Mikrosekunde protokollieren kann, ohne Müll oder sogar einen Systemaufruf zu erzeugen.

https://github.com/peter-lawrey/Java-Chronicle

Das Protokoll kann auch durch eine beliebige Anzahl von Leseprozessen in Echtzeit gelesen werden, können Sie eine persistente Warteschlange geben, die mehr als 5 Millionen Nachrichten pro Sekunde verarbeiten kann.

+0

Ich benutze Speicherkarten, also gibt es einen Systemanruf pro 16MB - 1 GB geschrieben, nicht pro Nachricht. Ich habe einen Test, der 20 M kurze binäre Nachrichten pro Sekunde und 5 Millionen mittelgroße Textnachrichten schreibt. Auf einem 4,5 Ghz i7 habe ich 4 verschiedene Dateischreibvorgänge mit echten Daten in 700 Nanosekunden. Auf den Homepages befinden sich Listen der Leistungsstatistiken. Ich habe herausgefunden, dass die Systemaufrufe etwa 3 Mikrosekunden dauern, weshalb ich einen Weg gefunden habe, sie zu vermeiden. ;) –

+0

Am schwierigsten zu schreiben sind Datumsangaben und Doppelpunkte. Hast du Leistungsstatistiken für das Schreiben von Doubles? (Die 5 M/Sekunde Text enthält ein Datum/eine Uhrzeit und ein Doppel) –

+0

Speicherabbilddateien müssen nicht auf Festplatte gespeichert werden, um vor dem Ausfall einer Anwendung zu schützen (Fehler des Betriebssystems oder der Festplatte ist anders) Dies liegt daran, dass das Betriebssystem weiß, wie die Daten an die Festplatte übergeben werden, selbst wenn der Prozess beendet wurde. –

-3

Versuchen Sie, die log4j-Systeme: http://logging.apache.org/log4j/1.2/

+1

log4j trägt häufig zu hohem Heapverbrauch und mehr Speicherbereinigung aufgrund von Protokollierungscode wie - if (logger.isDebugEnabled()) { logger.debug ("Eintragsnummer:" + i + "ist" + String.valueOf (Eintrag [i])); } – forhas

+0

Verwenden Sie eine neuere Version von log4j, die stattdessen LMAX Disruptor verwendet. – boring

0

Javolution Protokollierungsfunktionen zur Verfügung stellt.

Vom LogContext javadoc:

Der gleiche Code kann unter Verwendung des Systems aus/err, Standardprotokollierung (java.util.logging), Log4J oder sogar OSGI Log-Dienste ausführen. Die Auswahl kann zur Laufzeit über configuration erfolgen.

('configuration' bezieht sich auf eine Javolution-Klasse).