common: logging: backend: Wrap IOFile in a unique_ptr

Allows us to forward declare Common::FS::IOFile.
This commit is contained in:
Morph 2021-06-13 07:52:02 -04:00
parent 56afd4ab4b
commit 8150c65c07
2 changed files with 27 additions and 6 deletions

View file

@ -17,6 +17,7 @@
#endif #endif
#include "common/assert.h" #include "common/assert.h"
#include "common/fs/file.h"
#include "common/fs/fs.h" #include "common/fs/fs.h"
#include "common/logging/backend.h" #include "common/logging/backend.h"
#include "common/logging/log.h" #include "common/logging/log.h"
@ -140,10 +141,14 @@ private:
std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()}; std::chrono::steady_clock::time_point time_origin{std::chrono::steady_clock::now()};
}; };
ConsoleBackend::~ConsoleBackend() = default;
void ConsoleBackend::Write(const Entry& entry) { void ConsoleBackend::Write(const Entry& entry) {
PrintMessage(entry); PrintMessage(entry);
} }
ColorConsoleBackend::~ColorConsoleBackend() = default;
void ColorConsoleBackend::Write(const Entry& entry) { void ColorConsoleBackend::Write(const Entry& entry) {
PrintColoredMessage(entry); PrintColoredMessage(entry);
} }
@ -157,16 +162,19 @@ FileBackend::FileBackend(const std::filesystem::path& filename) {
void(FS::RemoveFile(old_filename)); void(FS::RemoveFile(old_filename));
void(FS::RenameFile(filename, 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) { void FileBackend::Write(const Entry& entry) {
// prevent logs from going over the maximum size (in case its spamming and the user doesn't // prevent logs from going over the maximum size (in case its spamming and the user doesn't
// know) // know)
constexpr std::size_t MAX_BYTES_WRITTEN = 100 * 1024 * 1024; constexpr std::size_t MAX_BYTES_WRITTEN = 100 * 1024 * 1024;
constexpr std::size_t MAX_BYTES_WRITTEN_EXTENDED = 1024 * 1024 * 1024; constexpr std::size_t MAX_BYTES_WRITTEN_EXTENDED = 1024 * 1024 * 1024;
if (!file.IsOpen()) { if (!file->IsOpen()) {
return; return;
} }
@ -176,12 +184,14 @@ void FileBackend::Write(const Entry& entry) {
return; 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) { if (entry.log_level >= Level::Error) {
void(file.Flush()); void(file->Flush());
} }
} }
DebuggerBackend::~DebuggerBackend() = default;
void DebuggerBackend::Write(const Entry& entry) { void DebuggerBackend::Write(const Entry& entry) {
#ifdef _WIN32 #ifdef _WIN32
::OutputDebugStringW(UTF8ToUTF16W(FormatLogMessage(entry).append(1, '\n')).c_str()); ::OutputDebugStringW(UTF8ToUTF16W(FormatLogMessage(entry).append(1, '\n')).c_str());

View file

@ -8,10 +8,13 @@
#include <memory> #include <memory>
#include <string> #include <string>
#include <string_view> #include <string_view>
#include "common/fs/file.h"
#include "common/logging/filter.h" #include "common/logging/filter.h"
#include "common/logging/log.h" #include "common/logging/log.h"
namespace Common::FS {
class IOFile;
}
namespace Common::Log { namespace Common::Log {
class Filter; class Filter;
@ -38,6 +41,7 @@ struct Entry {
class Backend { class Backend {
public: public:
virtual ~Backend() = default; virtual ~Backend() = default;
virtual void SetFilter(const Filter& new_filter) { virtual void SetFilter(const Filter& new_filter) {
filter = new_filter; filter = new_filter;
} }
@ -53,6 +57,8 @@ private:
*/ */
class ConsoleBackend : public Backend { class ConsoleBackend : public Backend {
public: public:
~ConsoleBackend() override;
static const char* Name() { static const char* Name() {
return "console"; return "console";
} }
@ -67,6 +73,8 @@ public:
*/ */
class ColorConsoleBackend : public Backend { class ColorConsoleBackend : public Backend {
public: public:
~ColorConsoleBackend() override;
static const char* Name() { static const char* Name() {
return "color_console"; return "color_console";
} }
@ -83,6 +91,7 @@ public:
class FileBackend : public Backend { class FileBackend : public Backend {
public: public:
explicit FileBackend(const std::filesystem::path& filename); explicit FileBackend(const std::filesystem::path& filename);
~FileBackend() override;
static const char* Name() { static const char* Name() {
return "file"; return "file";
@ -95,7 +104,7 @@ public:
void Write(const Entry& entry) override; void Write(const Entry& entry) override;
private: private:
FS::IOFile file; std::unique_ptr<FS::IOFile> file;
std::size_t bytes_written = 0; std::size_t bytes_written = 0;
}; };
@ -104,6 +113,8 @@ private:
*/ */
class DebuggerBackend : public Backend { class DebuggerBackend : public Backend {
public: public:
~DebuggerBackend() override;
static const char* Name() { static const char* Name() {
return "debugger"; return "debugger";
} }