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:
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.
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.
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:
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
Default Value:
Yes
Complex list definition
Default Value:
None
Must be one of this:
All
,Information
,Error
,Warning
,Trace
Default Value:
Trace
Default Value:
-1
Must be one of this:
NoRotation
,Hourly
,Daily
,Weekly
,Monthly
Default Value:
NoRotation
Default Value:
No
Complex list definition
Must be one of this:
All
,Information
,Error
,Warning
,Trace
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 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
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.
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:
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:
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:
|
|
Ausgabe 1 |
Ausgabe 2 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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 |
---|---|
|
Der Tag als Zahl ohne führende Null ( |
|
Der Tag als Zahl mit führendem Null ( |
|
Der abgekürzte übersetzte Tagesname (Beispielsweise „Mon“ bis „Sun“). |
|
Der übersetzte Tagesname (Beispielsweise „Monday“ bis „Sunday“). |
|
Der Monat als Zahl ohne führende Null ( |
|
Der Monat als Zahl mit führender Null ( |
|
Der abgekürzte übersetzte Monatsname (Beispielsweise „Jan“ bis „Dec“). |
|
Der übersetzte Monatsname (Beispielsweise „January“ bis „December“). |
|
Das Jahr mit zwei Ziffern ( |
|
Das Jahr mit vier Ziffern ( |
|
Die Stunde ohne führende Null ( |
|
Die Stunde mit einer führenden Null ( |
|
Die Stunden ohne führende Null ( |
|
Die Stunde mit einer führenden Null ( |
|
Die Minute ohne führende Null ( |
|
Die Minute mit führender Null ( |
|
Die Sekunde ohne führende Null ( |
|
Die Sekunde mit führender Null ( |
|
Die anzahl Millisekunden ohne führende Nulls ( |
|
Die anzahl Millisekunden mit führenden Nulls ( |
|
Die AM/PM Anzeige mit Grossbuchstaben, stellt das Format von |
|
Die am/pm Anzeige mit Kleinbuchstaben, stellt das Format von |
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