Logging Library für (c ++) Spiele [geschlossen]

15

Ich kenne viele Protokollbibliotheken, habe aber nicht viele getestet. (GoogleLog, Pantheios, die kommende boost :: log Bibliothek ...)

In Spielen, insbesondere in Remote-Multiplayer- und Multithread-Spielen, ist die Protokollierung für das Debuggen von entscheidender Bedeutung, auch wenn Sie am Ende alle Protokolle entfernen.

Nehmen wir an, ich mache ein PC-Spiel (keine Konsole), das Protokolle benötigt (Multiplayer und Multithreading und / oder Multiprozess), und ich habe gute Gründe, nach einer Bibliothek für die Protokollierung zu suchen (zum Beispiel, ich habe keine Zeit oder ich habe keine Zeit) Ich bin nicht sicher, ob ich in der Lage bin, einen für meinen Fall richtig zu schreiben.

Vorausgesetzt, ich brauche:

  1. Performance
  2. einfache Bedienung (Streaming oder Formatierung oder ähnliches zulassen)
  3. zuverlässig (nicht auslaufen oder abstürzen!)
  4. plattformübergreifend (mindestens Windows, MacOSX, Linux / Ubuntu)

Welche Protokollbibliothek würden Sie empfehlen?

Momentan denke ich, dass boost :: log das flexibelste ist (Sie können sich sogar aus der Ferne anmelden!), Aber keine gute Leistungsaktualisierung haben : ist für hohe Leistung, ist aber noch nicht veröffentlicht. Pantheios wird oft zitiert, aber ich habe keine Vergleichspunkte zu Leistung und Nutzung. Ich habe meine eigene Bibliothek lange Zeit benutzt, aber ich weiß, dass sie kein Multithreading beherrscht, so dass es ein großes Problem ist, auch wenn es schnell genug ist. Google Log scheint interessant zu sein. Ich muss es nur testen. Wenn Sie diese und weitere Bibliotheken bereits verglichen haben, ist Ihr Rat möglicherweise hilfreich.

Spiele sind oftmals leistungsintensiv und komplex zu debuggen. Daher ist es gut, Protokollbibliotheken zu kennen, die in unserem speziellen Fall klare Vorteile bieten.

Klaim
quelle
3
Eine wichtige Anforderung, die Sie nicht erwähnt haben, ist, wofür Sie die Protokolle verwenden möchten. Die Anforderungen für die Protokollierung von beispielsweise Debug-Meldungen, Kennzahlen für Designer, Zeichenstatus für den Kundensupport und Kreditkartentransaktionen sind unterschiedlich. Im Allgemeinen werden die Leistung, die Benutzerfreundlichkeit für Programmierer, die Leichtigkeit / Geschwindigkeit des Offline-Parsings und die Haltbarkeit in Abhängigkeit von der jeweiligen Situation beeinträchtigt.
Das ist richtig, aber ich ging davon aus, dass eine "vollständige" Protokollierungslösung es den Benutzern ermöglichen würde, verschiedene Arten von Protokollen einzurichten, wie Sie sie beschreiben. Wenn Sie diese Präzision in der Frage für wichtig halten, seien Sie bitte mein Gast und fügen Sie sie der Frage hinzu.
Klaim 18.02.11

Antworten:

8

log using socket (jeder Socket-Wrapper kann ausreichen) + Webbrowser websocket => Das vielseitigste, unauffälligste Protokollierungswerkzeug, das möglich ist, wird stundenlanges Debuggen kosten und Augenschmerzen vermeiden.

  • asynchron (Geschwindigkeit, da der gesamte Auftrag im Browser verzögert wird)
  • formatiert (Farbe, Größe etc ..)
  • zuverlässig (Steckdosen ...)
  • plattformübergreifend (Browser)

Nun der Bonus:

  • Dynamische Filterung sehr einfach (bei Bedarf mit Javascript Regex)
  • mit Protokollverlauf, Speicher und Vergleich (HTML5-Spezifikation in der "In-Browser" -Datenbank)
  • Einfache Möglichkeit, Diagramme von Daten (mit SVG, Canvas oder Ähnlichem) wie Speicher , Speicherfragmentierung usw. zu erstellen.
  • einfache Möglichkeit, ein 2D-Diagramm von Daten zu erstellen ( kd-Baum-Unterteilung, potenzielles Feld oder auch nur eine variable Wertvariation, usw.)
  • Ermöglicht Fernprotokollierung (mit dem Browser eines anderen Computers)
  • Mit HTML5 im Browser-Speicher können Sie Protokollsitzungsparameter (aktuelle Protokollfilter usw. und sogar Notizen zu jedem) speichern.
  • Es ist sehr einfach, einen Fehlerbericht zu erstellen oder Trac-Tickets mit einem Klick zu verknüpfen
  • Möglichkeit zum einfachen Zurückspulen der Protokollierung mit einer Zeitleisten-Benutzeroberfläche

und viele weitere Aufgaben außerhalb der Protokollierung:

  • Ermöglicht Profiler-Informationen (Grafiken ...)
  • kann sogar als Konsole dienen (Befehl vom Browser senden) oder sogar mit einer schnellen Benutzeroberfläche unter Verwendung von HTML oder sogar Flash-Benutzeroberfläche
  • Bildunterschied im Browser (Bild mit Socket senden und im Browser mit Canvas-Bildpixelfunktionen vergleichen)
  • etc...

(Fast alle der oben genannten Vorgänge können über Flash-Sockets ausgeführt werden. Speichern Sie die Datenbankfunktionen.)

Jetzt weiß ich, dass es ein bisschen lang ist, das Ding einzurichten. Aber es ist wirklich ein Zeitgewinn bei langen Projekten mit schwierigen Debugsituationen (wie in Spielen). Es ist das mächtigste, was ich seit Debuggern verwendet habe ...

Hinweis 1: Der einzige Nachteil => Überprüfen Sie den Nebeneffekt beim Debuggen des Netzwerkcodes (Auswirkungen auf die Größe des Socket-Puffers, die Latenz, die Bandbreite usw.).

Hinweis 2: Einige Browser sind aus Sicherheitsgründen standardmäßig deaktiviert. Überprüfen Sie Folgendes: config, um sicherzustellen, dass sie aktiviert sind.

Tuan Kuranes
quelle
1
Korrigieren Sie mich, wenn ich falsch liege, aber dies zeigt nur an, wohin die Protokollausgabe geleitet werden soll, nein? Eine echte Protokollbibliothek würde auch das Filtern während der Kompilierung (was bei Problemen mit der Leistung von entscheidender Bedeutung ist), das Formatieren und die Bereitstellung einer benutzerfreundlichen Syntax zum Erstellen von Protokollnachrichten ermöglichen.
sbi
@sbi Auf der Anwendungsseite ist es ein globales Ein- oder Ausschalten. "Browser Log Client" übernimmt die Filterung und Syntax, holt aber immer das gesamte Protokoll. Es ist radikal, aber es basiert auf der Erfahrung, dass Sie während des Entwickelns immer alles protokollieren sollten, damit Sie alle Fehler, auf die Sie stoßen, leicht finden / reproduzieren können. Wenn Sie zu optimieren haben, ist es Browser Seite wieder: Mit Buchse Sie nicht anmelden mit Zeichenfolge gebunden, können Sie direkt Binärdaten anmelden können (Id + schwimmt), die fett als jedes andere Zeichenfolge basiertes Protokoll lib schneller ... ( übereinstimmende ID zu Zeichenfolge-Browserseite ...)
Tuan Kuranes
1
Ich kann zwar feststellen, dass dies sehr praktisch ist, es ist jedoch nur das Backend eines Protokollierers (was Templog als "Protokollsenke" (log sink, IIRC) bezeichnet). Die Leistung ist eine der aufgeführten Anforderungen. Ich habe festgestellt, dass ich während des Debuggens Log-Anweisungen zu einem Teil des Codes hinzufügen muss, aber wenn er erst einmal läuft, wäre dieser Teil des Codes zu gesprächig und würde alles, woran ich arbeite, im Rauschen ertränken und auch kosten zu viel Leistung. Daher möchte ich in der Lage sein, die Protokollstufe für ganze Codeteile durch Ändern einiger Codezeilen zu erhöhen und zu verringern. Das ist es, was die mittlere Schicht einer LogLib für Sie tut.
sbi
@sbi: Möglicherweise sind Benchmarks erforderlich, aber es besteht die Möglichkeit, dass die beste Protokollierungsbibliothek auch bei der niedrigsten Protokollierungsstufe mehr kostet als ein Binärlogger, der alles protokolliert. Es wird nicht einmal ein einziger "Binary to Char" -CPU-Zyklus verschwendet ... Es gibt also wirklich mehr Funktionen UND mehr Leistung.
Tuan Kuranes
Bevor wir uns entschlossen, Templog zu verwenden, haben wir einige Tests durchgeführt. Wenn die Protokollierung aufgrund des Schweregrads, des Ursprungs oder einer bestimmten Protokollmeldung deaktiviert ist und der Compiler feststellen kann, dass bei der Auswertung der Parameter keine Nebenwirkungen auftreten, kann VC in der Tat eine vollständige Optimierung durchführen log Aussage ins Nichts. Und wenn es um Geschwindigkeit geht, werden Sie keinen Code schlagen, der überhaupt nicht ausgeführt werden kann.
sbi
8

Wenn es um Leistung geht, habe ich festgestellt, dass Templog so gut wie ungeschlagen ist. Mithilfe von Ausdrucksvorlagen wird die Auswertung von Protokollanweisungen verschoben, bis festgestellt wird, dass die Informationen überhaupt protokolliert werden. Da Sie die Protokollierung auch teilweise deaktivieren können (abhängig vom Schweregrad, Ursprung und der Zielgruppe einer Protokollnachricht), können einige dieser Protokollierungsanweisungen vom Compiler für Release-Builds auf Null gesetzt werden. (Ich habe tatsächlich gesehen, dass dies mit VC passiert.)

In letzter Zeit wurde der Bibliothek nicht viel getan, und anderen auf SO hat der Kofferraum in mancher Hinsicht gefehlt, aber in einer Firma, für die ich gearbeitet habe, haben wir festgestellt, dass der Typ ziemlich reaktionsschnell und einer meiner damaligen Kuharbeiter sogar Erhielt Commit-Zugriff und fügte Code hinzu, sodass es sich möglicherweise lohnt, einen Versuch zu unternehmen.

So führen Sie Ihre Anforderungen auf:

Performance

Das Beste, was ich gefunden habe. Besonders die Möglichkeit, Protokollnachrichten zur Kompilierungszeit auszuschließen und diese vom Compiler vollständig entfernen zu lassen, war sehr ansprechend.

einfache Bedienung (Streaming oder Formatierung oder ähnliches zulassen)

Es gibt die klassischen schrecklichen Compilerfehlermeldungen von Vorlagen-Meta-Dingen, wenn Sie etwas falsch machen, aber wenn es um Benutzerfreundlichkeit geht, ist dies

TEMPLOG_LOG(my_logger,sev_error,aud_support) << "logged in as " << user_name;

ist schwer zu schlagen.
Möglicherweise müssen Sie jedoch Ihre eigenen Protokollsenken erstellen (dort werden die Protokollnachrichten abgelegt), da die wenigen vorgefertigten (stderr, file, Windows-Protokollierung usw.) nicht besonders ausgefeilt sind. Da die Leistung ein Hauptziel ist, sind die Grundzüge des Ganzen etwas kompliziert (so wie sich die Formatierer von Protokollnachrichten mit Protokollsenken verheddern), aber das haben wir gemeistert (ich erinnere mich, dass ich es in einem Debugger durchgearbeitet habe, der dabei geholfen hat) und zwar einmal Verstanden, dass es nicht allzu schwer war, eigene Nachrichtenformatierer oder Protokollsenken zu schreiben.

zuverlässig (nicht auslaufen oder abstürzen!)

Wir haben es verwendet, ohne solche schwerwiegenden Probleme zu finden. Es gibt dort praktisch keine dynamische Speicherzuweisung, daher kann man sich kaum vorstellen, dass etwas falsch läuft. Natürlich haben wir es immer nur in einem Produkt auf den Prüfstand gestellt.

plattformübergreifend (mindestens Windows, MacOSX, Linux / Ubuntu)

Als wir es verwendeten, verwendeten wir es unter Win32, OSX und verschiedenen Linux-Distributionen, darunter Ubuntu.

Was Multithreading angeht: Wir haben dies nicht verwendet, aber soweit ich mich an die Architektur der Bibliothek erinnere, scheint es, als müssten Sie dies nur in Protokollsenken behandeln. ICBWT.

sbi
quelle
Danke, ich wusste das nicht. Es sieht aus wie eine vereinfachte (und performante) Version von boost :: log, zumindest in der ursprünglichen Idee.
Klaim
@Klaim: Ich glaube nicht, dass boost etwas zu bieten hatte, als ich mir zuletzt die C ++ - Protokollierungsbibliotheken angesehen habe, daher kenne ich boost :: log nicht.
sbi
1
@ Joe: Verstehst du den Begriff "Ausdrucksvorlagen" ?
sbi
1
Ich dachte, ich hätte es getan, aber jetzt habe ich den Templog-Quellcode heruntergeladen und mit dem Lesen begonnen, und es sieht so aus, als ob C ++ mich erneut überlistet hat.
1
@sbi: Ein Teil meiner Verwirrung war Ihre Aussage "auf einmal durch mehrere Ebenen geleitet" - Auf Englisch kann auf einmal entweder sofort oder zusammen bedeuten , was in diesem Fall Gegensätze sind. Ich habe es als das erste gelesen und du (jetzt offensichtlich für mich) meintest das zweite. Vielen Dank, dass Sie sich die Zeit genommen haben, es zu erklären.
0

Sie könnte dich interessieren Baical Tools gesetzt:

  • Open Source und plattformübergreifende Bibliothek (Win, Linux, x86 / x64) für Protokolle, Traces und Telemetrie - P7
  • Unglaublich schnell (für eingebettete Geräte) - 3 Millionen Protokolle pro Sekunde im Netzwerk, 5 Millionen in der modernen CPU. Ich kenne keine andere Bibliothek für die Protokollierung, die eine solche Geschwindigkeit und so detaillierte Informationen für jede Protokollmeldung bietet.
  • Thread sicher
  • Jede Tracenachricht enthält:
    • Textnachricht
    • Niveau
    • genaue Zeit (100ns)
    • Quelldatei, Funktionsname & Zeile
    • Modul-ID und Modulname
    • Thread-ID und Thread-Name
    • Prozessorkernindex
  • Serveranwendung zum Empfangen und Anzeigen von Protokollen und Telemetrie
  • Sie können Protokolle aus mehreren Quellen in Echtzeit sammeln, analysieren, durchsuchen und filtern
maximu
quelle
Ab 06/2017 wird% s in der String-Formatierung noch nicht unterstützt.
Romeno