diff options
Diffstat (limited to 'catapult/devil/devil/android/logcat_monitor.py')
-rw-r--r-- | catapult/devil/devil/android/logcat_monitor.py | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/catapult/devil/devil/android/logcat_monitor.py b/catapult/devil/devil/android/logcat_monitor.py index 0aece87d..249320b7 100644 --- a/catapult/devil/devil/android/logcat_monitor.py +++ b/catapult/devil/devil/android/logcat_monitor.py @@ -23,14 +23,15 @@ logger = logging.getLogger(__name__) class LogcatMonitor(object): - _RECORD_ITER_TIMEOUT = 2.0 + _RECORD_ITER_TIMEOUT = 0.2 _RECORD_THREAD_JOIN_WAIT = 5.0 _WAIT_TIME = 0.2 - _THREADTIME_RE_FORMAT = ( + THREADTIME_RE_FORMAT = ( r'(?P<date>\S*) +(?P<time>\S*) +(?P<proc_id>%s) +(?P<thread_id>%s) +' r'(?P<log_level>%s) +(?P<component>%s) *: +(?P<message>%s)$') - def __init__(self, adb, clear=True, filter_specs=None, output_file=None): + def __init__(self, adb, clear=True, filter_specs=None, output_file=None, + transform_func=None): """Create a LogcatMonitor instance. Args: @@ -38,6 +39,8 @@ class LogcatMonitor(object): clear: If True, clear the logcat when monitoring starts. filter_specs: An optional list of '<tag>[:priority]' strings. output_file: File path to save recorded logcat. + transform_func: An optional unary callable that takes and returns + a list of lines, possibly transforming them in the process. """ if isinstance(adb, adb_wrapper.AdbWrapper): self._adb = adb @@ -50,6 +53,7 @@ class LogcatMonitor(object): self._record_file_lock = threading.Lock() self._record_thread = None self._stop_recording_event = threading.Event() + self._transform_func = transform_func @property def output_file(self): @@ -146,7 +150,7 @@ class LogcatMonitor(object): component = r'[^\s:]+' # pylint: disable=protected-access threadtime_re = re.compile( - type(self)._THREADTIME_RE_FORMAT % ( + type(self).THREADTIME_RE_FORMAT % ( proc_id, thread_id, log_level, component, message_regex)) with open(self._record_file.name, 'r') as f: @@ -176,6 +180,8 @@ class LogcatMonitor(object): with self._record_file_lock: if self._record_file and not self._record_file.closed: + if self._transform_func: + data = '\n'.join(self._transform_func([data])) self._record_file.write(data + '\n') self._stop_recording_event.clear() @@ -228,6 +234,13 @@ class LogcatMonitor(object): self._record_file.close() self._record_file = None + def close(self): + """An alias for Close. + + Allows LogcatMonitors to be used with contextlib.closing. + """ + self.Close() + def __enter__(self): """Starts the logcat monitor.""" self.Start() |