Index: /branches/ipp-259_genericise_backups/tools/backups/backup.py
===================================================================
--- /branches/ipp-259_genericise_backups/tools/backups/backup.py	(revision 40965)
+++ /branches/ipp-259_genericise_backups/tools/backups/backup.py	(revision 40966)
@@ -115,5 +115,5 @@
 
     def run_backup_processes(self):
-
+        self._write_begin_log()
         if self.should_run_copy:
             self._run_copy()
@@ -124,4 +124,5 @@
         if self.should_run_mysqldump:
             self._run_mysqldump()
+        self._write_end_log()
 
     def hostname_is_valid(self) -> bool:
@@ -260,4 +261,22 @@
         return 0
 
+    def _write_begin_log(self):
+        backup_paths = self.default_dict["backup_paths"]
+        for bp in backup_paths:
+            log_file = path.join(bp, "latest_run.log")
+            if path.exists(log_file):
+                os.remove(log_file)
+            with open(log_file, "w+") as lf:
+                lf.write(f'Run started at: {datetime.date.today().strftime("%Y_%b_%d_%H:%M")}\n')
+
+    def _write_end_log(self):
+        backup_paths = self.default_dict["backup_paths"]
+        for bp in backup_paths:
+            log_file = path.join(bp, "latest_run.log")
+            if not path.exists(log_file):
+                return
+            with open(log_file, "a") as lf:
+                lf.write(f'Last successful backup completed at : {datetime.date.today().strftime("%Y_%b_%d_%H:%M")}\n')
+
 
 def get_date(custom_date=None, custom_format="%Y_%m_%d"):
Index: /branches/ipp-259_genericise_backups/tools/backups/backup_test.py
===================================================================
--- /branches/ipp-259_genericise_backups/tools/backups/backup_test.py	(revision 40965)
+++ /branches/ipp-259_genericise_backups/tools/backups/backup_test.py	(revision 40966)
@@ -354,5 +354,5 @@
         config['TAR'] = \
         { 'sources' : f"{source}"
-        , 'additional_args' : "-C / -cf"
+        , 'additional_args' : "-cf"
         , 'target_filename' : 'cool_tar.tar'
         , 'prefix_date' : 'False'
@@ -366,4 +366,5 @@
 
         expected_tar1 = os.path.join(tmpdir, 'bck1', 'cool_tar.tar')
+        print(expected_tar1)
         assert not os.path.exists(expected_tar1)
         backy._run_tar()
@@ -382,5 +383,5 @@
         config['TAR'] = \
         { 'sources' : f"{source1}, {source2}"
-        , 'additional_args' : "-C / -cf"
+        , 'additional_args' : "-cf"
         , 'target_filename' : 'cool_tar.tar'
         , 'prefix_date' : 'True'
@@ -596,5 +597,4 @@
 
 
-
 @pytest.mark.skip(reason="Requires a fake database to be setup")
 class TestMysqlBackup(object):
@@ -656,2 +656,74 @@
         with pytest.raises(errs.SubprocessError):
             backy._run_mysqldump()
+
+
+# class TestRunningAll(object):
+
+#     def test_running_copy_tar_and_rsyc(self):
+        config = make_default_config(tmpdir, ['bck1', 'bck2'])
+
+
+class TestSimpleLogWriting(object):
+
+    def test_log_writing_success(self, tmpdir):
+        config = make_default_config(tmpdir, ['bck1', 'bck2'])
+        schema = ConfigSchema(None)
+        schema.add_section(bckup.DEFAULT_SCHEMA_SECTION)
+
+        backy = Backup(config, schema)
+
+        expected_log1 = os.path.join(tmpdir, 'bck1', 'latest_run.log')
+        expected_log2 = os.path.join(tmpdir, 'bck2', 'latest_run.log')
+        assert not os.path.exists(expected_log1)
+        assert not os.path.exists(expected_log2)
+        backy.run_backup_processes()
+        assert os.path.exists(expected_log1)
+        assert os.path.exists(expected_log2)
+
+        # Read file
+        with open(expected_log1, "r") as logf:
+            lines = logf.readlines()
+            assert len(lines) == 2
+            assert "Run started at: " in lines[0]
+            assert "Last successful backup completed at :" in lines[1]
+
+        with open(expected_log2, "r") as logf:
+            lines = logf.readlines()
+            assert len(lines) == 2
+            assert "Run started at: " in lines[0]
+            assert "Last successful backup completed at :" in lines[1]
+
+    def test_log_writes_only_attempted_if_failure_encountered(self, tmpdir):
+
+        config = make_default_config(tmpdir, ['bck1', 'bck2'])
+        source = os.path.join(tmpdir, "and_specific_file.jpeg")
+        config['COPY'] = \
+        { 'sources' : f"{source}"
+        , 'additional_args' : '-r'
+        }
+        schema = ConfigSchema(None)
+        schema.add_section(bckup.DEFAULT_SCHEMA_SECTION)
+        schema.add_section(bckup.COPY_SCHEMA_SECTION)
+
+        backy = Backup(config, schema)
+
+        expected_log1 = os.path.join(tmpdir, 'bck1', 'latest_run.log')
+        expected_log2 = os.path.join(tmpdir, 'bck2', 'latest_run.log')
+        assert not os.path.exists(expected_log1)
+        assert not os.path.exists(expected_log2)
+        # fails due to missing source file in copy
+        with pytest.raises(errs.ValidationError):
+            backy.run_backup_processes()
+
+        assert os.path.exists(expected_log1)
+        assert os.path.exists(expected_log2)
+
+        with open(expected_log1, "r") as logf:
+            lines = logf.readlines()
+            assert len(lines) == 1
+            assert "Run started at: " in lines[0]
+
+        with open(expected_log2, "r") as logf:
+            lines = logf.readlines()
+            assert len(lines) == 1
+            assert "Run started at: " in lines[0]
