| Index: build/android/pylib/local/device/local_device_instrumentation_test_run.py
 | 
| diff --git a/build/android/pylib/local/device/local_device_instrumentation_test_run.py b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
 | 
| index a203ce069e5bc4760c2a84be3808e1aae3fb94f6..f522322d09e35acea2e2b7f73c8d830091cd848f 100644
 | 
| --- a/build/android/pylib/local/device/local_device_instrumentation_test_run.py
 | 
| +++ b/build/android/pylib/local/device/local_device_instrumentation_test_run.py
 | 
| @@ -12,13 +12,13 @@ from devil.android import device_errors
 | 
|  from devil.android import flag_changer
 | 
|  from devil.utils import reraiser_thread
 | 
|  from pylib import valgrind_tools
 | 
| +from pylib.android import logdog_logcat_monitor
 | 
|  from pylib.base import base_test_result
 | 
|  from pylib.instrumentation import instrumentation_test_instance
 | 
|  from pylib.local.device import local_device_environment
 | 
|  from pylib.local.device import local_device_test_run
 | 
|  import tombstones
 | 
|  
 | 
| -
 | 
|  _TAG = 'test_runner_py'
 | 
|  
 | 
|  TIMEOUT_ANNOTATIONS = [
 | 
| @@ -245,10 +245,19 @@ class LocalDeviceInstrumentationTestRun(
 | 
|        device.RunShellCommand(
 | 
|            ['log', '-p', 'i', '-t', _TAG, 'START %s' % test_name],
 | 
|            check_return=True)
 | 
| +      logcat_url = None
 | 
|        time_ms = lambda: int(time.time() * 1e3)
 | 
|        start_ms = time_ms()
 | 
| -      output = device.StartInstrumentation(
 | 
| -          target, raw=True, extras=extras, timeout=timeout, retries=0)
 | 
| +      if self._test_instance.should_save_logcat:
 | 
| +        with logdog_logcat_monitor.LogdogLogcatMonitor(
 | 
| +            device.adb,
 | 
| +            'logcat_%s' % test_name.replace('#', '.')) as logmon:
 | 
| +          output = device.StartInstrumentation(
 | 
| +              target, raw=True, extras=extras, timeout=timeout, retries=0)
 | 
| +        logcat_url = logmon.GetLogcatURL()
 | 
| +      else:
 | 
| +        output = device.StartInstrumentation(
 | 
| +            target, raw=True, extras=extras, timeout=timeout, retries=0)
 | 
|      finally:
 | 
|        device.RunShellCommand(
 | 
|            ['log', '-p', 'i', '-t', _TAG, 'END %s' % test_name],
 | 
| @@ -266,6 +275,8 @@ class LocalDeviceInstrumentationTestRun(
 | 
|          self._test_instance.ParseAmInstrumentRawOutput(output))
 | 
|      results = self._test_instance.GenerateTestResults(
 | 
|          result_code, result_bundle, statuses, start_ms, duration_ms)
 | 
| +    for result in results:
 | 
| +      result.SetLogcatUrl(logcat_url)
 | 
|  
 | 
|      # Update the result name if the test used flags.
 | 
|      if flags:
 | 
| 
 |