RFR: 8072645: java.util.logging should use java.time to get more precise time stamps

Peter Levart peter.levart at gmail.com
Sat Feb 14 15:33:17 UTC 2015


Hi Daniel,

On 02/14/2015 01:38 PM, Daniel Fuchs wrote:
> Hi Peter,
>
> On 2/14/15 10:36 AM, Peter Levart wrote:
>> Hi Daniel,
>>
>> The "millis" property in your proposal just changes one part of 
>> LogRecord's notion of time (it doesn't change/reset the 
>> nanoAdjustment part). From compatibility standpoint, your ptoposal is 
>> changing the semantics of "millis" property. Previously "millis" was 
>> the sole property of record's notion of time, now it is only a 
>> component of it. Consider this legacy code:
>>
>> LogRecord r = new LogRecord(...); // timestamp1
>> ...
>> r.setMillis(System.currentTimeMillis()); // timestamp2
>>
>> What is the record's notion of time now? It is composed of "millis" 
>> from timestamp2 and "nanoAdjustment" from timestamp1. Not something 
>> that one would want, right?
>
> Excellent observation. I had missed that.
>> So what should be done instead is:
>> - deprecate "millis" writable property and document that it sets the 
>> record's time with the resolution of milliseconds and point to new 
>> "instantUTC" property as a replacement.
>> - add "instantUTC" writable property and document it as "the" method 
>> to be used to set record's time with full resolution
>> - optionally add read-only "nanoAdjustment" property (I don't think 
>> it is needed, since users should start using new time API instead of 
>> mangling with millis and nanos themselves)
>>
>> This lends itself to also change internal storage of LogRecord's 
>> time. You could just replace the "millis" field with a reference to 
>> "instantUTC". Serialization would have to be adjusted a bit (using 
>> serialPersistentFields) to stay compatible.
>>
>> What do you think?
>
> setMillis should definitely set the whole time for backward compatibility
> reasons. That will make it more than a simple setter, and therefore 
> deprecating
> it is probably the best thing to do as the method name could then become
> misleading (setTimeAsMillis() would be the expected name for such a
> behaviour).

Unfortunately. But there is javadoc to clear things out, so I don't find 
this too bad.

>
> That lets me think that there shouldn't be a setNanoAdjustment() either.

That's right. And I don't think we need a getter for nanoAdjustment 
either. See below...

> getMillis() and getNanoAdjustment() are OK and can stay, since they
> are consistent - are needed for compatibility reasons (at least 
> getMillis is),
> and will help with describing the serial form.
>
> As you noted, the only correct way to set the LogRecord time is to do 
> it in a
> single method:
> We could have either setInstant() or setTime(long millis, int nanos) - 
> setInstant
> being most probably the best alternative - since we already have a 
> getInstant(),
> and splitting the time into millis + nanos is a bit strange anyway - 
> since
> java.time favors seconds + nanos.

get/setInstant is the right name. As Stephen notes, Instant is timezone 
agnostic.


>
> For serialization - I think we will need to keep serializing a number 
> of milliseconds
> and a nano second adjustment. Whether the time stamp should be stored 
> internally
> as an Instant or as a number of milliseconds + a nano adjustment can 
> be discussed.
>
> I might favor the second as it would make serialization easier 
> (especially for
> documenting the serial form).
>
> Would you agree with that?

Well, internally I think it should be stored as an Instant. So you don't 
have to reconstruct Instant objects at each call to getInstant(). 
Serialization of LogRecord is not a frequent requirement, so the 
overhead should be moved to it, rather than to frequent code-paths. 
That's my opinion.

Documenting serializable format should be easy anyway. It doesn't have 
to be based directly on public getters/setters. For example:

The LogRecord's "instant" is serialized as two hypothetical fields to 
keep backwards compatibility:

long millis = getInstant().toEpochMilli();

int nanoOfMilli = getInstant().getNano() % 1000_000;


Regards, Peter


>
> best regards,
>
> -- daniel
>
>>
>> Regards, Peter
>>
>> On 02/13/2015 03:56 PM, Daniel Fuchs wrote:
>>> Hi,
>>>
>>> Please find below a patch for:
>>>
>>> 8072645: java.util.logging should use java.time to get more
>>>          precise time stamps
>>>
>>>
>>> http://cr.openjdk.java.net/~dfuchs/webrev_8072645/webrev.00/
>>>
>>> specdiff:
>>> http://cr.openjdk.java.net/~dfuchs/webrev_8072645/specdiff-logging-time/java/util/logging/package-summary.html 
>>>
>>>
>>> Overview:
>>> ---------
>>>
>>> The patch is made of the following pieces:
>>>
>>>  - LogRecord uses java.time.Clock's systemClock to get an
>>>    Instant in the best available resolution.
>>>
>>>    The instant is split into a number of milliseconds (a long)
>>>    and a nanosecond adjustment (an int).
>>>    The number of milliseconds is the same than what would have
>>>    been obtained by calling System.currentTimeMillis().
>>>
>>>  - LogRecord acquires a new serializable int nanoAdjustement field,
>>>    which can be used together with the number of milliseconds
>>>    to reconstruct the instant.
>>>
>>>  - SimpleFormatter is updated to pass a ZoneDateTime
>>>    instance to String.format, instead of a Date.
>>>
>>>    The effect of that is that the format string can now
>>>    be configure to print the full instant precision, if
>>>    needed.
>>>
>>>  - XMLformatter will add a new <nanos> element after the
>>>    <millis> element - if the value of the nanoAdjustment
>>>    field is not 0.
>>>
>>>    The <date> string will also contain the nano second
>>>    adjustment as well as the zone offset as formatted by
>>>    DateTimeFormatter.ISO_OFFSET_DATE_TIME
>>>
>>> Compatibility considerations:
>>> -----------------------------
>>>
>>> - The serial for of log record is backward/forward compatible.
>>>   I added a test to verify that.
>>>
>>> - XMLFormatter has acquired a new configurable property
>>>   '<FQCN>.printNanos' which allows to revert to the old
>>>   XML format, should the new format cause issues in
>>>   existing applications.
>>>
>>> - The logger.dtd will need to be updated, to support the
>>>   new optional <nanos> element. And for this matter,
>>>   should we update the logger.dtd or rather define a
>>>   logger-v2.dtd?
>>>   See planned modification:
>>>
>>> <http://cr.openjdk.java.net/~dfuchs/webrev_8072645/logger-dtd/logger.dtd.frames.html> 
>>>
>>>
>>> best regards,
>>>
>>> -- daniel
>>
>




More information about the core-libs-dev mailing list