diff --git a/src/common/logging/backend.cpp b/src/common/logging/backend.cpp
index 6aa8ac960d..756b08dfe0 100644
--- a/src/common/logging/backend.cpp
+++ b/src/common/logging/backend.cpp
@@ -17,6 +17,7 @@
 #endif
 
 #include "common/assert.h"
+#include "common/fs/file.h"
 #include "common/fs/fs.h"
 #include "common/logging/backend.h"
 #include "common/logging/log.h"
@@ -140,10 +141,14 @@ private:
     std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()};
 };
 
+ConsoleBackend::~ConsoleBackend() = default;
+
 void ConsoleBackend::Write(const Entry& entry) {
     PrintMessage(entry);
 }
 
+ColorConsoleBackend::~ColorConsoleBackend() = default;
+
 void ColorConsoleBackend::Write(const Entry& entry) {
     PrintColoredMessage(entry);
 }
@@ -157,16 +162,19 @@ FileBackend::FileBackend(const std::filesystem::path& filename) {
     void(FS::RemoveFile(old_filename));
     void(FS::RenameFile(filename, old_filename));
 
-    file = FS::IOFile(filename, FS::FileAccessMode::Write, FS::FileType::TextFile);
+    file =
+        std::make_unique<FS::IOFile>(filename, FS::FileAccessMode::Write, FS::FileType::TextFile);
 }
 
+FileBackend::~FileBackend() = default;
+
 void FileBackend::Write(const Entry& entry) {
     // prevent logs from going over the maximum size (in case its spamming and the user doesn't
     // know)
     constexpr std::size_t MAX_BYTES_WRITTEN = 100 * 1024 * 1024;
     constexpr std::size_t MAX_BYTES_WRITTEN_EXTENDED = 1024 * 1024 * 1024;
 
-    if (!file.IsOpen()) {
+    if (!file->IsOpen()) {
         return;
     }
 
@@ -176,12 +184,14 @@ void FileBackend::Write(const Entry& entry) {
         return;
     }
 
-    bytes_written += file.WriteString(FormatLogMessage(entry).append(1, '\n'));
+    bytes_written += file->WriteString(FormatLogMessage(entry).append(1, '\n'));
     if (entry.log_level >= Level::Error) {
-        void(file.Flush());
+        void(file->Flush());
     }
 }
 
+DebuggerBackend::~DebuggerBackend() = default;
+
 void DebuggerBackend::Write(const Entry& entry) {
 #ifdef _WIN32
     ::OutputDebugStringW(UTF8ToUTF16W(FormatLogMessage(entry).append(1, '\n')).c_str());
diff --git a/src/common/logging/backend.h b/src/common/logging/backend.h
index eb629a33f6..826bde6945 100644
--- a/src/common/logging/backend.h
+++ b/src/common/logging/backend.h
@@ -8,10 +8,13 @@
 #include <memory>
 #include <string>
 #include <string_view>
-#include "common/fs/file.h"
 #include "common/logging/filter.h"
 #include "common/logging/log.h"
 
+namespace Common::FS {
+class IOFile;
+}
+
 namespace Common::Log {
 
 class Filter;
@@ -38,6 +41,7 @@ struct Entry {
 class Backend {
 public:
     virtual ~Backend() = default;
+
     virtual void SetFilter(const Filter& new_filter) {
         filter = new_filter;
     }
@@ -53,6 +57,8 @@ private:
  */
 class ConsoleBackend : public Backend {
 public:
+    ~ConsoleBackend() override;
+
     static const char* Name() {
         return "console";
     }
@@ -67,6 +73,8 @@ public:
  */
 class ColorConsoleBackend : public Backend {
 public:
+    ~ColorConsoleBackend() override;
+
     static const char* Name() {
         return "color_console";
     }
@@ -83,6 +91,7 @@ public:
 class FileBackend : public Backend {
 public:
     explicit FileBackend(const std::filesystem::path& filename);
+    ~FileBackend() override;
 
     static const char* Name() {
         return "file";
@@ -95,7 +104,7 @@ public:
     void Write(const Entry& entry) override;
 
 private:
-    FS::IOFile file;
+    std::unique_ptr<FS::IOFile> file;
     std::size_t bytes_written = 0;
 };
 
@@ -104,6 +113,8 @@ private:
  */
 class DebuggerBackend : public Backend {
 public:
+    ~DebuggerBackend() override;
+
     static const char* Name() {
         return "debugger";
     }