Skip to content

Commit 26cdedd

Browse files
chrahuntcjerdonek
authored andcommitted
Add milliseconds to --log entry timestamps. (#6621)
Resolves #6587.
1 parent 2e67cd1 commit 26cdedd

File tree

4 files changed

+20
-10
lines changed

4 files changed

+20
-10
lines changed

news/6587.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Update timestamps in pip's ``--log`` file to include milliseconds.

src/pip/_internal/utils/logging.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ def get_indentation():
9292

9393

9494
class IndentingFormatter(logging.Formatter):
95+
9596
def __init__(self, *args, **kwargs):
9697
"""
9798
A logging.Formatter that obeys the indent_log() context manager.
@@ -120,16 +121,18 @@ def get_message_start(self, formatted, levelno):
120121

121122
def format(self, record):
122123
"""
123-
Calls the standard formatter, but will indent all of the log messages
124-
by our current indentation level.
124+
Calls the standard formatter, but will indent all of the log message
125+
lines by our current indentation level.
125126
"""
126127
formatted = super(IndentingFormatter, self).format(record)
127128
message_start = self.get_message_start(formatted, record.levelno)
128129
formatted = message_start + formatted
129130

130131
prefix = ''
131132
if self.add_timestamp:
132-
prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ")
133+
# TODO: Use Formatter.default_time_format after dropping PY2.
134+
t = self.formatTime(record, "%Y-%m-%dT%H:%M:%S")
135+
prefix = '%s,%03d ' % (t, record.msecs)
133136
prefix += " " * get_indentation()
134137
formatted = "".join([
135138
prefix + line

tests/unit/test_base_command.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class Test_base_command_logging(object):
8181

8282
def setup(self):
8383
self.old_time = time.time
84-
time.time = lambda: 1547704837.4
84+
time.time = lambda: 1547704837.040001
8585
self.old_tz = os.environ.get('TZ')
8686
os.environ['TZ'] = 'UTC'
8787
# time.tzset() is not implemented on some platforms (notably, Windows).
@@ -105,7 +105,7 @@ def test_log_command_success(self, tmpdir):
105105
log_path = tmpdir.join('log')
106106
cmd.main(['fake', '--log', log_path])
107107
with open(log_path) as f:
108-
assert f.read().rstrip() == '2019-01-17T06:00:37 fake'
108+
assert f.read().rstrip() == '2019-01-17T06:00:37,040 fake'
109109

110110
def test_log_command_error(self, tmpdir):
111111
"""
@@ -115,7 +115,7 @@ def test_log_command_error(self, tmpdir):
115115
log_path = tmpdir.join('log')
116116
cmd.main(['fake', '--log', log_path])
117117
with open(log_path) as f:
118-
assert f.read().startswith('2019-01-17T06:00:37 fake')
118+
assert f.read().startswith('2019-01-17T06:00:37,040 fake')
119119

120120
def test_log_file_command_error(self, tmpdir):
121121
"""
@@ -125,7 +125,7 @@ def test_log_file_command_error(self, tmpdir):
125125
log_file_path = tmpdir.join('log_file')
126126
cmd.main(['fake', '--log-file', log_file_path])
127127
with open(log_file_path) as f:
128-
assert f.read().startswith('2019-01-17T06:00:37 fake')
128+
assert f.read().startswith('2019-01-17T06:00:37,040 fake')
129129

130130
def test_unicode_messages(self, tmpdir):
131131
"""

tests/unit/test_logging.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,10 @@ def teardown(self):
5151
def make_record(self, msg, level_name):
5252
level_number = getattr(logging, level_name)
5353
attrs = dict(
54-
msg=msg, created=1547704837.4, levelname=level_name,
54+
msg=msg,
55+
created=1547704837.040001,
56+
msecs=40,
57+
levelname=level_name,
5558
levelno=level_number,
5659
)
5760
record = logging.makeLogRecord(attrs)
@@ -75,9 +78,12 @@ def test_format(self, level_name, expected):
7578
assert f.format(record) == expected
7679

7780
@pytest.mark.parametrize('level_name, expected', [
78-
('INFO', '2019-01-17T06:00:37 hello\n2019-01-17T06:00:37 world'),
81+
('INFO',
82+
'2019-01-17T06:00:37,040 hello\n'
83+
'2019-01-17T06:00:37,040 world'),
7984
('WARNING',
80-
'2019-01-17T06:00:37 WARNING: hello\n2019-01-17T06:00:37 world'),
85+
'2019-01-17T06:00:37,040 WARNING: hello\n'
86+
'2019-01-17T06:00:37,040 world'),
8187
])
8288
def test_format_with_timestamp(self, level_name, expected):
8389
record = self.make_record('hello\nworld', level_name=level_name)

0 commit comments

Comments
 (0)