diff --git a/devices/statistics_writer/receiver.py b/devices/statistics_writer/receiver.py
index 919357764a2196cb7955e4ec77f2487b81d24d59..92d0d6d34bfc69f8f89f306c86b906c68956e47b 100644
--- a/devices/statistics_writer/receiver.py
+++ b/devices/statistics_writer/receiver.py
@@ -54,6 +54,15 @@ class tcp_receiver(receiver):
 
         super().__init__(fd=self.sock.fileno())
 
+    def reconnect(self):
+        self.fd = None
+        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
+        self.sock.connect((self.host, self.port))
+        self.fd = self.sock.fileno()
+        return True
+
+
+
 class file_receiver(receiver):
     def __init__(self, filename):
         self.filename = filename
diff --git a/devices/statistics_writer/statistics_writer.py b/devices/statistics_writer/statistics_writer.py
index 594e261c6d1e00e0ea7882c595449813c305c8ce..8bf8fa64fbba9626f60abec0bb6cacb7e7288c51 100644
--- a/devices/statistics_writer/statistics_writer.py
+++ b/devices/statistics_writer/statistics_writer.py
@@ -2,23 +2,28 @@ import argparse
 from receiver import tcp_receiver, file_receiver
 from hdf5_writer import hdf5_writer
 
+import time
+from datetime import datetime
+
 import sys
 import signal
 
 import logging
-logging.basicConfig(level=logging.INFO)
+logging.basicConfig(level=logging.INFO, format = '%(asctime)s:%(levelname)s: %(message)s')
 logger = logging.getLogger("statistics_writer")
 
+
 parser = argparse.ArgumentParser(description='Converts a stream of statistics packets into HDF5 files.')
-parser.add_argument('-a', '--host', type=str, help='the host to connect to')
-parser.add_argument('-p', '--port', type=int, default=0, help='the port to connect to, or 0 to use default port for the selected mode (default: %(default)s)')
-parser.add_argument('-f', '--file', type=str, help='the file to read from')
+parser.add_argument('-a', '--host', type=str, help='The host to connect to.')
+parser.add_argument('-p', '--port', type=int, default=0, help='The port to connect to, or 0 to use default port for the selected mode. (default: %(default)s)')
+parser.add_argument('-f', '--file', type=str, help='The file to read from. (will ignore --host and --port)')
 
-parser.add_argument('-m', '--mode', type=str, choices=['SST', 'XST', 'BST'], default='SST', help='sets the statistics type to be decoded options (default: %(default)s)')
-parser.add_argument('-i', '--interval', type=float, default=3600, nargs="?", help='The time between creating new files in seconds (default: %(default)s)')
-parser.add_argument('-o', '--output_dir', type=str, default=".", nargs="?", help='specifies the folder to write all the files (default: %(default)s)')
-parser.add_argument('-v', '--debug', dest='debug', action='store_true', default=False, help='increase log output')
-parser.add_argument('-d', '--decimation', type=int, default=1, help='Configure the writer to only store one every n samples. Saves storage space')
+parser.add_argument('-m', '--mode', type=str, choices=['SST', 'XST', 'BST'], default='SST', help='Sets the statistics type to be decoded options. (default: %(default)s)')
+parser.add_argument('-i', '--interval', type=float, default=3600, nargs="?", help='The time between creating new files in seconds. (default: %(default)s)')
+parser.add_argument('-o', '--output_dir', type=str, default=".", nargs="?", help='Specifies the folder to write all the files. (default: %(default)s)')
+parser.add_argument('-d', '--decimation', type=int, default=1, help='Configure the writer to only store one every n samples. Saves storage space.')
+parser.add_argument('-v', '--debug', dest='debug', action='store_true', default=False, help='Increase log output.')
+parser.add_argument('-r', '--reconnect', dest='reconnect', action='store_true', default=False, help='Set the writer to keep trying to reconnect whenever connection is lost. (default: %(default)s)')
 
 
 if __name__ == "__main__":
@@ -31,8 +36,9 @@ if __name__ == "__main__":
     output_dir = args.output_dir
     interval = args.interval
     mode = args.mode
-    debug = args.debug
     decimation = args.decimation
+    debug = args.debug
+    reconnect = args.reconnect
 
     if decimation < 1:
         raise ValueError("Please use an integer --Decimation value 1 or higher to only store one every n statistics' ")
@@ -60,13 +66,27 @@ if __name__ == "__main__":
     # start looping
     try:
         while True:
-            packet = receiver.get_packet()
-            writer.next_packet(packet)
+            try:
+                packet = receiver.get_packet()
+                writer.next_packet(packet)
+            except EOFError:
+                if reconnect and not filename:
+                    logger.warning("Connection lost, attempting to reconnect")
+                    while True:
+                        try:
+                            receiver.reconnect()
+                        except Exception as e:
+                            logger.warning(f"Could not reconnect: {e.__class__.__name__}: {e}")
+                            time.sleep(10)
+                        else:
+                            break
+                    logger.warning("Reconnected! Resuming operations")
+                else:
+                    logger.info("End of input.")
+                    raise SystemExit
+
     except KeyboardInterrupt:
         # user abort, don't complain
         logger.warning("Received keyboard interrupt. Stopping.")
-    except EOFError:
-        # done processing all input, don't complain
-        logger.info("End of input.")
     finally:
         writer.close_writer()
diff --git a/devices/statistics_writer/test/test_server.py b/devices/statistics_writer/test/test_server.py
index eec9ec3eed992b03ee809ca37de012bad43bd213..74101b93de2e83824c70e4630e8560ae24b28fa8 100644
--- a/devices/statistics_writer/test/test_server.py
+++ b/devices/statistics_writer/test/test_server.py
@@ -45,6 +45,9 @@ while True:
                     time.sleep(INTERVAL)
                     conn.sendall(data)
 
+    except KeyboardInterrupt:
+        logger.info("Received keyboard interrupt. Stopping.")
+        exit()
     except Exception as e:
         logger.warning(f"Exception occurred: {e}")