1
1
Fork 0
mirror of https://github.com/pypa/pip synced 2023-12-13 21:30:23 +01:00

Add milliseconds to --log entry timestamps. (#6621)

Resolves #6587.
This commit is contained in:
Christopher Hunt 2019-06-17 17:50:41 -04:00 committed by Chris Jerdonek
parent 2e67cd17fb
commit 26cdedd618
4 changed files with 20 additions and 10 deletions

1
news/6587.feature Normal file
View file

@ -0,0 +1 @@
Update timestamps in pip's ``--log`` file to include milliseconds.

View file

@ -92,6 +92,7 @@ def get_indentation():
class IndentingFormatter(logging.Formatter): class IndentingFormatter(logging.Formatter):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
""" """
A logging.Formatter that obeys the indent_log() context manager. A logging.Formatter that obeys the indent_log() context manager.
@ -120,8 +121,8 @@ class IndentingFormatter(logging.Formatter):
def format(self, record): def format(self, record):
""" """
Calls the standard formatter, but will indent all of the log messages Calls the standard formatter, but will indent all of the log message
by our current indentation level. lines by our current indentation level.
""" """
formatted = super(IndentingFormatter, self).format(record) formatted = super(IndentingFormatter, self).format(record)
message_start = self.get_message_start(formatted, record.levelno) message_start = self.get_message_start(formatted, record.levelno)
@ -129,7 +130,9 @@ class IndentingFormatter(logging.Formatter):
prefix = '' prefix = ''
if self.add_timestamp: if self.add_timestamp:
prefix = self.formatTime(record, "%Y-%m-%dT%H:%M:%S ") # TODO: Use Formatter.default_time_format after dropping PY2.
t = self.formatTime(record, "%Y-%m-%dT%H:%M:%S")
prefix = '%s,%03d ' % (t, record.msecs)
prefix += " " * get_indentation() prefix += " " * get_indentation()
formatted = "".join([ formatted = "".join([
prefix + line prefix + line

View file

@ -81,7 +81,7 @@ class Test_base_command_logging(object):
def setup(self): def setup(self):
self.old_time = time.time self.old_time = time.time
time.time = lambda: 1547704837.4 time.time = lambda: 1547704837.040001
self.old_tz = os.environ.get('TZ') self.old_tz = os.environ.get('TZ')
os.environ['TZ'] = 'UTC' os.environ['TZ'] = 'UTC'
# time.tzset() is not implemented on some platforms (notably, Windows). # time.tzset() is not implemented on some platforms (notably, Windows).
@ -105,7 +105,7 @@ class Test_base_command_logging(object):
log_path = tmpdir.join('log') log_path = tmpdir.join('log')
cmd.main(['fake', '--log', log_path]) cmd.main(['fake', '--log', log_path])
with open(log_path) as f: with open(log_path) as f:
assert f.read().rstrip() == '2019-01-17T06:00:37 fake' assert f.read().rstrip() == '2019-01-17T06:00:37,040 fake'
def test_log_command_error(self, tmpdir): def test_log_command_error(self, tmpdir):
""" """
@ -115,7 +115,7 @@ class Test_base_command_logging(object):
log_path = tmpdir.join('log') log_path = tmpdir.join('log')
cmd.main(['fake', '--log', log_path]) cmd.main(['fake', '--log', log_path])
with open(log_path) as f: with open(log_path) as f:
assert f.read().startswith('2019-01-17T06:00:37 fake') assert f.read().startswith('2019-01-17T06:00:37,040 fake')
def test_log_file_command_error(self, tmpdir): def test_log_file_command_error(self, tmpdir):
""" """
@ -125,7 +125,7 @@ class Test_base_command_logging(object):
log_file_path = tmpdir.join('log_file') log_file_path = tmpdir.join('log_file')
cmd.main(['fake', '--log-file', log_file_path]) cmd.main(['fake', '--log-file', log_file_path])
with open(log_file_path) as f: with open(log_file_path) as f:
assert f.read().startswith('2019-01-17T06:00:37 fake') assert f.read().startswith('2019-01-17T06:00:37,040 fake')
def test_unicode_messages(self, tmpdir): def test_unicode_messages(self, tmpdir):
""" """

View file

@ -51,7 +51,10 @@ class TestIndentingFormatter(object):
def make_record(self, msg, level_name): def make_record(self, msg, level_name):
level_number = getattr(logging, level_name) level_number = getattr(logging, level_name)
attrs = dict( attrs = dict(
msg=msg, created=1547704837.4, levelname=level_name, msg=msg,
created=1547704837.040001,
msecs=40,
levelname=level_name,
levelno=level_number, levelno=level_number,
) )
record = logging.makeLogRecord(attrs) record = logging.makeLogRecord(attrs)
@ -75,9 +78,12 @@ class TestIndentingFormatter(object):
assert f.format(record) == expected assert f.format(record) == expected
@pytest.mark.parametrize('level_name, expected', [ @pytest.mark.parametrize('level_name, expected', [
('INFO', '2019-01-17T06:00:37 hello\n2019-01-17T06:00:37 world'), ('INFO',
'2019-01-17T06:00:37,040 hello\n'
'2019-01-17T06:00:37,040 world'),
('WARNING', ('WARNING',
'2019-01-17T06:00:37 WARNING: hello\n2019-01-17T06:00:37 world'), '2019-01-17T06:00:37,040 WARNING: hello\n'
'2019-01-17T06:00:37,040 world'),
]) ])
def test_format_with_timestamp(self, level_name, expected): def test_format_with_timestamp(self, level_name, expected):
record = self.make_record('hello\nworld', level_name=level_name) record = self.make_record('hello\nworld', level_name=level_name)