diff --git a/tools/bionicbb/README.md b/tools/bionicbb/README.md
index 91f64d8..4d3291f 100644
--- a/tools/bionicbb/README.md
+++ b/tools/bionicbb/README.md
@@ -12,7 +12,6 @@
  * [Google API Client Library](https://developers.google.com/api-client-library/python/start/installation)
  * [jenkinsapi](https://pypi.python.org/pypi/jenkinsapi)
  * [Requests](http://docs.python-requests.org/en/latest/)
- * [termcolor](https://pypi.python.org/pypi/termcolor)
 
 Setup
 -----
diff --git a/tools/bionicbb/build_listener.py b/tools/bionicbb/build_listener.py
index f7f52ed..fa55d37 100644
--- a/tools/bionicbb/build_listener.py
+++ b/tools/bionicbb/build_listener.py
@@ -15,8 +15,8 @@
 # limitations under the License.
 #
 import json
+import logging
 import requests
-import termcolor
 
 import gerrit
 
@@ -43,7 +43,7 @@
     ref = params['REF']
     patch_set = ref.split('/')[-1]
 
-    print '{} #{} {}: {}'.format(name, number, status, full_url)
+    logging.debug('%s #%s %s: %s', name, number, status, full_url)
 
     # bionic-lint is always broken, so we don't want to reject changes for
     # those failures until we clean things up.
@@ -69,19 +69,19 @@
                                                                     patch_set))
 
         headers = {'Content-Type': 'application/json;charset=UTF-8'}
-        print 'POST {}: {}'.format(url, request_data)
-        print requests.post(url, headers=headers, json=request_data)
+        logging.debug('POST %s: %s', url, request_data)
+        requests.post(url, headers=headers, json=request_data)
     elif name == 'clean-bionic-presubmit':
         request_data = {'message': 'out/ directory removed'}
         url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id,
                                                                     patch_set))
         headers = {'Content-Type': 'application/json;charset=UTF-8'}
-        print 'POST {}: {}'.format(url, request_data)
-        print requests.post(url, headers=headers, json=request_data)
+        logging.debug('POST %s: %s', url, request_data)
+        requests.post(url, headers=headers, json=request_data)
     elif name == 'bionic-lint':
-        print 'IGNORED'
+        logging.warning('Result for bionic-lint ignored')
     else:
-        print '{}: {}'.format(termcolor.colored('red', 'UNKNOWN'), name)
+        logging.error('Unknown project: %s', name)
     return ''
 
 
@@ -100,17 +100,17 @@
         bb_review = 0
 
     if bb_review >= 0:
-        print 'No rejection to drop: {} {}'.format(change_id, patch_set)
+        logging.info('No rejection to drop: %s %s', change_id, patch_set)
         return ''
 
-    print 'Dropping rejection: {} {}'.format(change_id, patch_set)
+    logging.info('Dropping rejection: %s %s', change_id, patch_set)
 
     request_data = {'labels': {'Verified': 0}}
     url = gerrit_url('/a/changes/{}/revisions/{}/review'.format(change_id,
                                                                 patch_set))
     headers = {'Content-Type': 'application/json;charset=UTF-8'}
-    print 'POST {}: {}'.format(url, request_data)
-    print requests.post(url, headers=headers, json=request_data)
+    logging.debug('POST %s: %s', url, request_data)
+    requests.post(url, headers=headers, json=request_data)
     return ''
 
 
diff --git a/tools/bionicbb/gmail_listener.py b/tools/bionicbb/gmail_listener.py
index dd0c008..134258a 100644
--- a/tools/bionicbb/gmail_listener.py
+++ b/tools/bionicbb/gmail_listener.py
@@ -19,10 +19,10 @@
 import httplib2
 import jenkinsapi
 import json
+import logging
 import os
 import re
 import requests
-import termcolor
 import socket
 import sys
 import time
@@ -141,7 +141,7 @@
     return info
 
 
-def clean_project(gerrit_info, dry_run):
+def clean_project(dry_run):
     username = config.jenkins_credentials['username']
     password = config.jenkins_credentials['password']
     jenkins_url = config.jenkins_url
@@ -154,16 +154,9 @@
             url = job.get_build().baseurl
         else:
             url = 'DRY_RUN_URL'
-        print '{}({}): {} {}'.format(
-            termcolor.colored('CLEAN', 'green'),
-            gerrit_info['MessageType'],
-            build,
-            url)
+        logging.info('Cleaning: %s %s', build, url)
     else:
-        print '{}({}): {}'.format(
-            termcolor.colored('CLEAN', 'red'),
-            gerrit_info['MessageType'],
-            termcolor.colored(build, 'red'))
+        logging.error('Failed to clean: could not find project %s', build)
     return True
 
 
@@ -194,21 +187,9 @@
         if not project_path:
             raise RuntimeError('bogus project: {}'.format(project))
         if project_path.startswith('platform/'):
-            print '{}({}): {} => {}'.format(
-                termcolor.colored('ERROR', 'red'),
-                'project',
-                project,
-                project_path)
-            return False
-        try:
-            ref = gerrit.ref_for_change(change_id)
-        except gerrit.GerritError as ex:
-            print '{}({}): {} {}'.format(
-                termcolor.colored('GERRIT-ERROR', 'red'),
-                ex.code,
-                change_id,
-                ex.url)
-            return False
+            raise RuntimeError('Bad project mapping: {} => {}'.format(
+                project, project_path))
+        ref = gerrit.ref_for_change(change_id)
         params = {
             'REF': ref,
             'CHANGE_ID': change_id,
@@ -223,20 +204,10 @@
             url = 'URL UNAVAILABLE'
         else:
             url = 'DRY_RUN_URL'
-        print '{}({}): {} => {} {} {}'.format(
-            termcolor.colored('BUILD', 'green'),
-            gerrit_info['MessageType'],
-            project,
-            build,
-            url,
-            change_id)
+        logging.info('Building: %s => %s %s %s', project, build, url,
+                     change_id)
     else:
-        print '{}({}): {} => {} {}'.format(
-            termcolor.colored('BUILD', 'red'),
-            gerrit_info['MessageType'],
-            project,
-            termcolor.colored(build, 'red'),
-            change_id)
+        logging.error('Unknown build: %s => %s %s', project, build, change_id)
     return True
 
 
@@ -259,13 +230,9 @@
         try:
             requests.post(url, headers=headers, data=json.dumps(request_data))
         except requests.exceptions.ConnectionError as ex:
-            print '{}(drop-rejection): {}'.format(
-                termcolor.colored('ERROR', 'red'), ex)
+            logging.error('Failed to drop rejection: %s', ex)
             return False
-    print '{}({}): {}'.format(
-        termcolor.colored('CHECK', 'green'),
-        gerrit_info['MessageType'],
-        gerrit_info['Change-Id'])
+    logging.info('Dropped rejection: %s', gerrit_info['Change-Id'])
     return True
 
 
@@ -277,7 +244,7 @@
         return True
 
     command_map = {
-        'clean': lambda: clean_project(gerrit_info, dry_run),
+        'clean': lambda: clean_project(dry_run),
         'retry': lambda: build_project(gerrit_info, dry_run),
 
         'arm': lambda: build_project(gerrit_info, dry_run,
@@ -310,11 +277,11 @@
 
 
 def skip_handler(gerrit_info, _, __):
-    print '{}({}): {}'.format(
-        termcolor.colored('SKIP', 'yellow'),
-        gerrit_info['MessageType'],
-        gerrit_info['Change-Id'])
+    logging.info('Skipping %s: %s', gerrit_info['MessageType'],
+                 gerrit_info['Change-Id'])
     return True
+
+
 handle_abandon = skip_handler
 handle_merge_failed = skip_handler
 handle_merged = skip_handler
@@ -327,28 +294,22 @@
         body = get_body(msg)
         gerrit_info = get_gerrit_info(body)
         if not gerrit_info:
-            print termcolor.colored('No info found: {}'.format(msg['id']),
-                                    'red')
+            logging.fatal('No Gerrit info found: %s', msg.subject)
         msg_type = gerrit_info['MessageType']
         handler = 'handle_{}'.format(
             gerrit_info['MessageType'].replace('-', '_'))
         if handler in globals():
             return globals()[handler](gerrit_info, body, dry_run)
         else:
-            print termcolor.colored(
-                'MessageType {} unhandled.'.format(msg_type), 'red')
-        print
+            logging.warning('MessageType %s unhandled.', msg_type)
         return False
     except NotImplementedError as ex:
-        print ex
+        logging.error("%s", ex)
         return False
     except gerrit.GerritError as ex:
-        if ex.code == 404:
-            print '{}(404): {}!'.format(
-                termcolor.colored('ERROR', 'red'), ex)
-            return True
-        else:
-            return False
+        change_id = gerrit_info['Change-Id']
+        logging.error('Gerrit error (%d): %s %s', ex.code, change_id, ex.url)
+        return ex.code == 404
 
 
 def main(argc, argv):
@@ -376,10 +337,10 @@
                     msg_service.trash(userId='me', id=msg['id']).execute()
             time.sleep(60 * 5)
         except GmailError as ex:
-            print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex)
+            logging.error('Gmail error: %s', ex)
             time.sleep(60 * 5)
         except apiclient.errors.HttpError as ex:
-            print '{}: {}!'.format(termcolor.colored('ERROR', 'red'), ex)
+            logging.error('API Client HTTP error: %s', ex)
             time.sleep(60 * 5)
         except httplib.BadStatusLine:
             pass
