Star
  1. Konfiguration
    1. Properties-Datei
    2. System-Properties
    3. Fluent-API
  2. Einstellungen
    1. Locale
    2. Logging-Format
    3. Logging-Level
    4. Stack-Traces einschränken
    5. Writers
      1. ConsoleWriter
      2. FileWriter
      3. JdbcWriter
      4. LogcatWriter
      5. RollingFileWriter
        1. Labelers
        2. Policies
      6. SharedFileWriter
    6. Writing-Thread

Konfiguration

Es gibt insgesamt drei Wege, tinylog zu konfigurieren: über eine Properties-Datei, über System-Properties (können als "-D"-Parameter gesetzt werden) und programmatisch über eine Fluent-API.

Properties-Datei

Die Konfiguration des Loggers mittels einer Properties-Datei ist für produktive Umgebungen der empfohlene Weg, tinylog zu konfigurieren. Die Properties-Datei sollte "tinylog.properties" heißen und im Default-Package liegen. Dazu reicht es in den gängigen IDEs wie z. B. Eclipse und Netbeans aus, die Datei "tinylog.properties" in das "src/"-Verzeichnis abzulegen. In auf Maven basierenden Projekten liegt "tinylog.properties" typischerweise unter "src/main/resources".

Liegt die Properties-Datei woanders, so kann dies tinylog über das System-Property "tinylog.configuration" mitgeteilt werden (z. B. "-Dtinylog.configuration=c:\conf\tinylog.properties"). Seit tinylog 1.2 kann anstatt einem Pfad zu einer lokalen Datei auch eine URL angegeben werden, um die Konfiguration beispielsweise übers Netzwerk zu laden. Alternativ ist auch möglich, Properties-Dateien programmatisch über den Configurator zu laden.

Beispiel für eine Properties-Datei:

tinylog.writer = file
tinylog.writer.filename = log.txt
tinylog.level = warning

Auf Wunsch kann tinylog die Properties-Datei beobachten und Änderungen automatisch, also während der Laufzeit, übernehmen. Dazu muss das Property "tinylog.configuration.observe" auf "true" gesetzt werden. Das Property kann einfach in der Properties-Datei gesetzt oder als System-Property beim Programmstart übergeben werden.

In OSGi-Anwendungen, wie z. B. Eclipse RCP, ist der einfachste Weg, ein Fragment für das tinylog-Bundle anzulegen und in diesem Fragment die Datei "tinylog.properties" in das Default-Package abzulegen.

System-Properties

System-Properties sind vor allem für Entwickler interessant, da auf diesem Weg die Konfiguration aus der Properties-Datei überschrieben werden kann. In den gängigen IDEs, wie z. B. Eclipse und Netbeans, kann man System-Properties einfach beim Start als "-D"-Parameter übergeben. System-Properties ermöglichen es beispielsweise, in produktiven Umgebungen Trace- und Debug-Log-Einträge zu aktivieren und somit einen Fehler leichter finden zu können.

Beispiel:

-Dtinylog.writer=file -Dtinylog.writer.filename=log.txt -Dtinylog.level=trace

Fluent-API

In speziellen Fällen kann es sinnvoll sein, tinylog programmatisch zu konfigurieren oder zur Laufzeit die Konfiguration zu ändern. Hierzu gibt es eine Fluent-API. Diese gewährleistet, dass neue Konfigurationen immer atomar gesetzt werden. Das heißt, dass alle Änderungen auf einmal aktiv werden, selbst bei multithreaded Programmen. Die Klasse, um tinylog zu konfigurieren, ist der Configurator.

Beispiel:

Configurator.defaultConfig() .writer(new FileWriter("log.txt")) .level(Level.WARNING) .activate();

Configurator.defaultConfig() nimmt die Standard-Konfiguration und Configurator.currentConfig() die aktuelle Konfiguration als Grundlage.

Einstellungen

Locale

Die Locale wird z. B. zum Formatieren eines Datums oder von Zahlen verwendet. Wenn die Locale nicht oder auf "null" gesetzt wird, wird die Default-Locale der JVM verwendet.

Properties Parameter Programmatisch

Definition:

tinylog.locale = <Locale>

Beispiel:

tinylog.locale = de_DE

Definition:

-Dtinylog.locale=<Locale>

Beispiel:

-Dtinylog.locale=de_DE

Methoden-Signatur:

Configurator.locale(Locale locale)

Beispiel:

Configurator.currentConfig() .locale(Locale.GERMANY) .activate();

Logging-Format

Das Logging-Format ist ein Pattern, das das Ausgabeformat der Log-Einträge beschreibt. Das Standard-Pattern ist "{date:yyyy-MM-dd HH:mm:ss} [{thread}] {class}.{method}()\n{level}: {message}".

Platzhalter Beschreibung
{class} Vollständiger Name der Klasse inklusive Package, aus der der Log-Eintrag stammt
{class_name} Name der Klasse (ohne Package), aus der der Log-Eintrag stammt
{context:key} Wert aus dem Logging-Context (Key ist der Schlüssel des Mappings)
{date} Datum und Uhrzeit der Erstellung des Log-Eintrags
Der Platzhalter kann optional ein Datums-Pattern wie z. B. "{date:yyyy-MM-dd HH:mm:ss}" enthalten. Das Datums-Pattern ist kompatibel mit SimpleDateFormat. Seit tinylog 1.3 können auch unter Java 9 Mikrosekunden und Nanosekunden wie im DateTimeFormatter definiert ausgegeben werden.
{file} Dateiname der Java-Quelltext-Datei, aus der der Log-Eintrag stammt
{level} Logging-Level des erstellten Log-Eintrags
{line} Nummer der Zeile, in der der Log-Eintrag erstellt wurde
{message} Text des erzeugten Log-Eintrags
{method} Name der Methode, aus der der Log-Eintrag stammt
{package} Package, aus dem der Log-Eintrag stammt
{pid} Prozess-ID der Anwendung
{thread} Name des aktiven Threads
{thread_id} ID des aktiven Threads

Properties Parameter Programmatisch

Definition:

tinylog.format = <Pattern>

Beispiel:

tinylog.format = {level}: {class}.{method}()\t{message}

Definition:

-Dtinylog.format=<Pattern>

Beispiel:

"-Dtinylog.format={level}: {class}.{method}()\t{message}"

Methoden-Signatur:

Configurator.formatPattern(String formatPattern)

Beispiel:

Configurator.currentConfig() .formatPattern("{level}: {class}.{method}()\t{message}") .activate();

Bei Bedarf kann für einzelne oder gruppierte Platzhalter eine Mindestgröße definiert werden. So ist es zum Beispiel möglich, Platzhalter als Spalten auszugeben.

Properties Parameters Java Code

Beispiel:

tinylog.format = {{level}:|min-size=8} {message}

Beispiel:

"-Dtinylog.format={{level}:|min-size=8} {message}"

Beispiel:

Configurator.currentConfig() .formatPattern("{{level}:|min-size=8} {message}") .activate();

Seit tinylog 1.1 kann die Einrücktiefe nach Zeilenumbrüchen definiert werden. Dies ermöglicht zum Beispiel den Stack-Trace von Exceptions um eine feste Anzahl von Leerzeichen einzurücken. Jedes Tab am Zeilenanfang wird ebenfalls durch die definierte Anzahl an Leerzeichen ersetzt. Dadurch werden die eigentlichen Stack-Traces um die doppelte definierte Anzahl an Leerzeichen eingerückt und die Beschreibung von (Cause-)Exceptions um die einfache Anzahl.

Properties Parameters Java Code

Beispiel:

tinylog.format = {level}: {message|indent=4}

Beispiel:

"-Dtinylog.format={level}: {message|indent=4}"

Beispiel:

Configurator.currentConfig() .formatPattern("{level}: {message|indent=4}") .activate();

Bei der Verwendung von mehreren Writers kann bei Bedarf für einzelne ein eigenes Logging-Format definiert werden.

Properties Parameter Programmatisch

Definition:

tinylog.writer* = <Name>
tinylog.writer*.format = <Pattern>

Beispiel:

tinylog.writer1 = console
tinylog.writer1.format = {level}: {message}

tinylog.writer2 = file
tinylog.writer2.filename = log.txt
tinylog.writer2.format = {class}.{method}()\t{message}

Definition:

-Dtinylog.writer*=<Name>
-Dtinylog.writer*.format=<Pattern>

Beispiel:

-Dtinylog.writer1=console
"-Dtinylog.writer1.format={level}: {message}"

-Dtinylog.writer2=file
-Dtinylog.writer2.filename=log.txt
"-Dtinylog.writer2.format={class}.{method}()\t{message}"

Methoden-Signatur:

Configurator.writer(Writer writer, String formatPattern).addWriter(Writer writer, String formatPattern)

Beispiel:

Configurator.currentConfig() .writer(new ConsoleWriter(), "{level}: {message}") .addWriter(new FileWriter("log.txt"), "{class}.{method}()\t{message}") .activate();

Logging-Level

tinylog unterstützt fünf verschiedene Logging-Level: TRACE < DEBUG < INFO < WARNING < ERROR. Standardmäßig ist das Level INFO aktiv. Das bedeutet, dass nur Log-Einträge mit dem Logging-Level INFO und höher (INFO, WARNING und ERROR) ausgegeben und alle anderen Log-Einträge (TRACE und DEBUG) ignoriert werden. Das Logging-Level kann auch auf OFF gesetzt werden, um das Loggen zu deaktivieren.

Properties Parameter Programmatisch

Definition:

tinylog.level = <Logging-Level>

Beispiel:

tinylog.level = debug

Definition:

-Dtinylog.level=<Logging-Level>

Beispiel:

-Dtinylog.level=debug

Methoden-Signatur:

Configurator.level(Level level)

Beispiel:

Configurator.currentConfig() .level(Level.DEBUG) .activate();

Bei Bedarf kann für einzelne Packages oder Klassen ein abweichendes Logging-Level gesetzt werden.

Properties Parameter Programmatisch

Definition:

tinylog.level@<Package oder Klasse> = <Logging-Level>

Beispiel:

tinylog.level@org.pmw.tinylog = trace

Definition:

-Dtinylog.level@<Package oder Klasse>=<Logging-Level>

Beispiel:

-Dtinylog.level@org.pmw.tinylog=trace

Methoden-Signatur:

Configurator.level(String packageOrClass, Level level)

Beispiel:

Configurator.currentConfig() .level("org.pmw.tinylog", Level.TRACE) .activate();

Bei der Verwendung von mehreren Writers kann bei Bedarf für einzelne ein separates Logging-Level definiert werden. Der Writer gibt dann nur Log-Einträge mit dem definierten oder höherem Logging-Level aus.

Properties Parameter Programmatisch

Definition:

tinylog.writer* = <Name>
tinylog.writer*.level = <Logging-Level>

Beispiel:

tinylog.writer1 = console
tinylog.writer1.level = trace

tinylog.writer2 = file
tinylog.writer2.filename = log.txt
tinylog.writer2.level = info

Definition:

-Dtinylog.writer*=<Name>
-Dtinylog.writer*.level=<Logging-Level>

Beispiel:

-Dtinylog.writer1=console
-Dtinylog.writer1.level=trace

-Dtinylog.writer2=file
-Dtinylog.writer2.filename=log.txt
-Dtinylog.writer2.level=info

Methoden-Signatur:

Configurator.writer(Writer writer, Level level).addWriter(Writer writer, Level level)

Beispiel:

Configurator.currentConfig() .writer(new ConsoleWriter(), Level.TRACE) .addWriter(new FileWriter("log.txt"), Level.INFO) .activate();

Stack-Traces einschränken

Die Anzahl der maximal ausgegebenen Zeilen eines Strack-Traces einer Exception kann beschränkt werden, damit die Logs nicht zu groß werden. Der Standard-Maximalwert ist "40". Mit dem Wert "-1" kann die Beschränkung aufgehoben und mit dem Wert "0" Stack-Traces komplett deaktiviert werden.

Properties Parameter Programmatisch

Definition:

tinylog.stacktrace = <Max. Zeilen>

Beispiel:

tinylog.stacktrace = 100

Definition:

-Dtinylog.stacktrace=<Max. Zeilen>

Beispiel:

-Dtinylog.stacktrace=100

Methoden-Signatur:

Configurator.maxStackTraceElements(int maxStackTraceElements)

Beispiel:

Configurator.currentConfig() .maxStackTraceElements(100) .activate();

Writers

Ein Writer ist für die Ausgabe der Log-Einträge zuständig (z. B. in eine Log-Datei oder in die Konsole). Standardmäßig werden die Log-Einträge in der Konsole ausgegeben. In tinylog sind sechs Writers enthalten.

Writer Name Beschreibung
ConsoleWriter console Schreibt Log-Einträge in die Konsole
FileWriter file Schreibt Log-Einträge in eine angegebene Datei
JdbcWriter jdbc Speichert Log-Einträge in eine SQL-Datenbank
LogcatWriter logcat Leitet Log-Einträge an Androids natives Logging-System weiter
RollingFileWriter rollingfile Wie der FileWriter, aber nutzt rotierend mehrere Log-Dateien
SharedFileWriter sharedfile Unterstützt das Schreiben von mehreren Instanzen einer Anwendung in dieselbe Datei
null null Alle Log-Einträge verschwinden im "Nichts"

Properties Parameter Programmatisch

Definition:

tinylog.writer = <Name oder null>

Beispiel:

tinylog.writer = console

Definition:

-Dtinylog.writer=<Name oder null>

Beispiel:

-Dtinylog.writer=console

Methoden-Signatur:

Configurator.writer(Writer writer)

Beispiel:

Configurator.currentConfig() .writer(new ConsoleWriter()) .activate();

Es können beliebig viele Writers aktiviert werden. So ist es beispielsweise möglich, Log-Einträge gleichzeitig in die Konsole und in eine Log-Datei auszugeben.

Properties Parameter Programmatisch

Definition:

tinylog.writer* = <Name>

Beispiel:

tinylog.writer1 = console

tinylog.writer2 = file
tinylog.writer2.filename = log.txt

Definition:

-Dtinylog.writer*=<Name>

Beispiel:

-Dtinylog.writer1=console

-Dtinylog.writer2=file
-Dtinylog.writer2.filename=log.txt

Methoden-Signatur:

Configurator.writer(Writer writer).addWriter(Writer writer)

Beispiel:

Configurator.currentConfig() .writer(new ConsoleWriter()) .addWriter(new FileWriter("log.txt")) .activate();

Optional können einzelne Writers mit separatem Logging-Format und/oder Logging-Level versehen werden.

ConsoleWriter

Der ConsoleWriter ist der Standard-Writer und schreibt Log-Einträge in die Konsole. Standardmäßig werden Warnungen und Fehler werden im Error-Stream (System.err), alle anderen Logging-Level im Standard-Output-Stream (System.out) ausgegeben. Der ConsoleWriter kann ab tinylog 1.3 auch so konfiguriert werden, dass alle Log-Einträge unabhängig des Logging-Levels immer im selben Stream ausgegeben werden.

Properties Parameter Programmatisch

Definition:

tinylog.writer = <name>
tinylog.writer.stream = <stream> (optional)

Beispiel:

tinylog.writer = console
tinylog.writer.stream = err

Definition:

-Dtinylog.writer=<name>
-Dtinylog.writer.stream=<stream> (optional)

Beispiel:

-Dtinylog.writer=console
-Dtinylog.writer.stream=err

Methoden-Signatur:

Configurator.writer(Writer writer)

Beispiel:

Configurator.currentConfig() .writer(new ConsoleWriter()) .activate();

FileWriter

Der FileWriter schreibt Log-Einträge in eine definierte Datei. Das Schreiben kann optional gepuffert erfolgen, was vor allem im Zusammenspiel mit dem Writing-Thread deutlich performanter ist. Gepuffertes Schreiben kann allerdings dazu führen, dass beim Absturz der JVM möglicherweise die letzten - und damit die wichtigsten - Log-Einträge verloren gehen.

Eine bereits existierende Log-Datei wird standardmäßig beim Start überschrieben. Seit tinylog 1.1 ist es möglich Log-Dateien durch das Aktivieren des Append-Modus fortzusetzen.

Properties Parameter Programmatisch

Definition:

tinylog.writer = <Name>
tinylog.writer.filename = <Dateiname>
tinylog.writer.buffered = <puffern> (default: false)
tinylog.writer.append = <fortsetzen> (default: false)

Beispiel:

tinylog.writer = file
tinylog.writer.filename = log.txt
tinylog.writer.buffered = true
tinylog.writer.append = false

Definition:

-Dtinylog.writer=<Name>
-Dtinylog.writer.filename=<Dateiname>
-Dtinylog.writer.buffered=<puffern> (default: false)
-Dtinylog.writer.append=<fortsetzen> (default: false)

Beispiel:

-Dtinylog.writer=file
-Dtinylog.writer.filename=log.txt
-Dtinylog.writer.buffered=true
-Dtinylog.writer.append=false

Methoden-Signatur:

Configurator.writer(Writer writer)

Beispiel:

Configurator.currentConfig() .writer(new FileWriter("log.txt", true, false)) .activate();

JdbcWriter

Der JdbcWriter schreibt Log-Einträge in eine SQL-Datenbank. Die Inserts können optional im Batch-Modus erfolgen, was vor allem im Zusammenspiel mit dem Writing-Thread deutlich performanter ist. Der Batch-Modus führt allerdings zu verzögerten Inserts, was dazu führen kann, dass beim Absturz der JVM möglicherweise die letzten - und damit die wichtigsten - Log-Einträge verloren gehen.

Mit tinylog 1.2 werden Java-EE-Data-Sources sowie die automatische Wiederherstellung der Verbindung zur Datenbank nach einem Verbindungsabbruch unterstützt. Zur Aktivierung der automatischen Verbindungswiederherstellung genügt es die Zeitspanne zwischen zwei Verbindungsversuchen einzustellen. URLs von Data-Sources können genau wie JDBC-URLs definiert werden. tinylog erkannt anhand der URL automatisch, ob es sich um eine Date-Source oder JDBC handelt. Benutzername und Passwort brauchen für Date-Sources nicht in tinylog gesetzt zu werden, da diese üblicherweise bereits in der Data-Source selbst definiert wurden.

Zur Vermeidung von Sicherheitslücken durch SQL-Injections, werden PreparedStatements genutzt.

Properties Parameter Programmatisch

Definition:

tinylog.writer = <Name>
tinylog.writer.url = <JDBC oder Data-Source>
tinylog.writer.reconnect = <Sekunden> (default: aus)
tinylog.writer.table = <Tabellenname>
tinylog.writer.columns = <Spalten> (default: aus Tabelle)
tinylog.writer.values = <Werte zu loggen>
tinylog.writer.batch = <Batch-Modus> (default: false)
tinylog.writer.username = <Benutzername> (falls vorhanden)
tinylog.writer.password = <Passwort> (falls vorhanden)

Beispiel:

tinylog.writer = jdbc
tinylog.writer.url = jdbc:h2:mem:mydb
tinylog.writer.table = LOG_ENTRIES_TABLE
tinylog.writer.columns = COLUMN_A, COLUMN_B
tinylog.writer.values = LEVEL, MESSAGE

Definition:

-Dtinylog.writer=<Name>
-Dtinylog.writer.url=<JDBC oder Data-Source>
-Dtinylog.writer.reconnect=<Sekunden> (default: aus)
-Dtinylog.writer.table=<Tabellenname>
-Dtinylog.writer.columns=<Spalten> (default: aus Tabelle)
-Dtinylog.writer.values=<Werte zu loggen>
-Dtinylog.writer.batch=<Batch-Modus> (default: false)
-Dtinylog.writer.username=<Benutzername> (falls vorhanden)
-Dtinylog.writer.password=<Passwort> (falls vorhanden)

Beispiel:

-Dtinylog.writer=jdbc
-Dtinylog.writer.url=jdbc:h2:mem:mydb
-Dtinylog.writer.table=LOG_ENTRIES_TABLE
-Dtinylog.writer.columns=COLUMN_A, COLUMN_B
-Dtinylog.writer.values LEVEL, MESSAGE

Methoden-Signatur:

Configurator.writer(Writer writer)

Beispiel:

Configurator.currentConfig() .writer(new JdbcWriter("jdbc:h2:mem:mydb", "LOG_ENTRIES_TABLE", Arrays.asList("COLUMN_A", "COLUMN_B"), Arrays.asList(Value.LEVEL, Value.MESSAGE))) .activate();

Folgende Werte können ausgegeben werden:

Name Beschreibung
CLASS Vollständiger Name der Klasse inklusive Package, aus der der Log-Eintrag stammt
CLASS_NAME Name der Klasse (ohne Package), aus der der Log-Eintrag stammt
CONTEXT Alle im Logging-Context gesetzten Werte (neu in tinylog 1.1)
DATE Datum und Uhrzeit der Erstellung des Log-Eintrags
EXCEPTION Geworfene Exception (null, wenn keine Exception geworfen wurde)
FILE Dateiname der Java-Quelltext-Datei, aus der der Log-Eintrag stammt
LEVEL Logging-Level des erstellten Log-Eintrags
LINE Nummer der Zeile, in der der Log-Eintrag erstellt wurde
MESSAGE Text des erzeugten Log-Eintrags
METHOD Name der Methode, aus der der Log-Eintrag stammt
PACKAGE Package, aus dem der Log-Eintrag stammt
PROCESS_ID Prozess-ID der Anwendung
RENDERED_LOG_ENTRY Vollständig gerenderter Log-Eintrag, wie er bei textbasierten Ausgaben verwendet wird
THREAD_ID ID des aktiven Threads
THREAD_NAME Name des aktiven Threads

LogcatWriter

Der LogcatWriter leitet Log-Einträge an Androids natives Logging-System (bekannt als logcat) weiter. Dieser Writer kann ausschließlich unter Android verwendet werden und ist neu in tinylog 1.2. Standardmäßig wird der Name der Klasse (ohne Package), aus der der Log-Eintrag stammt, als Tag für logcat verwendet.

Properties Parameter Programmatisch

Definition:

tinylog.writer = <name>
tinylog.writer.tag = <tag> (default: Name der Klasse)

Beispiel:

tinylog.writer = logcat
tinylog.writer.tag = MyApp

Definition:

-Dtinylog.writer=<name>
-Dtinylog.writer.tag=<tag> (default: Name der Klasse)

Beispiel:

-Dtinylog.writer=logcat
-Dtinylog.writer.tag=MyApp

Methoden-Signatur:

Configurator.writer(Writer writer)

Beispiel:

Configurator.currentConfig() .writer(new LogcatWriter()) .activate();

RollingFileWriter

Der RollingFileWriter schreibt Log-Einträge in eine definierte Datei. Dabei kann in regelmäßigen Abständen eine neue Log-Datei begonnen werden. Alte Log-Dateien werden als Backup aufbewahrt. Um das Vergeben von eindeutigen Namen kümmert sich ein Labeler. Standardmäßig werden die Log-Dateien durchnummeriert. Wann eine neue Log-Datei begonnen werden soll, kann über Policies definiert werden. Wenn nichts anderes eingestellt wurde, wird bei jedem Start eine neue Log-Datei begonnen.

Das Schreiben in die Log-Datei kann optional gepuffert erfolgen, was vor allem im Zusammenspiel mit dem Writing-Thread deutlich performanter ist. Gepuffertes Schreiben kann allerdings dazu führen, dass beim Absturz der JVM möglicherweise die letzten - und damit die wichtigsten - Log-Einträge verloren gehen.

Properties Parameter Programmatisch

Definition:

tinylog.writer = <Name>
tinylog.writer.filename = <Dateiname>
tinylog.writer.buffered = <puffern> (default: false)
tinylog.writer.backups = <Anzahl der Backups>
tinylog.writer.label = <Labeler> (default: count)
tinylog.writer.policies = <Policies> (default: startup)

Beispiel:

tinylog.writer = rollingfile
tinylog.writer.filename = log.txt
tinylog.writer.backups = 10
tinylog.writer.label = timestamp
tinylog.writer.policies = startup, size: 10KB

Definition:

-Dtinylog.writer=<Name>
-Dtinylog.writer.filename=<Dateiname>
-Dtinylog.writer.buffered=<puffern> (default: false)
-Dtinylog.writer.backups=<Anzahl der Backups>
-Dtinylog.writer.label=<Labeler> (default: count)
-Dtinylog.writer.policies=<Policies> (default: startup)

Beispiel:

-Dtinylog.writer=rollingfile
-Dtinylog.writer.filename=log.txt
-Dtinylog.writer.backups=10
-Dtinylog.writer.label = timestamp
"-Dtinylog.writer.policies=startup, size: 10KB"

Methoden-Signatur:

RollingFileWriter(String filename, int backups, Policy... policies)

Beispiel:

Configurator.currentConfig() .writer(new RollingFileWriter("log.txt", 10, new TimestampLabeler(), new StartupPolicy(), new SizePolicy(10 * 1024))) .activate();

Labelers

Der RollingFileWriter unterstützt Labelers, die archivierte Log-Dateien nach einem definierten Schema benennen. Standardmäßig ist der CountLabeler aktiv.

Labeler Name Beschreibung
CountLabeler count Nummeriert Backups durch (z. B. "log.0.txt" für das aktuellste Backup, "log.1.txt" für das zweit-aktuellste usw.)
ProcessIdLabeler pid Fügt die Prozess-ID der Anwendung zum Dateinamen hinzu (z. B. "log.1836.txt", wenn die Prozess-ID 1836 lautet) und stellt so sicher, dass jede aktive Instanz der Anwendung eine eigene Log-Datei erhält
TimestampLabeler timestamp Fügt einem Timestamp zum Dateinamen hinzu (z. B. "log.2012-08-20 08-22-31.txt")
Der Timestamp kann über ein Datums-Pattern definiert werden (z. B. "timestamp: yyyy-MM-dd HH-mm-ss"). Das Datums-Pattern ist kompatibel mit SimpleDateFormat und ab tinylog 1.3 unter Java 9 auch mit DateTimeFormatter.

Policies

Über Policies, kann definiert werden, wann der RollingFileWriter eine neue Log-Datei beginnen soll. Es können beliebig viele Policies miteinander verknüpft werden.

Policy Name Beschreibung
CountPolicy count Beginnt eine neue Log-Datei, sobald die aktuelle Log-Datei die gewünschte Anzahl an Log-Einträgen erreicht hat (z. B. "count: 1000")
StartupPolicy startup Erzeugt bei jedem Start eine neue Log-Datei (z. B. "startup")
SizePolicy size Beginnt eine neue Log-Datei, sobald die aktuelle Log-Datei die gewünschte Größe erreicht hat (z. B. "size: 32KB")
HourlyPolicy hourly Beginnt zur jeden vollen Stunde eine neue Log-Datei (z. B. "hourly")
DailyPolicy daily Beginnt täglich eine neue Log-Datei (z. B. "daily: 03:00" oder einfach nur "daily" für täglich um Mitternacht)
WeeklyPolicy weekly Beginnt wöchentlich eine neue Log-Datei (z. B. "weekly: monday" für montagmorgens um 00:00 Uhr)
MonthlyPolicy monthly Beginnt monatlich eine neue Log-Datei (z. B. "monthly" für jeden 1. eines neuen Monats)
YearlyPolicy yearly Beginnt jährlich eine neue Log-Datei (z. B. "yearly" für jährlich am 01.01. oder "yearly: july" für den 01.07.)

SharedFileWriter

Der SharedFileWriter schreibt Log-Einträge in eine definierte Datei. Dabei können mehrere aktive Instanzen einer Anwendung gleichzeitig in dieselbe Log-Datei schreiben. Eine Alternative ist die Verwendung des RollingFileWriter mit dem ProcessIdLabeler, um für jede aktive Instanz der Anwendung eine eigene Log-Datei zu erstellen. Für Anwendungen, bei denen nie mehr als eine Instanz existiert, ist der FileWriter deutlich schneller.

Eine bereits existierende Log-Datei wird standardmäßig beim Start überschrieben, wenn diese noch nicht in Benutzung ist. Weitere Prozesse werden sich immer anschließen, ohne dass vorhandene Log-Einträge überschrieben werden. Seit tinylog 1.1 ist es durch das Aktivieren des Append-Moduses möglich, Log-Dateien immer fortzusetzen. Aufgrund von Limitierungen der JVM funktioniert das Deaktivieren des Append-Modus nur unter Windows. Falls tinylog ein anderes Betriebssystem erkennt, wird der Append-Modus automatisch aktiviert.

Properties Parameter Programmatisch

Definition:

tinylog.writer = <Name>
tinylog.writer.filename = <Dateiname>
tinylog.writer.append = <fortsetzen> (default: false)

Beispiel:

tinylog.writer = sharedfile
tinylog.writer.filename = log.txt
tinylog.writer.append = true

Definition:

-Dtinylog.writer=<Name>
-Dtinylog.writer.filename=<Dateiname>
-Dtinylog.writer.append=<fortsetzen> (default: false)

Beispiel:

-Dtinylog.writer=sharedfile
-Dtinylog.writer.filename=log.txt
-Dtinylog.writer.append=true

Methoden-Signatur:

Configurator.writer(Writer writer)

Beispiel:

Configurator.currentConfig() .writer(new SharedFileWriter("log.txt", true)) .activate();

Writing-Thread

Writers können in einem separaten Thread ausgeführt werden. Dies hat den Vorteil, dass die eigentliche Anwendung nicht durch langsame Schreib-Operationen blockiert wird. Standardmäßig läuft der Writing-Thread mit niedriger Priorität (2) und beendet sich automatisch mit dem Main-Thread.

In Standard-Java-Applikationen ist es üblich, den Writing-Thread an den Main-Thread oder einen anderen langlaufenden Thread zu koppeln. Der Writing-Thread beendet sich dann automatisch mit dem anderen Thread. In Java-EE-Applikationen existiert kein standardisierter langlaufender Thread. Bewährt hat sich in diesem Fall den Writing-Thread manuell über einen ServletContextListener herunterzufahren, anstatt an einen anderen Thread zu koppeln. Dazu kann der zu beobachtende Thread auf null gesetzt und die statische Methode Configurator.shutdownWritingThread() gerufen werden.

Properties Parameter Programmatisch

Definition:

tinylog.writingthread = <true oder false>
tinylog.writingthread.observe = <Thread> (default: main)
tinylog.writingthread.priority = <Priorität> (default: 2)

Beispiel:

tinylog.writingthread = true
tinylog.writingthread.observe = null
tinylog.writingthread.priority = 1

Definition:

-Dtinylog.writingthread=<true oder false>
-Dtinylog.writingthread.observe=<Thread> (default: main)
-Dtinylog.writingthread.priority=<Priorität> (default: 2)

Beispiel:

-Dtinylog.writingthread=true
-Dtinylog.writingthread.observe=null
-Dtinylog.writingthread.priority=1

Methoden-Signatur:

Configurator.writingThread(String threadToObserve, int priority)

Beispiel:

Configurator.currentConfig() .writingThread("main", 1) .activate();