2009-04-23 8 views
10

Meine Frage ist einfach: Was in ein Protokoll schreiben. Gibt es irgendwelche Konventionen? Was muss ich hineinlegen?Was in die Protokolldatei schreiben?

Da meine App veröffentlicht werden muss, würde ich gerne freundliche Protokolle haben, die von den meisten Leuten gelesen werden können, ohne zu fragen, was es ist.

Ich habe bereits einige Ideen, wie einen Zeitstempel, eine eindeutige Kennung für jede Funktion/Methode, etc .. Ich hätte gerne mehrere Protokollebenen, wie Tracing/Debugging, Informationen, Fehler/Warnungen.

Verwenden Sie einige vorformatierte Protokollressourcen?

Danke

+2

Für was es wert ist, Protokolle sind normalerweise nicht dazu gedacht, von Benutzern gelesen zu werden, so dass die meisten Leute versuchen, sie informativ zu machen, anstatt "freundlich" ... –

+2

@David: Was? Die meisten Protokolle werden von Administratoren gelesen - die eine Klasse von Benutzern sind. Ich bin mir nicht sicher, wovon du redest. "Freundlich" für einen Administrator bedeutet in der Regel "Abgeschlossen" - Datumsstempel, Sitzungs-ID, Modulname, Schweregrad, eine Nachricht, die in eine Zeile passt usw. –

+0

friendly bedeutet hier, dass das Protokollformat leicht zu analysieren, zu lesen, und biete jedem Benutzer (zB einem aktuellen Benutzer oder einem Administrator) die Möglichkeit, mit den meisten Tools relevante Informationen über die App zu haben –

Antwort

9

Hier sind einige Vorschläge für den Inhalt:

  • Zeitstempel
  • Nachricht
  • Protokollnachrichtentyp (zB Fehler, Warnung, Spur, debug)
  • Thread-ID (damit Sie die Protokolldatei aus einer Anwendung mit mehreren Threads verstehen können)

Best Practices für die Implementierung:

  • einen Mutex um die Schreibmethode setzen, damit Sie sicher sein können, dass jeder Schreib Thread sicher ist und Sinn machen.
  • Senden Sie jeweils 1 Nachricht an die Protokolldatei, und geben Sie den Typ der Protokollnachricht jedes Mal an. Dann können Sie festlegen, welche Art von Protokollierung Sie beim Programmstart durchführen möchten.
  • Verwenden Sie keine Pufferung für die Datei, oder spülen Sie häufig, wenn es einen Programmabsturz gibt.

Edit: Ich habe gerade bemerkt, die Frage mit Python markiert wurde, so wenden Sie sich bitte vor meinem S. Lott Antwort sehen. Es kann genug für Ihre Bedürfnisse sein.

+0

Ich habe diese Antwort akzeptiert, weil sie auf meine Wartezeiten antwortet, auch wenn der Link von S.Lott war nützlich. Vielen Dank –

18

Es ist sehr angenehm und bereits implementiert.

Lesen Sie dazu: http://docs.python.org/library/logging.html


bearbeiten

"leicht zu analysieren, lesen," sind in der Regel widersprüchliche Funktionen. Englisch - leicht zu lesen, schwer zu analysieren. XML - leicht zu analysieren, schwer zu lesen. Es gibt kein Format, das einfach zu lesen und zu analysieren ist. Einige Protokollformate sind "nicht schrecklich zu lesen und nicht unmöglich zu analysieren".

Einige Leute erstellen mehrere Handler, so dass ein Protokoll mehrere Formate hat: eine Zusammenfassung für die Leser und eine XML-Version für das automatische Parsen.

1

Da Sie Ihre Frage python getaggt haben, verweise ich Sie auch auf this question. Was den Inhalt betrifft, ist Brian Vorschlag gut. Denken Sie jedoch daran, den Programmnamen hinzuzufügen, wenn Sie ein freigegebenes Protokoll verwenden.

Das Wichtige an einem Logfile ist "Greppability". Versuchen Sie, alle Ihre Informationen in einer einzigen Zeile mit passenden String-Identifiern anzugeben, die für eine bestimmte Bedingung eindeutig sind (auch in Radix). Verwenden Sie für den Zeitstempel den ISO-8601-Standard, der gut sortiert.

0

timestamp dh Datetime YYYY/MM/DD: HH: mm: ss: ms Benutzer Thread-ID Funktion Name Meldung/Fehlermeldung/Erfolgsmeldung/Funktion Trace

diese haben im XML-Format und Sie kann dann leicht einen Parser dafür schreiben.

<log> 
    <logEntry DebugLevel="0|1|2|3|4|5...."> 
    <TimeStamp format="YYYY/MM/DD:HH:mm:ss:ms" value="2009/04/22:14:12:33:120" /> 
    <ThreadId value="" /> 
    <FunctionName value="" /> 
    <Message type="Error|Success|Failure|Status|Trace"> 
     Your message goes here 
    </Message> 
    </logEntry> 
</log> 
+3

Einige Leute denken XML ist die Antwort auf alles (so tun einige Regex Bods), aber ich stimme nicht zu. Es ist genauso einfach (möglicherweise einfacher), eine Protokolldatei im festen Format mit normalen Textverarbeitungstools zu analysieren als eine XML-Datei. Und Sie enden nicht mit all dem "Rauschen" in der Datei, das nutzlosen Platz einnimmt. – paxdiablo

+0

Einige Leute denken, dass es ihre Gedanken sind, die entscheiden, was richtig ist und was nicht. Man kann nicht zustimmen, aber es beweist nichts. Und nebenbei einige Leute, die hier sind, um ihnen ihre Autorität aufzuerlegen, schlage ich vor, dass es für uns Zeit ist, zu lernen, zu respektieren und anderen Raum zu geben. Einige Zeit Lösung möglicherweise nicht so wichtig, dann teilnehmend. –

+0

Ich muss zugeben, dass ich XML nicht sehr mag, es ist eine persönliche Meinung, und ich danke Ihnen für den Vorschlag, aber ich bin komfortabler mit einer einfachen Textdatei als mit unordentlichen XML-Dateien, die gesagt, ich stimme in einigen überein Fall ist es nützlich, vor allem in Web-Anwendungen. –

1

Eine gute Idee ist es, Log-Analyse-Software zu betrachten. Sofern Sie nicht beabsichtigen, Ihre eigenen zu schreiben, werden Sie wahrscheinlich ein vorhandenes Log-Analyse-Paket wie zB Analog nutzen wollen. Wenn dies der Fall ist, möchten Sie wahrscheinlich eine Protokollausgabe erzeugen, die den akzeptierten Formaten ähnlich ist. Es ermöglicht Ihnen, mit minimalem Aufwand schöne Diagramme und Grafiken zu erstellen!

1

Meiner Meinung nach ist der beste Ansatz, vorhandene Logging-Bibliotheken wie log4j (or it's variations for other languages) zu verwenden. Es gibt Ihnen Kontrolle darüber, wie Ihre Nachrichten formatiert sind, und Sie können sie ändern, ohne jemals Ihren Code zu berühren. Es folgt Best Practices, robust und von Millionen von Nutzern genutzt. Natürlich können Sie Ihr eigenes Logging-Framework schreiben, aber das wäre sehr merkwürdig, außer Sie brauchen etwas sehr Spezifisches. Gehen Sie in jedem Fall durch ihre Dokumentation und sehen Sie, wie dort Log-Statements angezeigt werden.

Check out log4py - Python portiert Version von log4j, ich denke, es gibt mehrere Implementierungen für Python gibt ..

0

Pythons Logging-Bibliothek sind Thread-sicher für einzelne Prozessthreads.

Verwandte Themen