Skip to content

Logging's msecs doesn't handle "100ms" well. #102402

Closed
@dougthor42

Description

@dougthor42

Bug report

LogRecord.msecs returns an incorrect value when timestamp (self.ct) value has exactly 100ms.

One liner check:

assert int((1677793338.100_000_0 - int(1677793338.100_000_0)) * 1000) + 0.0 == 100.0

The issue is binary representation of "0.1" / floating point error:

>>> # Definition of LogRecord.msecs:
>>> # https://github.com/python/cpython/blob/12011dd8bafa6867f2b4a8a9e8e54cb0fbf006e4/Lib/logging/__init__.py#L343
>>> # int((ct - int(ct)) * 1000) + 0.0
>>> ct = 1677793338.100_000_0
>>> ct
1677793338.1
>>> ct - int(ct)
0.09999990463256836
>>> _ * 1000
99.99990463256836
>>> int(_)
99
>>> _ + 0.0
99.0

Your environment

  • CPython versions tested on:
    • 3.10.9
    • 3.11.2
  • Operating system and architecture:
    • Custom company OS based on Debian Testing
    • 64-bit

Discussion

I think switching to time.time_ns when setting the creation time might be one solution.

Linked PRs

Metadata

Metadata

Assignees

No one assigned

    Labels

    stdlibPython modules in the Lib dirtype-bugAn unexpected behavior, bug, or error

    Projects

    Status

    Done

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions