2014-04-15 6 views
14

Standardmäßig verwendet der Logback Encoder einen date format ähnlich dem ISO 8601 Standard. Aber es fehlt das "T" in der Mitte zwischen Datum und Uhrzeit. Die T erleichtert das Parsen und wird vom Standard benötigt (sofern private Parteien nichts anderes vereinbaren).Machen Sie Logback das "T" zwischen Datum und Uhrzeit in seinem "% date" -Format für strenge ISO 8601-Konformität

Gibt es einen Trick zu erhalten Logback, um die T?

Diese ...

2006-10-20T14:06:49,812 

statt dessen ...

2006-10-20 14:06:49,812 

Ich glaube, ich könnte das gesamte Format neu erstellen, während ein „T“ und fügte hinzu, aber ich frage mich, ob es eine einfachere Möglichkeit ist .

Antwort

29

Bug Report

Es gibt einen Fehlerbericht dazu auf Logback's JIRA page. Es gab nicht viel Entwicklung seit 24/Feb/10 3:57 PM. Ich habe gerade gewählt, um Aufmerksamkeit zu erregen. Du solltest auch.

Ich würde mein eigenes Datumsformat zur Verfügung stellen, das ISO 8601 entspricht.

Insert "T"

Dies sollte den Trick:

<pattern>%d{"yyyy-MM-dd'T'HH:mm:ss,SSS"} [%thread] %-5level %logger{35} - %msg %n 
</pattern> 

Die "" nötig ist, um die , Arbeit zu machen, wie in den documentation beschrieben.

Das <pattern> Element gehört zu Ihrer Logback-Konfigurationseinstellung. Hier ist ein Beispiel logback.xml Datei:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 
     <layout class="ch.qos.logback.classic.PatternLayout"> 
      <!-- Strangely, Logback lacks a built-in formatter for ISO 8601. So, roll our own. --> 
      <Pattern>%date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC} [%thread] %-5level %logger{36} - %msg%n</Pattern> 
     </layout> 
    </appender> 

    <logger name="com.example" level="TRACE"/> 


    <root level="debug"> 
     <appender-ref ref="STDOUT" /> 
    </root> 
</configuration> 

Zeitzone

vollständige ISO 8601 konform und für weitere hilfreiche Protokollierung zu sein, sollten Sie eine Zeitzone enthalten.

BEARBEITEN (Michael-O, 2014-06-15): Das ist nicht wahr, Zeitzone ist absolut optional.

Um eine Zeitzone einzubeziehen, übergeben Sie ein zweites Argument (see doc) an die %date. Übergeben Sie die proper name of a time zone. Vermeiden Sie die drei- oder vierstelligen Zeitzonencodes wie "EST", da sie weder eindeutig noch standardisiert sind. Übergeben Sie beispielsweise Australia/Perth. Generell wollen wir für die Protokollierung UTC (GMT) Zeit, also ohne Offset. Übergeben Sie in diesem Fall UTC.

Sie können den Zeitzonen-Offset als Anzahl von Stunden und Minuten als Teil der Datums- und Uhrzeit im Protokoll anzeigen. Fügen Sie eine X an, um den Zeitzonenoffset als Teil des Datumszeitwerts anzuzeigen.Diese

...

%date{"yyyy-MM-dd'T'HH:mm:ss,SSSXXX", UTC} 

... produziert ...

2014-04-16T09:59:24,009Z 

Die XXX Werke in Java 7 und 8. In früheren Versionen von Java, können Sie in der Lage sein, eine Z in der Formatdefinition zu verwenden, um eine Offset-Nummer zu erzeugen, die keinen Doppelpunkt hat.

+0

@Basil Ich habe keine, lass mich es versuchen und zu dir zurück. –

+0

@basil Meinst du für das Datum oder die ganze Sache? –

+0

Vollständige Sache. Ich bin mir nicht sicher, ob die Escape-Sequenz für die hartcodierte Zeichenfolge "T" Logback glücklich macht. Alles ist hilfreich, da das Logback-Dokument uns Neulinge nicht sanft macht. –