Log-System

Dieses Kapitel beschreibt alle Element unseres Log-Systems. Die hier verwendeten Illustrationen zeigen möglicherweise andere Anwendungen. Das Log-System ist jedoch identisch und verhält sich in all unseren Produkten gleich.

Das Log-System ist integraler Teil fast all unserer Produkte. Es sorgt dafür das eine Anwendung Logeinträge von den internen Vorgängen in einem definierten Format in Dateien oder auf die Konsole ausgeben kann. Das System ist auf maximale Performance getrimmt, erlaubt verschiedenste Quellen und eine flexible Konfiguration der Ziele für die Logeinträge.

Features

  • Schnell und Stabil: Das Log-System wurde von Grund auf hohe Performance unserer Anwendungen entwickelt. Es kann riesige Mengen von Logeinträgen gleichzeitig verarbeiten, ohne dabei die Anwendung zu blockieren.

  • Quellen: Innerhalb einer Anwendung können die Logeinträge von unterschiedlichen Quellen kommen.

  • Flexible Konfiguration: Mit der Konfiguration kannst du genau steuern, wie viele Logeinträge von welchen Quellen wohin geschrieben werden.

  • Trace Sections: Für die Fehlersuche kannst du mit speziellen Bezeichnern zusätzliche Logeinträge einschalten.

  • Log-Datei Wechsel: Du kannst Log-Dateien automatisch nach verschieden Zeit und Datumsschemas benennen und wechseln lassen.

Abhängigkeiten

Die Konfiguration des Log-Systems basiert auf unserem Konfigurationssystem. Lies bitte das Kapitel zum Konfigurationssystem vor diesem.

Einführung und Funktionsweise

Logeinträge sind ein nützliches Werkzeug mit vielen Vorteilen.

  • Alle Ereignisse in einem System werden in chronologischer Reihenfolge aufgezeichnet. Dadurch lässt sich beispielsweise bei Fehlern der Zeitliche Ablauf eines Problems rekonstruieren.

  • Netzwerkzugriffe und Benutzeraktionen können für eine spätere Analyse gespeichert werden. Es entsteht so eine genaue Dokumentation der Nutzung eines Systems.

  • Probleme und Warnungen können direkt an einen Administrator weitergeleitet werden, dieser kann so zeitnah die Fehler beheben.

  • Entwickler finden in detaillierten Logeinträge schneller die Quellen von Problemen welche möglicherweise erst auf Testsystemen oder in einer Produktiven Umgebung auftreten.

Unser Log-System wurde für all diese Anwendungsfälle entwickelt. Es ist integraler Bestandteil von praktisch all unseren Anwendungen, auch solchen welche normalerweise keine Logeinträge schreiben.

Logeintrag

Ein einzelnes Ereignis in einem System erzeugt eine Logeintrag. Jeder solche Eintrag bekommt einen Zeitstempel mit der genauen Zeit wann das Ereignis aufgetreten ist. Daneben erhält der Logeintrag ein Level und den eigentlichen Text. Folgende Illustration zeigt die verschiedenen Elemente eines Logeintrags:

../../../_images/log-message.jpg

Die Elemente eines Logeintrags.

  • Log Level: Der Level des Logeintrags charakterisiert wie wichtig dieser Eintrag ist.

  • Timestamp: Der Zeitstempel zeigt, wann genau der Eintrag erstellt wurde.

  • Source Path: The Quellpfad definiert die Quelle des Ereignisses innerhalb der Anwendung.

  • Message Text: Der Text beschreibt das Ereignis.

Level

Jedem Logeintrag ist ein bestimmtes Level zugeordnet. Dieses Level bestimmt, wie wichtig der Logeintrag ist. Die folgende Illustration zeigt alle verfügbaren Level und dessen Wichtigkeit.

../../../_images/log-level.jpg

Die verschiedenen Level und deren Wichtigkeit.

Am wichtigsten ist dabei das Level Information, welches Logeinträge markiert welche du immer in einer Logdatei haben möchtest. Dabei handelt es sich oft um Informationen zum Start und Betrieb einer Anwendung.

Darunter folgen Logeinträge vom Level Error, also Fehler in einer Anwendung. Solche Logeinträge weisen auf Probleme hin, welche du in keinem Fall ignorieren solltest.

Noch weniger wichtig sind Logeinträge mit dem Level Warning. Solche Warnungen können auf Probleme hinweisen welche möglicherweise zu Fehlern oder Performanzproblemen führen können, in der Regel aber kein unmittelbares Problem darstellen. Warnungen solltest du dir in jedem Fall anschauen und überlegen ob diese in deiner Installation zu einem Problem werden können.

Am wenigsten wichtig sind die Trace Logeinträge. Diese Logeinträge dienen dazu Probleme in einer Installation zu finden. Unsere Anwendungen erzeugen eine grosse Menge solcher Einträge, es macht daher Sinn diese in einer Produktive Umgebung herauszufiltern.

Quellen

Innerhalb einer Anwendung kann es diverse Quellen für Logeinträge geben. Diese Quellen werden ähnlich wie in einem Dateisystem in einer hierarchischen Struktur angeordnet.

../../../_images/log-source.jpg

Quellen von Logeinträgen und deren hierarchische Struktur.

Diese Quellpfade organisieren die verschiedenen Logeinträge zu logischen Gruppen. Damit kannst du sehr einfach Einträge aus verschiedenen Bereichen einer Anwendung filtern.

Im Beispiel oben siehst du auf der linken Seite die verschiedenen Quellen welche die Einträge in der logischen Struktur auf der rechten Seite einordnen. Es entsteht dabei ein Pfad, ähnlich wie bei einem Dateisystem. Dieser wird am Beispiel der Quelle C001 oben rechts in der Illustration gezeigt.

Ganz unten steht die Wurzel aller Pfade, in der Konfiguration kannst du diese mit einem leeren Pfad ansprechen.

Zeitstempel

Der Zeitstempel ist die Zeit und das Datum an welchem das Ereignis aufgetreten ist. Es handelt sich dabei um den Zeitpunkt wann dass eigentliche Ereignis aufgetreten ist und nicht wann der Logeintrag verarbeitet wurde. Damit lassen sich die Ereignisse in der chronologischen Reihenfolge nachvollziehen, in denen diese aufgetreten sind.

Teilweise kann das zu verwirrenden Situationen führen. Da das Log-System auf hohe Performanz getrimmt ist, können in einem System welches unter hoher Last steht, die Logeinträge in einer anderen Reihenfolge in die Logdatei geschrieben werden. Dabei stimmen zwar die Zeitstempel, doch sind diese nicht chronologisch in der Datei angeordnet.

Falls dies für eine Analyse einer Logdatei wichtig ist, musst du die Einträge sicherheitshalber vorgängig sortieren. Zusätzlich solltest du die Zeitstempel in diesem Fall mit einer Genauigkeit von einer Millisekunde in die Datei schreiben lassen.

Interessiert dich nur die Genauigkeit von ungefähr einer Sekunde ist dies nie ein Problem.

Logeintrag Text

Der Text eines Logeintrags ist der eigentliche Inhalt. Dieser Text hat kein vordefiniertes Format und auch keine Einschränkungen.

Unser Log-System verwendet intern bei der Verarbeitung Unicode Text. Der Text eines Logeintrags kann daher beliebige Unicode Zeichen verwenden. Daher werden die Logdateien standardmässig in der UTF-8 codierung geschrieben.

Text eines Logeintrags kann sich auch über mehrere Zeilen erstrecken. Falls du einen Parser für unsere Logdateien schreibst ist es wichtig diesen Fall zu berücksichtigen.

Level Filter

Um die Logeinträge zu filtern verwendest du einen sogenannten Level Filter. Es handelt sich dabei um einen Bezeichner der angibt, welche Logeinträge du behalten möchtest. Die folgende Illustration zeigt dir wie ein solcher Filter funktioniert:

../../../_images/filter-examples.jpg

Vier Beispiele wie ein Level Filter die angezeigten Logeinträge beeinflusst.

Die Standardeinstellung ist immer „Trace“ falls du kein Filter in der Konfiguration angibst. Dabei werden keine Logeinträge ausgefiltert.

Konfiguration

Du kannst jede Anwendung welche unser Log-System verwendet über unser Konfigurationssystem konfigurieren. Lies also zuerst das Kapitel Konfigurationssystem falls du dies noch nicht gemacht hast.

In der Konfiguration verwendest du das Log Modul um die Einstellungen vorzunehmen. Dieses Modul ist optional, daher kann es weggelassen werden. In diesem Fall werden keine Logeinträge angezeigt oder in eine Datei geschrieben.

Das folgende Beispiel zeigt eine minimale Konfiguration um Logeinträge in eine Datei zu schreiben:

<Module name="Log">
    <List name="FileWriter">
        <ListEntry>
            <Value name="LogFilePath">C:\LogFiles\project.log</Value>
        </ListEntry>
    </List>
</Module>

Normalerweise definierst du jedoch noch ein Filter um die Trace Nachrichten auszufiltern. Zudem macht es Sinn die Logdateien regelmässig zu wechseln damit diese nicht zu gross werden. Das folgende Beispiel fügt diese Einstellungen hinzu:

<Module name="Log">
    <List name="FileWriter">
        <ListEntry>
            <Value name="LogFilePath">C:\LogFiles\project.log</Value>
            <Value name="LevelFilter">Warning</Value>
            <Value name="Rotation">Daily</Value>
        </ListEntry>
    </List>
</Module>

Schema der Konfiguration

Module

Log

Value

CreateConsoleWriter

Optional

Boolean

Default Value:

Yes

List

FileWriter

Optional

Complex list definition

Value

LogFilePath

String

Value

SourcePath

Optional

String

Default Value:

None

Value

LevelFilter

Optional

String

  • Must be one of this: All, Information, Error, Warning, Trace

Default Value:

Trace

Value

MaximumSize

Optional

Integer

Default Value:

-1

Value

Rotation

Optional

String

  • Must be one of this: NoRotation, Hourly, Daily, Weekly, Monthly

Default Value:

NoRotation

Value

LineFormat

Optional

String

Value

TruncateFile

Optional

Boolean

Default Value:

No

Value

TimeZone

Optional

String

List

Filter

Optional

Complex list definition

Value

SourcePaths

StringList

Value

LevelFilter

String

  • Must be one of this: All, Information, Error, Warning, Trace

List

EnabledTraceSections

Optional

Value list definition

String

  • Must match this regular expression: \w+

Die Konfigurationsstruktur als XML Beispiel

Das folgende Beispiel zeigt die komplette Struktur der Log-Konfiguration anhand eines XML Dokuments.

<?xml version="1.0" encoding="UTF-8" ?>
<Configuration
    version="1"
    xmlns="http://educateit.ch/software/BlueStone/Configuration/1"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

    <Module name="Application">
        ... application configuration ...
    </Module>

    ... additional modules ...

    <Module name="Log">
        <List name="FileWriter">
            <ListEntry>
                <Value name="LogFilePath">...</Value>
                <Value name="SourcePath">...</Value>
                <Value name="LevelFilter">...</Value>
                <Value name="MaximumSize">...</Value>
                <Value name="Rotation">...</Value>
                <Value name="LineFormat">...</Value>
                <Value name="TruncateFile">...</Value>
                <Value name="TimeZone">...</Value>
            </ListEntry>
            ...
        </List>

        <List name="Filter">
            <ListEntry>
                <Value name="SourcePaths">...</Value>
                <Value name="LevelFilter">...</Value>
            </ListEntry>
            ...
        </List>

        <Value name="CreateConsoleWriter">...</Value>

    </Module>

</Configuration>

Die FileWriter Liste

In dieser optionalen Liste kannst du eine oder mehrere Dateien angeben, in welche Logeinträge geschrieben werden. Jeder Eintrag in der Liste benötigt den absoluten Pfad zu der Datei welche geschrieben werden soll. Alle andere Werte in dem Eintrag sind optional.

Wenn du diese Liste weglässt, dann werden keine Logdateien geschrieben. Dies ist das normale Verhalten.

Der Wert LogFilePath

Der Wert LogFilePath ist der einzige den du für einen Eintrag in der Liste angeben musst. Es muss ein absoluter Pfad zu der Logdatei sein und dabei müssen alle Verzeichnisse bis zur Logdatei existieren. Diese Verzeichnisse werden nicht automatisch angelegt.

In Windows ist es nicht notwendig den Backslash \\ als Pfadseparator zu verwenden, am besten verwendest du den regulären Slash / wie auf allen anderen Betriebssystemen.

Das folgende Beispiel zeigt wie ein solcher Pfad zu einer Logdatei konfiguriert werden kann. Es ist gleichzeitig auch das minimale Beispiel für einen Eintrag, da alle anderen Werte optional sind.

<ListEntry>
    <Value name="LogFilePath">e:/Test/application.log</Value>
</ListEntry>

Der Wert SourcePath

Innerhalb jeder Applikation hat es verschiedenste Quellen für Ereignisse. Mit dem Wert SourcePath gibst du einen Pfad zu einer dieser Quellen an. Damit limitierst du die Logeinträge auf solche dieser Quelle.

Der Standartwert ist ein leerer Text. Das selektiert die Wurzel aller Quellpfade. Damit werden die Logeinträge aller Quellen in die Datei geschrieben.

Im folgenden Beispiel werden nur Logeinträge von dem Komponenten Manager geschrieben:

<ListEntry>
    <Value name="LogFilePath">e:/Test/application.log</Value>
    <Value name="SourcePath">dzcore/ComponentManager</Value>
</ListEntry>

Wenn unter dem Pfad dzcore/ComponentManager weitere Quelle existieren, wie beispielsweise dzcore/ComponentManager/example werden diese auch berücksichtigt.

Der Quellpfad darf weder mit einem Slash starten, noch damit enden und darf kein Whitespace enthalten.

Der Wert LevelFilter

Mit dem optionalen Wert LevelFilter kannst du die geschriebenen Logeinträge nach dem Level filtern. Die verschiedenen Werte sind im Kapitel Level Filter erklärt. Dieser Filter wird nur auf die Datei angewendet, welche in diesem Eintrag konfiguriert wird.

Falls du bereits Einträge mit der Filter Liste gefiltert hast, kannst du diese hier nicht mehr wiederherstellen.

Das folgende Beispiel schreibt nur Logeinträge mit dem Level Information und Error:

<ListEntry>
    <Value name="LogFilePath">e:/Test/application.log</Value>
    <Value name="LevelFilter">Error</Value>
</ListEntry>

Der Wert MaximumSize

Mit dem optionalen Wert MaximumSize setzt du die maximale Grösse einer Logdatei. Erreicht die Logdatei die angegebene Grösse wird sie mit einer neuen ausgetauscht.

Der Wert ist die Grösse der Datei in Bytes, dabei kannst du die üblichen Suffixe wie kb oder mb angeben um grössere Werte abzukürzen. Siehe dazu auch das Kapitel Ganzzahlen (integer).

Die negative Zahl -1 hat eine spezielle Bedeutung. Sie schaltet die Grössenlimite ab. Dies ist auch der Standardverhalten wenn du diesen Wert nicht konfigurierst.

In dem folgende Beispiel wird die Logdatei ausgetauscht, sobald sie grösser als 120 Megabytes wird:

<ListEntry>
    <Value name="LogFilePath">e:/Test/application.log</Value>
    <Value name="MaximumSize">120mb</Value>
</ListEntry>

Ist diese Konfiguration aktiviert, fügt das Log-System bei jedem Austausch der Datei ein Suffix mit einer Nummer an den Dateinamen. Das folgende Beispiel zeigt wie die Dateinahmen aussehen könnten:

application-00001.log
application-00002.log
application-00003.log
...

Der Wert Rotation

Mit dem optionalen Wert Rotation aktivierst du einen auf Zeit basierenden Austausch der Logdateien. Du gibst dabei einen Bezeichner wie Hourly, Daily, Weekly oder Monthly an. Das Standardverhalten ist NoRotation, welches die Logdatei nicht auf Zeit basierend austauscht.

Wenn du diesen Austausch aktiviert hast, fügt das Log-System einen Suffix mit der Zeit und Datum dem Dateinamen hinzu. Die folgende Tabelle zeigt dabei das Format des Suffixes für die verschiedenen Einstellungen.

Bezeichner

Muster

Beispiel für application.log

Hourly

_yyyymmdd_hh

application_20210501_10.log

Daily

_yyyymmdd

application_20210501.lo

Weekly

_yyyy_ww

application_2021_17.log

Monthly

_yyyymm

application_202105.log

Bemerkung

Die Logdatei wird nicht genau auf die Millisekunde beim Datumswechsel ausgetauscht. Es kann also vorkommen, dass noch einzelne Logeinträge des neuen Datums in der alten Logdatei vorhanden sind.

Dieses Verhalten solltest du berücksichtigen, falls du Logdateien analysierst und du wirklich jeden Logeintrag zu einem bestimmten Datum benötigst.

Der Wert LineFormat

Mit dem optionalen Wert LineFormat definierst du das Format einer Zeile in der Logdatei. Du konfigurierst dabei den Text der Zeile mit Platzhaltern die durch die Elemente des Logeintrags ersetzt werden.

Das folgende Beispiel zeigt das Standardformat für eine Zeile:

{level} {datetime} {source} {message}

Mit diesem Format wird eine die Zeile in der Logdatei wie in dem folgenden Beispiel geschrieben:

INF 2021-07-06 14:57:49 dzsvc/Application Starting App...

Text ausserhalb der Platzhalter wird genau so in die Zeile geschrieben. In dem Beispiel oben sind es Leerzeichen zwischen den Platzhaltern. Du kannst jedoch beliebige Trennzeichen und Text einfügen. Im Kapitel Das Format der Platzhalter sind alle möglichen Platzhalter und deren Parameter erklärt.

Der Wert TruncateFile

Mit dem optionalen Wert TruncateFile steuerst du, ob die Logdatei bei jedem Start überschrieben wird. Das Standardverhalten fügt neue Logeinträge an eine bestehende Datei an. Lässt du diesen Wert weg oder setzt den Wert auf No, verhält sich das Log-System genau so.

Bei Tests möchtest du vielleicht immer mit einer leeren Logdatei starten. In diesem Fall setzt du diesen Wert auf Yes, so wird eine bestehende Logdatei immer überschrieben.

Der Wert TimeZone

Mit dem optionalen Wert TimeZone setzt du die Zeitzone für den Zeitstempel. Lässt du diesen Wert weg, ist das Standardverhalten die Zeit als UTC auszugeben.

Mit dem Bezeichner System wird die Zeitzone verwendet, welche auf dem System eingestellt ist.

Im Kapitel Unterstützte Bezeichner für Zeitzonen findest du eine Liste mit allen unterstützten Bezeichner für Zeitzonen.

Bemerkung

Wir empfehlen dir für Logdateien die Zeit immer als UTC zu schreiben. Das erleichtert den Vergleich von Logdateien von verschiedenen Systemen und aus anderen Zeitzonen. Zudem entstehen so keine Probleme bei einem Wechsel zwischen Sommer- und Winterzeit.

Die Filter Liste

Mit der optionalen Filter Liste definierst du einen oder mehrere Filter auf ausgewählten Quellpfaden. Jeder Eintrag in dieser Liste hat zwei Werte: Der SourcePaths Wert der die Quellpfade definiert auf die der Filter angewendet wird und den LevelFilter Wert welcher den eigentlichen Filter definiert.

Die folgende Illustration zeigt das Log-System mit fünf verschiedenen Nachrichten und unterschiedlichen Levels auf der linken Seite. Diese Nachrichten werden von verschiedenen Quellen an das System gesendet. Da kein Filter definiert ist, landen alle Nachrichten als Logeinträge in der Logdatei.

../../../_images/filter-1.jpg

Wir setzen jetzt einen Error Filter auf den Quellpfad Network/Connection. Als Konfiguration sieht das so aus:

<List name="Filter">
    <ListEntry>
        <Value name="SourcePaths">Network/Connection</Value>
        <Value name="LevelFilter">Error</Value>
    </ListEntry>
</List>

Jetzt werden an diesem Quellpfad alle Nachrichten mit den Level Warning und Trace gefiltert. Die folgende Illustration zeigt die Situation mit der neuen Konfiguration:

../../../_images/filter-2.jpg

Wir modifizieren jetzt die Konfiguration und setzen den Filter statt Error auf All. Die Konfiguration sieht jetzt so aus:

<List name="Filter">
    <ListEntry>
        <Value name="SourcePaths">Network/Connection</Value>
        <Value name="LevelFilter">All</Value>
    </ListEntry>
</List>

Mit der geänderten Konfiguration werden jetzt alle Nachrichten von dem Quellpfad Network/Connection gefiltert. Die folgende Illustration zeigt die neue Situation:

../../../_images/filter-3.jpg

Der Wert SourcePaths

Mit dem Wert SourcePaths definierst du einen oder mehrere Quellpfade auf die der Filter angewendet wird. Mehrere Quellpfade trennst du mit Whitespace. Der Filter wird dabei auf alle definierten Quellpfade angewendet.

Das folgende Beispiel Zeigt ein Filtereintrag welcher auf einen einzelnen Quellpfad angewendet wird:

<List name="Filter">
    <ListEntry>
        <Value name="SourcePaths">Network/Connection</Value>
        <Value name="LevelFilter">Warning</Value>
    </ListEntry>
</List>

Das nächste Beispiel zeigt ein Filtereintrag mit mehreren Quellpfaden:

<List name="Filter">
    <ListEntry>
        <Value name="SourcePaths">
            Console/Trace
            Network/SSL
            Network/Connection
        </Value>
        <Value name="LevelFilter">All</Value>
    </ListEntry>
</List>

Der Wert LevelFilter

Der Wert LevelFilter setzt den Filter für die gewählten Quellpfade. Siehe dazu auch Kapitel Level Filter.

Das folgende Beispiel setzt einen Error Filter auf den Quellpfad Network/Connection und einen All Filter auf den Quellpfad Console/Trace:

<List name="Filter">
    <ListEntry>
        <Value name="SourcePaths">Network/Connection</Value>
        <Value name="LevelFilter">Error</Value>
    </ListEntry>
    <ListEntry>
        <Value name="SourcePaths">Console/Trace</Value>
        <Value name="LevelFilter">All</Value>
    </ListEntry>
</List>

Weitere Werte

Der Wert CreateConsoleWriter

Der optionale Wert CreateConsoleWriter wird nur zu Testzwecken verwendet. Er steuert ob Logeinträge in Testumgebungen auf der Konsole ausgegeben werden. In produktiven Umgebungen soll er nicht verwendet werden.

Die Liste EnabledTraceSections

Mit der Liste EnabledTraceSections aktivierst du zusätzliche Diagnoseinformationen in unseren Anwendungen. Die dazu notwendigen Bezeichner in der Dokumentation der jeweiligen Anwendung ersichtlich, oder wir teilen dir Bezeichner mit, die du aktivieren kannst um einen Fehler einzugrenzen.

Aktivierte Diagnoseinformationen können unsere Anwendungen verlangsamen, daher solltest du sie nur zur Fehlersuche aktivieren. In einer produktiven Umgebung soll diese Liste nicht Konfiguriert sein.

Das folgende Beispiel Aktiviert zusätzliche Diagnoseinformationen mit dem Bezeichner MsgKeepAlive:

 <Module name="Log">
     <List name="FileWriter">
         <ListEntry>
             <Value name="LogFilePath">c:/application.log</Value>
         </ListEntry>
     </List>
     <List name="EnabledTraceSections">
         <Value>MsgKeepAlive</Value>
     </List>
</Module>

Das Format der Platzhalter

Jeder Platzhalter wird in geschweifte Klammern ({, }) eingeschlossen. Innerhalb dieser Klammern startet er mit dem Bezeichner für das gewünschte Feld des Logeintrags. Mögliche Bezeichner sind level, datetime, source und message.

Einige der Platzhalter unterstützen zusätzliche Parameter, die mit einem Pipe-Zeichen (|) getrennt hinter dem Bezeichner folgen. Jeder solcher Parameter startet mit dem Namen des Parameters, gefolgt von einem Gleichzeichen (=) und endet mit dem Wert.

Im folgenden Beispiel siehst du die verschiedenen Formate der Platzhalter:

{name}                            ← No parameer
{name|paramName=value}            ← One parameter
{name|p1=value|p2=value|p3=value} ← Multiple parameter

Der level Platzhalter

Dieser Platzhalter wird mit dem Level des Logeintrags ersetzt. Er unterstützt zwei Parameter, welche das Format steuern, wie das Level in die Logdatei geschrieben wird. Der erste Parameter ist case: Er steuert ob das Level in Gross- oder Kleinbuchstaben geschrieben wird.

Der zweite Parameter ist format: Dieser steuert in welcher Schreibweise das Level ausgegeben wird.

Das folgende Beispiel zeigt den level Platzhalter. Einmal ohne Parameter und einmal mit einer Ausgabe als einzelner Grossbuchstabe.

{level}
{level|case=Upper|format=Short1}

Die folgende Tabelle zeigt alle Kombinationen der beiden Parameter und die Ausgabe die du damit erhältst:

case

format

Ausgabe 1

Ausgabe 2

Mixed

Full

Information

Warning

Upper

Full

INFORMATION

WARNING

Lower

Full

information

warning

Mixed

Short1

I

W

Upper

Short1

I

W

Lower

Short1

i

w

Mixed

Short3

INF

WRN

Upper

Short3

INF

WRN

Lower

Short3

inf

wrn

Der datetime Platzhalter

Mit dem datetime Platzhalter fügst du den Zeitstempel des Logeintrags in den Text ein. Dieser Platzhalter hat einen optionalen Parameter format, mit dem du die Ausgabe des Datums und der Zeit steuerst.

Das Datums- und Zeitformat wird durch eine Kombination von einem oder mehreren Buchstaben definiert. Die folgende Tabelle zeigt alle möglichen Buchstabenkombinationen und welche Bedeutung diese haben. Alle anderen Zeichen werden unverändert eingefügt. Indem du Buchstaben in Anführungszeichen einschliesst, werden diese nicht als Datum interpretiert.

Ausdruck

Bedeutung

d

Der Tag als Zahl ohne führende Null (1-31).

dd

Der Tag als Zahl mit führendem Null (01-31).

ddd

Der abgekürzte übersetzte Tagesname (Beispielsweise „Mon“ bis „Sun“).

dddd

Der übersetzte Tagesname (Beispielsweise „Monday“ bis „Sunday“).

M

Der Monat als Zahl ohne führende Null (1-12).

MM

Der Monat als Zahl mit führender Null (01-12).

MMM

Der abgekürzte übersetzte Monatsname (Beispielsweise „Jan“ bis „Dec“).

MMMM

Der übersetzte Monatsname (Beispielsweise „January“ bis „December“).

yy

Das Jahr mit zwei Ziffern (00-99).

yyyy

Das Jahr mit vier Ziffern (0000-9999).

h

Die Stunde ohne führende Null (0-23 oder 1-12 bei der AM/PM Anzeige).

hh

Die Stunde mit einer führenden Null (00-23 oder 01-12 bei der AM/PM Anzeige).

H

Die Stunden ohne führende Null (0-23, auch bei der AM/PM Anzeige).

HH

Die Stunde mit einer führenden Null (00-23, auch bei der AM/PM Anzeige).

m

Die Minute ohne führende Null (0-59).

mm

Die Minute mit führender Null (00-59).

s

Die Sekunde ohne führende Null (0-59).

ss

Die Sekunde mit führender Null (00-59).

z

Die anzahl Millisekunden ohne führende Nulls (0-999).

zzz

Die anzahl Millisekunden mit führenden Nulls (000-999).

AP oder A

Die AM/PM Anzeige mit Grossbuchstaben, stellt das Format von h und hh um.

ap oder a

Die am/pm Anzeige mit Kleinbuchstaben, stellt das Format von h und hh um.

Das folgende Beispiel zeigt zweimal den datetime Platzhalter. Zuerst ohne Parameter und in der zweiten Zeile mit dem format Parameter.

{datetime}
{datetime|format=yyyyMMdd hhmmss}

Der source Platzhalter

Mit dem source Platzhalter fügt du die Quelle des Logeintrags in die Ausgabe ein. Dieser Platzhalter hat keine Parameter.

{source}

Der message Platzhalter

Mit dem message Platzhalter fügst du die eigentliche Nachricht des Logeintrags in die Ausgabe ein. Dieser Platzhalter hat keine Parameter.

{message}

Unterstützte Bezeichner für Zeitzonen

Africa/Abidjan                  Africa/Accra                    Africa/Addis_Ababa              Africa/Algiers                  Africa/Asmera                   Africa/Bamako
Africa/Bangui                   Africa/Banjul                   Africa/Bissau                   Africa/Blantyre                 Africa/Brazzaville              Africa/Bujumbura
Africa/Cairo                    Africa/Casablanca               Africa/Ceuta                    Africa/Conakry                  Africa/Dakar                    Africa/Dar_es_Salaam
Africa/Djibouti                 Africa/Douala                   Africa/El_Aaiun                 Africa/Freetown                 Africa/Gaborone                 Africa/Harare
Africa/Johannesburg             Africa/Juba                     Africa/Kampala                  Africa/Khartoum                 Africa/Kigali                   Africa/Kinshasa
Africa/Lagos                    Africa/Libreville               Africa/Lome                     Africa/Luanda                   Africa/Lubumbashi               Africa/Lusaka
Africa/Malabo                   Africa/Maputo                   Africa/Maseru                   Africa/Mbabane                  Africa/Mogadishu                Africa/Monrovia
Africa/Nairobi                  Africa/Ndjamena                 Africa/Niamey                   Africa/Nouakchott               Africa/Ouagadougou              Africa/Porto-Novo
Africa/Sao_Tome                 Africa/Tripoli                  Africa/Tunis                    Africa/Windhoek                 America/Anchorage               America/Anguilla
America/Antigua                 America/Araguaina               America/Argentina/La_Rioja      America/Argentina/Rio_Gallegos  America/Argentina/Salta         America/Argentina/San_Juan
America/Argentina/San_Luis      America/Argentina/Tucuman       America/Argentina/Ushuaia       America/Aruba                   America/Asuncion                America/Bahia
America/Bahia_Banderas          America/Barbados                America/Belem                   America/Belize                  America/Blanc-Sablon            America/Boa_Vista
America/Bogota                  America/Boise                   America/Buenos_Aires            America/Cambridge_Bay           America/Campo_Grande            America/Cancun
America/Caracas                 America/Catamarca               America/Cayenne                 America/Cayman                  America/Chicago                 America/Chihuahua
America/Coral_Harbour           America/Cordoba                 America/Costa_Rica              America/Creston                 America/Cuiaba                  America/Curacao
America/Danmarkshavn            America/Dawson                  America/Dawson_Creek            America/Denver                  America/Detroit                 America/Dominica
America/Edmonton                America/Eirunepe                America/El_Salvador             America/Fortaleza               America/Glace_Bay               America/Godthab
America/Goose_Bay               America/Grand_Turk              America/Grenada                 America/Guadeloupe              America/Guatemala               America/Guayaquil
America/Guyana                  America/Halifax                 America/Havana                  America/Hermosillo              America/Indiana/Knox            America/Indiana/Marengo
America/Indiana/Petersburg      America/Indiana/Tell_City       America/Indiana/Vevay           America/Indiana/Vincennes       America/Indiana/Winamac         America/Indianapolis
America/Inuvik                  America/Iqaluit                 America/Jamaica                 America/Jujuy                   America/Juneau                  America/Kentucky/Monticello
America/Kralendijk              America/La_Paz                  America/Lima                    America/Los_Angeles             America/Louisville              America/Lower_Princes
America/Maceio                  America/Managua                 America/Manaus                  America/Marigot                 America/Martinique              America/Matamoros
America/Mazatlan                America/Mendoza                 America/Menominee               America/Merida                  America/Mexico_City             America/Moncton
America/Monterrey               America/Montevideo              America/Montreal                America/Montserrat              America/Nassau                  America/New_York
America/Nipigon                 America/Nome                    America/Noronha                 America/North_Dakota/Beulah     America/North_Dakota/Center     America/North_Dakota/New_Salem
America/Ojinaga                 America/Panama                  America/Pangnirtung             America/Paramaribo              America/Phoenix                 America/Port-au-Prince
America/Port_of_Spain           America/Porto_Velho             America/Puerto_Rico             America/Rainy_River             America/Rankin_Inlet            America/Recife
America/Regina                  America/Resolute                America/Rio_Branco              America/Santa_Isabel            America/Santarem                America/Santiago
America/Santo_Domingo           America/Sao_Paulo               America/Scoresbysund            America/Sitka                   America/St_Barthelemy           America/St_Johns
America/St_Kitts                America/St_Lucia                America/St_Thomas               America/St_Vincent              America/Swift_Current           America/Tegucigalpa
America/Thule                   America/Thunder_Bay             America/Tijuana                 America/Toronto                 America/Tortola                 America/Vancouver
America/Whitehorse              America/Winnipeg                America/Yakutat                 America/Yellowknife             Antarctica/Casey                Antarctica/Davis
Antarctica/DumontDUrville       Antarctica/Macquarie            Antarctica/Mawson               Antarctica/McMurdo              Antarctica/Palmer               Antarctica/Rothera
Antarctica/Syowa                Antarctica/Vostok               Arctic/Longyearbyen             Asia/Aden                       Asia/Almaty                     Asia/Amman
Asia/Anadyr                     Asia/Aqtau                      Asia/Aqtobe                     Asia/Ashgabat                   Asia/Baghdad                    Asia/Bahrain
Asia/Baku                       Asia/Bangkok                    Asia/Beirut                     Asia/Bishkek                    Asia/Brunei                     Asia/Calcutta
Asia/Chita                      Asia/Choibalsan                 Asia/Colombo                    Asia/Damascus                   Asia/Dhaka                      Asia/Dili
Asia/Dubai                      Asia/Dushanbe                   Asia/Hong_Kong                  Asia/Hovd                       Asia/Irkutsk                    Asia/Jakarta
Asia/Jayapura                   Asia/Jerusalem                  Asia/Kabul                      Asia/Kamchatka                  Asia/Karachi                    Asia/Katmandu
Asia/Khandyga                   Asia/Krasnoyarsk                Asia/Kuala_Lumpur               Asia/Kuching                    Asia/Kuwait                     Asia/Macau
Asia/Magadan                    Asia/Makassar                   Asia/Manila                     Asia/Muscat                     Asia/Nicosia                    Asia/Novokuznetsk
Asia/Novosibirsk                Asia/Omsk                       Asia/Oral                       Asia/Phnom_Penh                 Asia/Pontianak                  Asia/Pyongyang
Asia/Qatar                      Asia/Qyzylorda                  Asia/Rangoon                    Asia/Riyadh                     Asia/Saigon                     Asia/Sakhalin
Asia/Samarkand                  Asia/Seoul                      Asia/Shanghai                   Asia/Singapore                  Asia/Srednekolymsk              Asia/Taipei
Asia/Tashkent                   Asia/Tbilisi                    Asia/Tehran                     Asia/Thimphu                    Asia/Tokyo                      Asia/Ulaanbaatar
Asia/Urumqi                     Asia/Ust-Nera                   Asia/Vientiane                  Asia/Vladivostok                Asia/Yakutsk                    Asia/Yekaterinburg
Asia/Yerevan                    Atlantic/Azores                 Atlantic/Bermuda                Atlantic/Canary                 Atlantic/Cape_Verde             Atlantic/Faeroe
Atlantic/Madeira                Atlantic/Reykjavik              Atlantic/South_Georgia          Atlantic/St_Helena              Atlantic/Stanley                Australia/Adelaide
Australia/Brisbane              Australia/Broken_Hill           Australia/Currie                Australia/Darwin                Australia/Hobart                Australia/Lindeman
Australia/Melbourne             Australia/Perth                 Australia/Sydney                CST6CDT                         EST5EDT                         Etc/GMT
Etc/GMT+1                       Etc/GMT+10                      Etc/GMT+11                      Etc/GMT+12                      Etc/GMT+2                       Etc/GMT+3
Etc/GMT+4                       Etc/GMT+5                       Etc/GMT+6                       Etc/GMT+7                       Etc/GMT-1                       Etc/GMT-10
Etc/GMT-11                      Etc/GMT-12                      Etc/GMT-13                      Etc/GMT-14                      Etc/GMT-2                       Etc/GMT-3
Etc/GMT-4                       Etc/GMT-5                       Etc/GMT-6                       Etc/GMT-7                       Etc/GMT-8                       Etc/GMT-9
Europe/Amsterdam                Europe/Andorra                  Europe/Athens                   Europe/Belgrade                 Europe/Berlin                   Europe/Bratislava
Europe/Brussels                 Europe/Bucharest                Europe/Budapest                 Europe/Busingen                 Europe/Chisinau                 Europe/Copenhagen
Europe/Dublin                   Europe/Gibraltar                Europe/Guernsey                 Europe/Helsinki                 Europe/Isle_of_Man              Europe/Istanbul
Europe/Jersey                   Europe/Kaliningrad              Europe/Kiev                     Europe/Lisbon                   Europe/Ljubljana                Europe/London
Europe/Luxembourg               Europe/Madrid                   Europe/Malta                    Europe/Mariehamn                Europe/Minsk                    Europe/Monaco
Europe/Moscow                   Europe/Oslo                     Europe/Paris                    Europe/Podgorica                Europe/Prague                   Europe/Riga
Europe/Rome                     Europe/Samara                   Europe/San_Marino               Europe/Sarajevo                 Europe/Simferopol               Europe/Skopje
Europe/Sofia                    Europe/Stockholm                Europe/Tallinn                  Europe/Tirane                   Europe/Uzhgorod                 Europe/Vaduz
Europe/Vatican                  Europe/Vienna                   Europe/Vilnius                  Europe/Volgograd                Europe/Warsaw                   Europe/Zagreb
Europe/Zaporozhye               Europe/Zurich                   Indian/Antananarivo             Indian/Chagos                   Indian/Christmas                Indian/Cocos
Indian/Comoro                   Indian/Kerguelen                Indian/Mahe                     Indian/Maldives                 Indian/Mauritius                Indian/Mayotte
Indian/Reunion                  MST7MDT                         PST8PDT                         Pacific/Apia                    Pacific/Auckland                Pacific/Bougainville
Pacific/Efate                   Pacific/Enderbury               Pacific/Fakaofo                 Pacific/Fiji                    Pacific/Funafuti                Pacific/Galapagos
Pacific/Guadalcanal             Pacific/Guam                    Pacific/Honolulu                Pacific/Johnston                Pacific/Kiritimati              Pacific/Kosrae
Pacific/Kwajalein               Pacific/Majuro                  Pacific/Midway                  Pacific/Nauru                   Pacific/Niue                    Pacific/Noumea
Pacific/Pago_Pago               Pacific/Palau                   Pacific/Ponape                  Pacific/Port_Moresby            Pacific/Rarotonga               Pacific/Saipan
Pacific/Tahiti                  Pacific/Tarawa                  Pacific/Tongatapu               Pacific/Truk                    Pacific/Wake                    Pacific/Wallis
UTC                             UTC+00:00                       UTC+01:00                       UTC+02:00                       UTC+03:00                       UTC+03:30
UTC+04:00                       UTC+04:30                       UTC+05:00                       UTC+05:30                       UTC+05:45                       UTC+06:00
UTC+06:30                       UTC+07:00                       UTC+08:00                       UTC+09:00                       UTC+09:30                       UTC+10:00
UTC+11:00                       UTC+12:00                       UTC+13:00                       UTC+14:00                       UTC-00:00                       UTC-01:00
UTC-02:00                       UTC-03:00                       UTC-03:30                       UTC-04:00                       UTC-04:30                       UTC-05:00
UTC-06:00                       UTC-07:00                       UTC-08:00                       UTC-09:00                       UTC-10:00                       UTC-11:00