Search code examples
pythonloggingjetty

javax.net.ssl logging timestamp format has strange hours value


I'm using Python to parse some logfiles produced via jetty.net.ssl on an external platform running a JVM to which I have no access.

For reasons I don't understand (and nor can I find documented anywhere) the log timestamps have the first hour of each day expressed as 24 rather than 00 e.g.

javax.net.ssl|DEBUG|15|Mux|2022-07-01 24:00:11.298 UTC|SSLSocketOutputRecord.java:334|WRITE: TLSv1.3 application_data, length = 31

which corresponds to 2022-07-01 00:00:11.298 rather than 2022-07-02 00:00:11.298

This format breaks things like Python's datetime.datetime() and dateutils.parser.parse(). I can code around this, stripping out the various elements of the timestamp string using a regex and altering the hour where necessary, along the lines of


        timere = re.compile(r"^(\d{4})-(\d{2})-(\d{2})\s+(\d{2}).(\d{2}).(\d{2})\.(\d{3}).*$")
        if not (match:=timere.match(tstr)):
            raise ValueError(f"Time string {tstr} is not valid")
        yy = int(match.groups()[0])
        mm = int(match.groups()[1])
        dd = int(match.groups()[2])
        hr = int(match.groups()[3]) % 24
        mi = int(match.groups()[4])
        se = int(match.groups()[5])
        us = int(match.groups()[6]) * 1000
        d = datetime.datetime(yy, mm, dd, hr, mi, se, us, tzinfo=datetime.timezone.utc)

I am, however, intrigued as to why the timestamps are in that format and is there some subtlety of which I am unaware? I'm kind of assuming that the developers used "24" as a valid hour deliberately for reasons I don't yet understand.


Solution

  • The OpenJDK sun.security.ssl.SSLLogger uses the following syntax to output the timestamp.

    private static final String PATTERN = "yyyy-MM-dd kk:mm:ss.SSS z";
    private static final DateTimeFormatter dateTimeFormat = 
        DateTimeFormatter.ofPattern(PATTERN, Locale.ENGLISH)
                         .withZone(ZoneId.systemDefault());
    

    This means the hour is represented by kk portion, which according to java.time.format.DateTimeFormatter is "clock-hour-of-day (1-24)"

    Not sure if python has the same date/time pattern it can use.