diff --git a/src/test/utils/OnosLog.py b/src/test/utils/OnosLog.py
index e876c67..6bdef9f 100644
--- a/src/test/utils/OnosLog.py
+++ b/src/test/utils/OnosLog.py
@@ -1,4 +1,5 @@
 import os
+import re
 from SSHTestAgent import SSHTestAgent
 
 class OnosLog(object):
@@ -28,19 +29,22 @@
     def update_last_snapshot(cls, host, res):
         cls.last_snapshot_map[host] = res
 
-    def get_log(self, search_terms = None):
+    def get_log(self, search_terms = None, exception = True):
         """Run the command on the test host"""
         cmd = 'cat /root/onos/apache-karaf-3.0.5/data/log/karaf.log'
         st, output = self.ssh_agent.run_cmd(cmd)
         if st is False:
             return output
+        exception_map = {'Exception' : [] }
         last_snapshot = self.get_last_snapshot(self.ssh_agent.host)
         lines = output.splitlines()
         if search_terms:
             if type(search_terms) is str:
                 terms = [ search_terms ]
             else:
-                terms = search_terms
+                terms = list(search_terms)
+            if exception is True and 'Exception' not in terms:
+                terms.append('Exception')
             match_lines = []
             last_len = len(last_snapshot)
             for i in xrange(0, len(lines)):
@@ -50,13 +54,23 @@
                 for t in terms:
                     if lines[i].find(t) >= 0:
                         match_lines.append(lines[i])
-
+                        if t == 'Exception':
+                            exception_map[t] = lines[i+1:i+1+10]
             output = '\n'.join(match_lines)
+            output += '\n'.join(exception_map['Exception'])
 
         #update the last snapshot
         self.update_last_snapshot(self.ssh_agent.host, lines)
         return st, output
 
+    def search_log_pattern(self, pattern):
+        r_pat = re.compile(pattern)
+        cmd = 'cat /root/onos/apache-karaf-3.0.5/data/log/karaf.log'
+        st, output = self.ssh_agent.run_cmd(cmd)
+        if st is False:
+            return None
+        return r_pat.findall(output)
+
 if __name__ == '__main__':
     onos = os.getenv('ONOS_CONTROLLER_IP', '172.17.0.2')
     onos_log = OnosLog(host = onos)
@@ -70,3 +84,8 @@
     st, output = onos_log.get_log(('ERROR', 'INFO'))
     print(st, output)
     onos_log.close()
+    pat = onos_log.search_log_pattern('ApplicationManager .* Started')
+    if pat:
+        print(pat)
+    else:
+        print('Onos did not start')
