mirror of
https://git.suyu.dev/suyu/suyu.git
synced 2024-11-15 22:54:00 +00:00
Merge pull request #6463 from Morph1984/restructure-logging
common: logging: Restructure logging backend
This commit is contained in:
commit
de12dbb01a
11 changed files with 315 additions and 287 deletions
|
@ -141,6 +141,7 @@ add_library(common STATIC
|
||||||
logging/log.h
|
logging/log.h
|
||||||
logging/text_formatter.cpp
|
logging/text_formatter.cpp
|
||||||
logging/text_formatter.h
|
logging/text_formatter.h
|
||||||
|
logging/types.h
|
||||||
lz4_compression.cpp
|
lz4_compression.cpp
|
||||||
lz4_compression.h
|
lz4_compression.h
|
||||||
math_util.h
|
math_util.h
|
||||||
|
|
|
@ -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,147 +184,20 @@ 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());
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Macro listing all log classes. Code should define CLS and SUB as desired before invoking this.
|
|
||||||
#define ALL_LOG_CLASSES() \
|
|
||||||
CLS(Log) \
|
|
||||||
CLS(Common) \
|
|
||||||
SUB(Common, Filesystem) \
|
|
||||||
SUB(Common, Memory) \
|
|
||||||
CLS(Core) \
|
|
||||||
SUB(Core, ARM) \
|
|
||||||
SUB(Core, Timing) \
|
|
||||||
CLS(Config) \
|
|
||||||
CLS(Debug) \
|
|
||||||
SUB(Debug, Emulated) \
|
|
||||||
SUB(Debug, GPU) \
|
|
||||||
SUB(Debug, Breakpoint) \
|
|
||||||
SUB(Debug, GDBStub) \
|
|
||||||
CLS(Kernel) \
|
|
||||||
SUB(Kernel, SVC) \
|
|
||||||
CLS(Service) \
|
|
||||||
SUB(Service, ACC) \
|
|
||||||
SUB(Service, Audio) \
|
|
||||||
SUB(Service, AM) \
|
|
||||||
SUB(Service, AOC) \
|
|
||||||
SUB(Service, APM) \
|
|
||||||
SUB(Service, ARP) \
|
|
||||||
SUB(Service, BCAT) \
|
|
||||||
SUB(Service, BPC) \
|
|
||||||
SUB(Service, BGTC) \
|
|
||||||
SUB(Service, BTDRV) \
|
|
||||||
SUB(Service, BTM) \
|
|
||||||
SUB(Service, Capture) \
|
|
||||||
SUB(Service, ERPT) \
|
|
||||||
SUB(Service, ETicket) \
|
|
||||||
SUB(Service, EUPLD) \
|
|
||||||
SUB(Service, Fatal) \
|
|
||||||
SUB(Service, FGM) \
|
|
||||||
SUB(Service, Friend) \
|
|
||||||
SUB(Service, FS) \
|
|
||||||
SUB(Service, GRC) \
|
|
||||||
SUB(Service, HID) \
|
|
||||||
SUB(Service, IRS) \
|
|
||||||
SUB(Service, LBL) \
|
|
||||||
SUB(Service, LDN) \
|
|
||||||
SUB(Service, LDR) \
|
|
||||||
SUB(Service, LM) \
|
|
||||||
SUB(Service, Migration) \
|
|
||||||
SUB(Service, Mii) \
|
|
||||||
SUB(Service, MM) \
|
|
||||||
SUB(Service, NCM) \
|
|
||||||
SUB(Service, NFC) \
|
|
||||||
SUB(Service, NFP) \
|
|
||||||
SUB(Service, NIFM) \
|
|
||||||
SUB(Service, NIM) \
|
|
||||||
SUB(Service, NPNS) \
|
|
||||||
SUB(Service, NS) \
|
|
||||||
SUB(Service, NVDRV) \
|
|
||||||
SUB(Service, OLSC) \
|
|
||||||
SUB(Service, PCIE) \
|
|
||||||
SUB(Service, PCTL) \
|
|
||||||
SUB(Service, PCV) \
|
|
||||||
SUB(Service, PM) \
|
|
||||||
SUB(Service, PREPO) \
|
|
||||||
SUB(Service, PSC) \
|
|
||||||
SUB(Service, PSM) \
|
|
||||||
SUB(Service, SET) \
|
|
||||||
SUB(Service, SM) \
|
|
||||||
SUB(Service, SPL) \
|
|
||||||
SUB(Service, SSL) \
|
|
||||||
SUB(Service, TCAP) \
|
|
||||||
SUB(Service, Time) \
|
|
||||||
SUB(Service, USB) \
|
|
||||||
SUB(Service, VI) \
|
|
||||||
SUB(Service, WLAN) \
|
|
||||||
CLS(HW) \
|
|
||||||
SUB(HW, Memory) \
|
|
||||||
SUB(HW, LCD) \
|
|
||||||
SUB(HW, GPU) \
|
|
||||||
SUB(HW, AES) \
|
|
||||||
CLS(IPC) \
|
|
||||||
CLS(Frontend) \
|
|
||||||
CLS(Render) \
|
|
||||||
SUB(Render, Software) \
|
|
||||||
SUB(Render, OpenGL) \
|
|
||||||
SUB(Render, Vulkan) \
|
|
||||||
CLS(Audio) \
|
|
||||||
SUB(Audio, DSP) \
|
|
||||||
SUB(Audio, Sink) \
|
|
||||||
CLS(Input) \
|
|
||||||
CLS(Network) \
|
|
||||||
CLS(Loader) \
|
|
||||||
CLS(CheatEngine) \
|
|
||||||
CLS(Crypto) \
|
|
||||||
CLS(WebService)
|
|
||||||
|
|
||||||
// GetClassName is a macro defined by Windows.h, grrr...
|
|
||||||
const char* GetLogClassName(Class log_class) {
|
|
||||||
switch (log_class) {
|
|
||||||
#define CLS(x) \
|
|
||||||
case Class::x: \
|
|
||||||
return #x;
|
|
||||||
#define SUB(x, y) \
|
|
||||||
case Class::x##_##y: \
|
|
||||||
return #x "." #y;
|
|
||||||
ALL_LOG_CLASSES()
|
|
||||||
#undef CLS
|
|
||||||
#undef SUB
|
|
||||||
case Class::Count:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
return "Invalid";
|
|
||||||
}
|
|
||||||
|
|
||||||
const char* GetLevelName(Level log_level) {
|
|
||||||
#define LVL(x) \
|
|
||||||
case Level::x: \
|
|
||||||
return #x
|
|
||||||
switch (log_level) {
|
|
||||||
LVL(Trace);
|
|
||||||
LVL(Debug);
|
|
||||||
LVL(Info);
|
|
||||||
LVL(Warning);
|
|
||||||
LVL(Error);
|
|
||||||
LVL(Critical);
|
|
||||||
case Level::Count:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
#undef LVL
|
|
||||||
return "Invalid";
|
|
||||||
}
|
|
||||||
|
|
||||||
void SetGlobalFilter(const Filter& filter) {
|
void SetGlobalFilter(const Filter& filter) {
|
||||||
Impl::Instance().SetGlobalFilter(filter);
|
Impl::Instance().SetGlobalFilter(filter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,36 +1,24 @@
|
||||||
// Copyright 2014 Citra Emulator Project
|
// Copyright 2014 Citra Emulator Project
|
||||||
// Licensed under GPLv2 or any later version
|
// Licensed under GPLv2 or any later version
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <chrono>
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#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;
|
||||||
|
|
||||||
/**
|
|
||||||
* A log entry. Log entries are store in a structured format to permit more varied output
|
|
||||||
* formatting on different frontends, as well as facilitating filtering and aggregation.
|
|
||||||
*/
|
|
||||||
struct Entry {
|
|
||||||
std::chrono::microseconds timestamp;
|
|
||||||
Class log_class{};
|
|
||||||
Level log_level{};
|
|
||||||
const char* filename = nullptr;
|
|
||||||
unsigned int line_num = 0;
|
|
||||||
std::string function;
|
|
||||||
std::string message;
|
|
||||||
bool final_entry = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for logging backends. As loggers can be created and removed at runtime, this can be
|
* Interface for logging backends. As loggers can be created and removed at runtime, this can be
|
||||||
* used by a frontend for adding a custom logging backend as needed
|
* used by a frontend for adding a custom logging backend as needed
|
||||||
|
@ -38,6 +26,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 +42,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 +58,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 +76,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 +89,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 +98,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";
|
||||||
}
|
}
|
||||||
|
@ -119,17 +115,6 @@ void RemoveBackend(std::string_view backend_name);
|
||||||
|
|
||||||
Backend* GetBackend(std::string_view backend_name);
|
Backend* GetBackend(std::string_view backend_name);
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the name of the passed log class as a C-string. Subclasses are separated by periods
|
|
||||||
* instead of underscores as in the enumeration.
|
|
||||||
*/
|
|
||||||
const char* GetLogClassName(Class log_class);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the name of the passed log level as a C-string.
|
|
||||||
*/
|
|
||||||
const char* GetLevelName(Level log_level);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The global filter will prevent any messages from even being processed if they are filtered. Each
|
* The global filter will prevent any messages from even being processed if they are filtered. Each
|
||||||
* backend can have a filter, but if the level is lower than the global filter, the backend will
|
* backend can have a filter, but if the level is lower than the global filter, the backend will
|
||||||
|
|
|
@ -3,7 +3,6 @@
|
||||||
// Refer to the license.txt file included.
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include "common/logging/backend.h"
|
|
||||||
#include "common/logging/filter.h"
|
#include "common/logging/filter.h"
|
||||||
#include "common/string_util.h"
|
#include "common/string_util.h"
|
||||||
|
|
||||||
|
@ -22,7 +21,7 @@ Level GetLevelByName(const It begin, const It end) {
|
||||||
|
|
||||||
template <typename It>
|
template <typename It>
|
||||||
Class GetClassByName(const It begin, const It end) {
|
Class GetClassByName(const It begin, const It end) {
|
||||||
for (ClassType i = 0; i < static_cast<ClassType>(Class::Count); ++i) {
|
for (u8 i = 0; i < static_cast<u8>(Class::Count); ++i) {
|
||||||
const char* level_name = GetLogClassName(static_cast<Class>(i));
|
const char* level_name = GetLogClassName(static_cast<Class>(i));
|
||||||
if (Common::ComparePartialString(begin, end, level_name)) {
|
if (Common::ComparePartialString(begin, end, level_name)) {
|
||||||
return static_cast<Class>(i);
|
return static_cast<Class>(i);
|
||||||
|
@ -62,6 +61,135 @@ bool ParseFilterRule(Filter& instance, Iterator begin, Iterator end) {
|
||||||
}
|
}
|
||||||
} // Anonymous namespace
|
} // Anonymous namespace
|
||||||
|
|
||||||
|
/// Macro listing all log classes. Code should define CLS and SUB as desired before invoking this.
|
||||||
|
#define ALL_LOG_CLASSES() \
|
||||||
|
CLS(Log) \
|
||||||
|
CLS(Common) \
|
||||||
|
SUB(Common, Filesystem) \
|
||||||
|
SUB(Common, Memory) \
|
||||||
|
CLS(Core) \
|
||||||
|
SUB(Core, ARM) \
|
||||||
|
SUB(Core, Timing) \
|
||||||
|
CLS(Config) \
|
||||||
|
CLS(Debug) \
|
||||||
|
SUB(Debug, Emulated) \
|
||||||
|
SUB(Debug, GPU) \
|
||||||
|
SUB(Debug, Breakpoint) \
|
||||||
|
SUB(Debug, GDBStub) \
|
||||||
|
CLS(Kernel) \
|
||||||
|
SUB(Kernel, SVC) \
|
||||||
|
CLS(Service) \
|
||||||
|
SUB(Service, ACC) \
|
||||||
|
SUB(Service, Audio) \
|
||||||
|
SUB(Service, AM) \
|
||||||
|
SUB(Service, AOC) \
|
||||||
|
SUB(Service, APM) \
|
||||||
|
SUB(Service, ARP) \
|
||||||
|
SUB(Service, BCAT) \
|
||||||
|
SUB(Service, BPC) \
|
||||||
|
SUB(Service, BGTC) \
|
||||||
|
SUB(Service, BTDRV) \
|
||||||
|
SUB(Service, BTM) \
|
||||||
|
SUB(Service, Capture) \
|
||||||
|
SUB(Service, ERPT) \
|
||||||
|
SUB(Service, ETicket) \
|
||||||
|
SUB(Service, EUPLD) \
|
||||||
|
SUB(Service, Fatal) \
|
||||||
|
SUB(Service, FGM) \
|
||||||
|
SUB(Service, Friend) \
|
||||||
|
SUB(Service, FS) \
|
||||||
|
SUB(Service, GRC) \
|
||||||
|
SUB(Service, HID) \
|
||||||
|
SUB(Service, IRS) \
|
||||||
|
SUB(Service, LBL) \
|
||||||
|
SUB(Service, LDN) \
|
||||||
|
SUB(Service, LDR) \
|
||||||
|
SUB(Service, LM) \
|
||||||
|
SUB(Service, Migration) \
|
||||||
|
SUB(Service, Mii) \
|
||||||
|
SUB(Service, MM) \
|
||||||
|
SUB(Service, NCM) \
|
||||||
|
SUB(Service, NFC) \
|
||||||
|
SUB(Service, NFP) \
|
||||||
|
SUB(Service, NIFM) \
|
||||||
|
SUB(Service, NIM) \
|
||||||
|
SUB(Service, NPNS) \
|
||||||
|
SUB(Service, NS) \
|
||||||
|
SUB(Service, NVDRV) \
|
||||||
|
SUB(Service, OLSC) \
|
||||||
|
SUB(Service, PCIE) \
|
||||||
|
SUB(Service, PCTL) \
|
||||||
|
SUB(Service, PCV) \
|
||||||
|
SUB(Service, PM) \
|
||||||
|
SUB(Service, PREPO) \
|
||||||
|
SUB(Service, PSC) \
|
||||||
|
SUB(Service, PSM) \
|
||||||
|
SUB(Service, SET) \
|
||||||
|
SUB(Service, SM) \
|
||||||
|
SUB(Service, SPL) \
|
||||||
|
SUB(Service, SSL) \
|
||||||
|
SUB(Service, TCAP) \
|
||||||
|
SUB(Service, Time) \
|
||||||
|
SUB(Service, USB) \
|
||||||
|
SUB(Service, VI) \
|
||||||
|
SUB(Service, WLAN) \
|
||||||
|
CLS(HW) \
|
||||||
|
SUB(HW, Memory) \
|
||||||
|
SUB(HW, LCD) \
|
||||||
|
SUB(HW, GPU) \
|
||||||
|
SUB(HW, AES) \
|
||||||
|
CLS(IPC) \
|
||||||
|
CLS(Frontend) \
|
||||||
|
CLS(Render) \
|
||||||
|
SUB(Render, Software) \
|
||||||
|
SUB(Render, OpenGL) \
|
||||||
|
SUB(Render, Vulkan) \
|
||||||
|
CLS(Audio) \
|
||||||
|
SUB(Audio, DSP) \
|
||||||
|
SUB(Audio, Sink) \
|
||||||
|
CLS(Input) \
|
||||||
|
CLS(Network) \
|
||||||
|
CLS(Loader) \
|
||||||
|
CLS(CheatEngine) \
|
||||||
|
CLS(Crypto) \
|
||||||
|
CLS(WebService)
|
||||||
|
|
||||||
|
// GetClassName is a macro defined by Windows.h, grrr...
|
||||||
|
const char* GetLogClassName(Class log_class) {
|
||||||
|
switch (log_class) {
|
||||||
|
#define CLS(x) \
|
||||||
|
case Class::x: \
|
||||||
|
return #x;
|
||||||
|
#define SUB(x, y) \
|
||||||
|
case Class::x##_##y: \
|
||||||
|
return #x "." #y;
|
||||||
|
ALL_LOG_CLASSES()
|
||||||
|
#undef CLS
|
||||||
|
#undef SUB
|
||||||
|
case Class::Count:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return "Invalid";
|
||||||
|
}
|
||||||
|
|
||||||
|
const char* GetLevelName(Level log_level) {
|
||||||
|
#define LVL(x) \
|
||||||
|
case Level::x: \
|
||||||
|
return #x
|
||||||
|
switch (log_level) {
|
||||||
|
LVL(Trace);
|
||||||
|
LVL(Debug);
|
||||||
|
LVL(Info);
|
||||||
|
LVL(Warning);
|
||||||
|
LVL(Error);
|
||||||
|
LVL(Critical);
|
||||||
|
case Level::Count:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
#undef LVL
|
||||||
|
return "Invalid";
|
||||||
|
}
|
||||||
|
|
||||||
Filter::Filter(Level default_level) {
|
Filter::Filter(Level default_level) {
|
||||||
ResetAll(default_level);
|
ResetAll(default_level);
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,12 +5,24 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <chrono>
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <string_view>
|
#include <string_view>
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
|
|
||||||
namespace Common::Log {
|
namespace Common::Log {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the name of the passed log class as a C-string. Subclasses are separated by periods
|
||||||
|
* instead of underscores as in the enumeration.
|
||||||
|
*/
|
||||||
|
const char* GetLogClassName(Class log_class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the name of the passed log level as a C-string.
|
||||||
|
*/
|
||||||
|
const char* GetLevelName(Level log_level);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Implements a log message filter which allows different log classes to have different minimum
|
* Implements a log message filter which allows different log classes to have different minimum
|
||||||
* severity levels. The filter can be changed at runtime and can be parsed from a string to allow
|
* severity levels. The filter can be changed at runtime and can be parsed from a string to allow
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <fmt/format.h>
|
#include <fmt/format.h>
|
||||||
#include "common/common_types.h"
|
#include "common/logging/types.h"
|
||||||
|
|
||||||
namespace Common::Log {
|
namespace Common::Log {
|
||||||
|
|
||||||
|
@ -18,124 +18,6 @@ constexpr const char* TrimSourcePath(std::string_view source) {
|
||||||
return source.data() + idx;
|
return source.data() + idx;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Specifies the severity or level of detail of the log message.
|
|
||||||
enum class Level : u8 {
|
|
||||||
Trace, ///< Extremely detailed and repetitive debugging information that is likely to
|
|
||||||
///< pollute logs.
|
|
||||||
Debug, ///< Less detailed debugging information.
|
|
||||||
Info, ///< Status information from important points during execution.
|
|
||||||
Warning, ///< Minor or potential problems found during execution of a task.
|
|
||||||
Error, ///< Major problems found during execution of a task that prevent it from being
|
|
||||||
///< completed.
|
|
||||||
Critical, ///< Major problems during execution that threaten the stability of the entire
|
|
||||||
///< application.
|
|
||||||
|
|
||||||
Count ///< Total number of logging levels
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef u8 ClassType;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Specifies the sub-system that generated the log message.
|
|
||||||
*
|
|
||||||
* @note If you add a new entry here, also add a corresponding one to `ALL_LOG_CLASSES` in
|
|
||||||
* backend.cpp.
|
|
||||||
*/
|
|
||||||
enum class Class : ClassType {
|
|
||||||
Log, ///< Messages about the log system itself
|
|
||||||
Common, ///< Library routines
|
|
||||||
Common_Filesystem, ///< Filesystem interface library
|
|
||||||
Common_Memory, ///< Memory mapping and management functions
|
|
||||||
Core, ///< LLE emulation core
|
|
||||||
Core_ARM, ///< ARM CPU core
|
|
||||||
Core_Timing, ///< CoreTiming functions
|
|
||||||
Config, ///< Emulator configuration (including commandline)
|
|
||||||
Debug, ///< Debugging tools
|
|
||||||
Debug_Emulated, ///< Debug messages from the emulated programs
|
|
||||||
Debug_GPU, ///< GPU debugging tools
|
|
||||||
Debug_Breakpoint, ///< Logging breakpoints and watchpoints
|
|
||||||
Debug_GDBStub, ///< GDB Stub
|
|
||||||
Kernel, ///< The HLE implementation of the CTR kernel
|
|
||||||
Kernel_SVC, ///< Kernel system calls
|
|
||||||
Service, ///< HLE implementation of system services. Each major service
|
|
||||||
///< should have its own subclass.
|
|
||||||
Service_ACC, ///< The ACC (Accounts) service
|
|
||||||
Service_AM, ///< The AM (Applet manager) service
|
|
||||||
Service_AOC, ///< The AOC (AddOn Content) service
|
|
||||||
Service_APM, ///< The APM (Performance) service
|
|
||||||
Service_ARP, ///< The ARP service
|
|
||||||
Service_Audio, ///< The Audio (Audio control) service
|
|
||||||
Service_BCAT, ///< The BCAT service
|
|
||||||
Service_BGTC, ///< The BGTC (Background Task Controller) service
|
|
||||||
Service_BPC, ///< The BPC service
|
|
||||||
Service_BTDRV, ///< The Bluetooth driver service
|
|
||||||
Service_BTM, ///< The BTM service
|
|
||||||
Service_Capture, ///< The capture service
|
|
||||||
Service_ERPT, ///< The error reporting service
|
|
||||||
Service_ETicket, ///< The ETicket service
|
|
||||||
Service_EUPLD, ///< The error upload service
|
|
||||||
Service_Fatal, ///< The Fatal service
|
|
||||||
Service_FGM, ///< The FGM service
|
|
||||||
Service_Friend, ///< The friend service
|
|
||||||
Service_FS, ///< The FS (Filesystem) service
|
|
||||||
Service_GRC, ///< The game recording service
|
|
||||||
Service_HID, ///< The HID (Human interface device) service
|
|
||||||
Service_IRS, ///< The IRS service
|
|
||||||
Service_LBL, ///< The LBL (LCD backlight) service
|
|
||||||
Service_LDN, ///< The LDN (Local domain network) service
|
|
||||||
Service_LDR, ///< The loader service
|
|
||||||
Service_LM, ///< The LM (Logger) service
|
|
||||||
Service_Migration, ///< The migration service
|
|
||||||
Service_Mii, ///< The Mii service
|
|
||||||
Service_MM, ///< The MM (Multimedia) service
|
|
||||||
Service_NCM, ///< The NCM service
|
|
||||||
Service_NFC, ///< The NFC (Near-field communication) service
|
|
||||||
Service_NFP, ///< The NFP service
|
|
||||||
Service_NIFM, ///< The NIFM (Network interface) service
|
|
||||||
Service_NIM, ///< The NIM service
|
|
||||||
Service_NPNS, ///< The NPNS service
|
|
||||||
Service_NS, ///< The NS services
|
|
||||||
Service_NVDRV, ///< The NVDRV (Nvidia driver) service
|
|
||||||
Service_OLSC, ///< The OLSC service
|
|
||||||
Service_PCIE, ///< The PCIe service
|
|
||||||
Service_PCTL, ///< The PCTL (Parental control) service
|
|
||||||
Service_PCV, ///< The PCV service
|
|
||||||
Service_PM, ///< The PM service
|
|
||||||
Service_PREPO, ///< The PREPO (Play report) service
|
|
||||||
Service_PSC, ///< The PSC service
|
|
||||||
Service_PSM, ///< The PSM service
|
|
||||||
Service_SET, ///< The SET (Settings) service
|
|
||||||
Service_SM, ///< The SM (Service manager) service
|
|
||||||
Service_SPL, ///< The SPL service
|
|
||||||
Service_SSL, ///< The SSL service
|
|
||||||
Service_TCAP, ///< The TCAP service.
|
|
||||||
Service_Time, ///< The time service
|
|
||||||
Service_USB, ///< The USB (Universal Serial Bus) service
|
|
||||||
Service_VI, ///< The VI (Video interface) service
|
|
||||||
Service_WLAN, ///< The WLAN (Wireless local area network) service
|
|
||||||
HW, ///< Low-level hardware emulation
|
|
||||||
HW_Memory, ///< Memory-map and address translation
|
|
||||||
HW_LCD, ///< LCD register emulation
|
|
||||||
HW_GPU, ///< GPU control emulation
|
|
||||||
HW_AES, ///< AES engine emulation
|
|
||||||
IPC, ///< IPC interface
|
|
||||||
Frontend, ///< Emulator UI
|
|
||||||
Render, ///< Emulator video output and hardware acceleration
|
|
||||||
Render_Software, ///< Software renderer backend
|
|
||||||
Render_OpenGL, ///< OpenGL backend
|
|
||||||
Render_Vulkan, ///< Vulkan backend
|
|
||||||
Audio, ///< Audio emulation
|
|
||||||
Audio_DSP, ///< The HLE implementation of the DSP
|
|
||||||
Audio_Sink, ///< Emulator audio output backend
|
|
||||||
Loader, ///< ROM loader
|
|
||||||
CheatEngine, ///< Memory manipulation and engine VM functions
|
|
||||||
Crypto, ///< Cryptographic engine/functions
|
|
||||||
Input, ///< Input emulation
|
|
||||||
Network, ///< Network emulation
|
|
||||||
WebService, ///< Interface to yuzu Web Services
|
|
||||||
Count ///< Total number of logging classes
|
|
||||||
};
|
|
||||||
|
|
||||||
/// Logs a message to the global logger, using fmt
|
/// Logs a message to the global logger, using fmt
|
||||||
void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename,
|
void FmtLogMessageImpl(Class log_class, Level log_level, const char* filename,
|
||||||
unsigned int line_num, const char* function, const char* format,
|
unsigned int line_num, const char* function, const char* format,
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
#include "common/assert.h"
|
#include "common/assert.h"
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/logging/backend.h"
|
#include "common/logging/filter.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "common/logging/text_formatter.h"
|
#include "common/logging/text_formatter.h"
|
||||||
#include "common/string_util.h"
|
#include "common/string_util.h"
|
||||||
|
|
142
src/common/logging/types.h
Normal file
142
src/common/logging/types.h
Normal file
|
@ -0,0 +1,142 @@
|
||||||
|
// Copyright 2021 yuzu Emulator Project
|
||||||
|
// Licensed under GPLv2 or any later version
|
||||||
|
// Refer to the license.txt file included.
|
||||||
|
|
||||||
|
#include <chrono>
|
||||||
|
|
||||||
|
#include "common/common_types.h"
|
||||||
|
|
||||||
|
namespace Common::Log {
|
||||||
|
|
||||||
|
/// Specifies the severity or level of detail of the log message.
|
||||||
|
enum class Level : u8 {
|
||||||
|
Trace, ///< Extremely detailed and repetitive debugging information that is likely to
|
||||||
|
///< pollute logs.
|
||||||
|
Debug, ///< Less detailed debugging information.
|
||||||
|
Info, ///< Status information from important points during execution.
|
||||||
|
Warning, ///< Minor or potential problems found during execution of a task.
|
||||||
|
Error, ///< Major problems found during execution of a task that prevent it from being
|
||||||
|
///< completed.
|
||||||
|
Critical, ///< Major problems during execution that threaten the stability of the entire
|
||||||
|
///< application.
|
||||||
|
|
||||||
|
Count ///< Total number of logging levels
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specifies the sub-system that generated the log message.
|
||||||
|
*
|
||||||
|
* @note If you add a new entry here, also add a corresponding one to `ALL_LOG_CLASSES` in
|
||||||
|
* filter.cpp.
|
||||||
|
*/
|
||||||
|
enum class Class : u8 {
|
||||||
|
Log, ///< Messages about the log system itself
|
||||||
|
Common, ///< Library routines
|
||||||
|
Common_Filesystem, ///< Filesystem interface library
|
||||||
|
Common_Memory, ///< Memory mapping and management functions
|
||||||
|
Core, ///< LLE emulation core
|
||||||
|
Core_ARM, ///< ARM CPU core
|
||||||
|
Core_Timing, ///< CoreTiming functions
|
||||||
|
Config, ///< Emulator configuration (including commandline)
|
||||||
|
Debug, ///< Debugging tools
|
||||||
|
Debug_Emulated, ///< Debug messages from the emulated programs
|
||||||
|
Debug_GPU, ///< GPU debugging tools
|
||||||
|
Debug_Breakpoint, ///< Logging breakpoints and watchpoints
|
||||||
|
Debug_GDBStub, ///< GDB Stub
|
||||||
|
Kernel, ///< The HLE implementation of the CTR kernel
|
||||||
|
Kernel_SVC, ///< Kernel system calls
|
||||||
|
Service, ///< HLE implementation of system services. Each major service
|
||||||
|
///< should have its own subclass.
|
||||||
|
Service_ACC, ///< The ACC (Accounts) service
|
||||||
|
Service_AM, ///< The AM (Applet manager) service
|
||||||
|
Service_AOC, ///< The AOC (AddOn Content) service
|
||||||
|
Service_APM, ///< The APM (Performance) service
|
||||||
|
Service_ARP, ///< The ARP service
|
||||||
|
Service_Audio, ///< The Audio (Audio control) service
|
||||||
|
Service_BCAT, ///< The BCAT service
|
||||||
|
Service_BGTC, ///< The BGTC (Background Task Controller) service
|
||||||
|
Service_BPC, ///< The BPC service
|
||||||
|
Service_BTDRV, ///< The Bluetooth driver service
|
||||||
|
Service_BTM, ///< The BTM service
|
||||||
|
Service_Capture, ///< The capture service
|
||||||
|
Service_ERPT, ///< The error reporting service
|
||||||
|
Service_ETicket, ///< The ETicket service
|
||||||
|
Service_EUPLD, ///< The error upload service
|
||||||
|
Service_Fatal, ///< The Fatal service
|
||||||
|
Service_FGM, ///< The FGM service
|
||||||
|
Service_Friend, ///< The friend service
|
||||||
|
Service_FS, ///< The FS (Filesystem) service
|
||||||
|
Service_GRC, ///< The game recording service
|
||||||
|
Service_HID, ///< The HID (Human interface device) service
|
||||||
|
Service_IRS, ///< The IRS service
|
||||||
|
Service_LBL, ///< The LBL (LCD backlight) service
|
||||||
|
Service_LDN, ///< The LDN (Local domain network) service
|
||||||
|
Service_LDR, ///< The loader service
|
||||||
|
Service_LM, ///< The LM (Logger) service
|
||||||
|
Service_Migration, ///< The migration service
|
||||||
|
Service_Mii, ///< The Mii service
|
||||||
|
Service_MM, ///< The MM (Multimedia) service
|
||||||
|
Service_NCM, ///< The NCM service
|
||||||
|
Service_NFC, ///< The NFC (Near-field communication) service
|
||||||
|
Service_NFP, ///< The NFP service
|
||||||
|
Service_NIFM, ///< The NIFM (Network interface) service
|
||||||
|
Service_NIM, ///< The NIM service
|
||||||
|
Service_NPNS, ///< The NPNS service
|
||||||
|
Service_NS, ///< The NS services
|
||||||
|
Service_NVDRV, ///< The NVDRV (Nvidia driver) service
|
||||||
|
Service_OLSC, ///< The OLSC service
|
||||||
|
Service_PCIE, ///< The PCIe service
|
||||||
|
Service_PCTL, ///< The PCTL (Parental control) service
|
||||||
|
Service_PCV, ///< The PCV service
|
||||||
|
Service_PM, ///< The PM service
|
||||||
|
Service_PREPO, ///< The PREPO (Play report) service
|
||||||
|
Service_PSC, ///< The PSC service
|
||||||
|
Service_PSM, ///< The PSM service
|
||||||
|
Service_SET, ///< The SET (Settings) service
|
||||||
|
Service_SM, ///< The SM (Service manager) service
|
||||||
|
Service_SPL, ///< The SPL service
|
||||||
|
Service_SSL, ///< The SSL service
|
||||||
|
Service_TCAP, ///< The TCAP service.
|
||||||
|
Service_Time, ///< The time service
|
||||||
|
Service_USB, ///< The USB (Universal Serial Bus) service
|
||||||
|
Service_VI, ///< The VI (Video interface) service
|
||||||
|
Service_WLAN, ///< The WLAN (Wireless local area network) service
|
||||||
|
HW, ///< Low-level hardware emulation
|
||||||
|
HW_Memory, ///< Memory-map and address translation
|
||||||
|
HW_LCD, ///< LCD register emulation
|
||||||
|
HW_GPU, ///< GPU control emulation
|
||||||
|
HW_AES, ///< AES engine emulation
|
||||||
|
IPC, ///< IPC interface
|
||||||
|
Frontend, ///< Emulator UI
|
||||||
|
Render, ///< Emulator video output and hardware acceleration
|
||||||
|
Render_Software, ///< Software renderer backend
|
||||||
|
Render_OpenGL, ///< OpenGL backend
|
||||||
|
Render_Vulkan, ///< Vulkan backend
|
||||||
|
Audio, ///< Audio emulation
|
||||||
|
Audio_DSP, ///< The HLE implementation of the DSP
|
||||||
|
Audio_Sink, ///< Emulator audio output backend
|
||||||
|
Loader, ///< ROM loader
|
||||||
|
CheatEngine, ///< Memory manipulation and engine VM functions
|
||||||
|
Crypto, ///< Cryptographic engine/functions
|
||||||
|
Input, ///< Input emulation
|
||||||
|
Network, ///< Network emulation
|
||||||
|
WebService, ///< Interface to yuzu Web Services
|
||||||
|
Count ///< Total number of logging classes
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A log entry. Log entries are store in a structured format to permit more varied output
|
||||||
|
* formatting on different frontends, as well as facilitating filtering and aggregation.
|
||||||
|
*/
|
||||||
|
struct Entry {
|
||||||
|
std::chrono::microseconds timestamp;
|
||||||
|
Class log_class{};
|
||||||
|
Level log_level{};
|
||||||
|
const char* filename = nullptr;
|
||||||
|
unsigned int line_num = 0;
|
||||||
|
std::string function;
|
||||||
|
std::string message;
|
||||||
|
bool final_entry = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace Common::Log
|
|
@ -6,7 +6,6 @@
|
||||||
#include <numeric>
|
#include <numeric>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "common/fs/path_util.h"
|
#include "common/fs/path_util.h"
|
||||||
#include "common/logging/backend.h"
|
|
||||||
#include "core/file_sys/mode.h"
|
#include "core/file_sys/mode.h"
|
||||||
#include "core/file_sys/vfs.h"
|
#include "core/file_sys/vfs.h"
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "common/fs/path_util.h"
|
#include "common/fs/path_util.h"
|
||||||
#include "common/logging/backend.h"
|
|
||||||
#include "core/file_sys/vfs.h"
|
#include "core/file_sys/vfs.h"
|
||||||
#include "core/file_sys/vfs_libzip.h"
|
#include "core/file_sys/vfs_libzip.h"
|
||||||
#include "core/file_sys/vfs_vector.h"
|
#include "core/file_sys/vfs_vector.h"
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include "common/fs/fs.h"
|
#include "common/fs/fs.h"
|
||||||
#include "common/fs/path_util.h"
|
#include "common/fs/path_util.h"
|
||||||
#include "common/hex_util.h"
|
#include "common/hex_util.h"
|
||||||
#include "common/logging/backend.h"
|
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "core/core.h"
|
#include "core/core.h"
|
||||||
|
|
Loading…
Reference in a new issue