diff --git a/src/test/utils/CordLogger.py b/src/test/utils/CordLogger.py
index 081e33c..51c7dc8 100644
--- a/src/test/utils/CordLogger.py
+++ b/src/test/utils/CordLogger.py
@@ -12,6 +12,8 @@
     onosLogLevel = 'INFO'
     curLogLevel = onosLogLevel
     testLogLevel = os.getenv('LOG_LEVEL', onosLogLevel)
+    setup_dir = os.path.join( os.path.dirname(os.path.realpath(__file__)), '../setup')
+    archive_dir = os.path.join(setup_dir, 'test_logs')
 
     @classmethod
     def cliSessionEnter(cls):
@@ -61,6 +63,42 @@
             else:
                 log.info('\nTest %s has no errors and warnings in the logs' %self._testMethodName)
         except: pass
+        try:
+            self.archive_results(self._testMethodName)
+        except: pass
+
+    @classmethod
+    def archive_results(cls, testName, controllers = None, iteration = None, cache_result = False):
+        log_map = {}
+        if controllers is None:
+            controllers = cls.controllers
+        else:
+            if type(controllers) in [ str, unicode ]:
+                controllers = [ controllers ]
+        try:
+            for controller in controllers:
+                onosLog = OnosLog(host = controller)
+                st, output = onosLog.get_log(cache_result = cache_result)
+                log_map[controller] = (st, output)
+        except:
+            return
+
+        if not os.path.exists(cls.archive_dir):
+            os.mkdir(cls.archive_dir)
+        for controller, results in log_map.items():
+            st, output = results
+            if st and output:
+                iteration_str = '' if iteration is None else '_{}'.format(iteration)
+                archive_file = os.path.join(cls.archive_dir,
+                                            'logs_{}_{}{}'.format(controller, testName, iteration_str))
+                archive_cmd = 'gzip -9 -f {}'.format(archive_file)
+                if os.access(archive_file, os.F_OK):
+                    os.unlink(archive_file)
+                with open(archive_file, 'w') as fd:
+                    fd.write(output)
+                try:
+                    os.system(archive_cmd)
+                except: pass
 
     @classmethod
     def logSet(cls, level = None, app = 'org.onosproject', controllers = None, forced = False):
diff --git a/src/test/utils/OnosLog.py b/src/test/utils/OnosLog.py
index f5dcb77..a5e0fa7 100644
--- a/src/test/utils/OnosLog.py
+++ b/src/test/utils/OnosLog.py
@@ -25,7 +25,7 @@
     def update_last_snapshot(cls, host, res):
         cls.last_snapshot_map[host] = res
 
-    def get_log(self, search_terms = None, exception = True):
+    def get_log(self, search_terms = None, exception = True, cache_result = 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)
@@ -56,7 +56,8 @@
             output += '\n'.join(exception_map['Exception'])
 
         #update the last snapshot
-        self.update_last_snapshot(self.ssh_agent.host, lines)
+        if cache_result is True:
+            self.update_last_snapshot(self.ssh_agent.host, lines)
         return st, output
 
     def search_log_pattern(self, pattern):
