benchmarking/utils/log_utils.py (65 lines of code) (raw):
#!/usr/bin/env python
##############################################################################
# Copyright 2019-present, Facebook, Inc.
# All rights reserved.
#
# This source code is licensed under the license found in the
# LICENSE file in the root directory of this source tree.
##############################################################################
from __future__ import absolute_import, division, print_function, unicode_literals
import sys
from utils.custom_logger import getLogger
LOG_LIMIT = 16 * (10 ** 6)
DEFAULT_INTERVAL = 10
MINIMUM_INTERVAL = 5
def valid_interval(arg) -> int:
try:
value = int(arg)
if value < MINIMUM_INTERVAL:
raise ValueError()
except ValueError:
getLogger().warning(
"Logging interval must be specified as an integer in seconds >= {}. Using default {}s.".format(
MINIMUM_INTERVAL, DEFAULT_INTERVAL
)
)
value = DEFAULT_INTERVAL
return value
def trimLog(output):
output_size = sys.getsizeof(output)
if output_size > LOG_LIMIT:
getLogger().warning(
f"Output size {output_size} is over the log limit of {LOG_LIMIT} and will be trimmed."
)
output = output[-LOG_LIMIT:]
return output
def collectLogData(job):
res = None
if job.get("framework") == "generic":
if "control" not in job["benchmarks"]["info"]:
res = _block_from_log(job["log"], "Program Output:", "=" * 80)
res = "\n".join(["=" * 80] + res) if res else None
else:
res = None
res1 = _block_from_log(job["log"], "Program Output:", "=" * 80)
res2 = _block_from_log(job["log"], "Program Output:", "=" * 80, False)
if res1 and res2:
res1[0] = "After the change, Program Output:"
res2[0] = "Before the change, Program Output:"
res = "\n".join(["=" * 80] + res2 + res1)
return res or job["log"] or "Logs unavailable."
def _block_from_log(log, s1, s2, forward=True):
start, end, first = None, None, True
temp = log.split("\n")
if forward:
for i, s in enumerate(temp):
if s1 == s:
start = i
if s2 == s:
if first:
first = False
else:
end = i
if start and end:
return temp[start : end + 1]
else:
for i, s in enumerate(temp[::-1]):
if s1 == s:
start = len(temp) - 1 - i
if s2 == s and not end:
end = len(temp) - 1 - i
if start and end:
return temp[start : end + 1]
return None