mirror of
https://github.com/Detanup01/gbe_fork.git
synced 2024-11-27 05:04:01 +08:00
object based logger
This commit is contained in:
parent
dcd3713b3c
commit
15bc66a1da
@ -1,94 +1,147 @@
|
||||
#include "dbg_log/dbg_log.hpp"
|
||||
#include "common_helpers/common_helpers.hpp"
|
||||
|
||||
#include <cstdarg>
|
||||
#include <cstdio>
|
||||
#include <filesystem>
|
||||
#include <thread>
|
||||
#include <sstream>
|
||||
#include <chrono>
|
||||
#include <mutex>
|
||||
|
||||
static FILE* out_file = nullptr;
|
||||
auto const static start_time = std::chrono::system_clock::now();
|
||||
static std::recursive_mutex f_mtx{};
|
||||
|
||||
bool dbg_log::init(const wchar_t *path)
|
||||
{
|
||||
auto p = std::filesystem::path(path).u8string();
|
||||
return init(p.c_str());
|
||||
}
|
||||
|
||||
bool dbg_log::init(const char *path)
|
||||
{
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
std::lock_guard lk(f_mtx);
|
||||
if (!out_file) {
|
||||
out_file = std::fopen(path, "a");
|
||||
if (!out_file) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void dbg_log::write(const std::wstring &str)
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
write(common_helpers::wstr_to_a(str));
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void dbg_log::write(const std::string &str)
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
write(str.c_str());
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void dbg_log::write(const char *fmt, ...)
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
std::lock_guard lk(f_mtx);
|
||||
if (out_file) {
|
||||
auto elapsed = std::chrono::system_clock::now() - start_time;
|
||||
|
||||
std::stringstream ss{};
|
||||
ss << "[" << std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count() << " ms] [tid: " << std::this_thread::get_id() << "] ";
|
||||
auto ss_str = ss.str();
|
||||
|
||||
std::fprintf(out_file, ss_str.c_str());
|
||||
|
||||
std::va_list args;
|
||||
va_start(args, fmt);
|
||||
std::vfprintf(out_file, fmt, args);
|
||||
va_end(args);
|
||||
|
||||
std::fprintf(out_file, "\n");
|
||||
std::fflush(out_file);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void dbg_log::close()
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
std::lock_guard lk(f_mtx);
|
||||
if (out_file) {
|
||||
std::fprintf(out_file, "\nLog file closed\n\n");
|
||||
std::fclose(out_file);
|
||||
out_file = nullptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
#include "dbg_log/dbg_log.hpp"
|
||||
#include "common_helpers/common_helpers.hpp"
|
||||
#include "utfcpp/utf8.h"
|
||||
|
||||
#include <iterator>
|
||||
#include <cwchar>
|
||||
#include <cstdarg>
|
||||
#include <filesystem>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
#include <stdio.h>
|
||||
|
||||
#include "common_helpers/os_detector.h"
|
||||
|
||||
|
||||
void dbg_log::open()
|
||||
{
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
if (!out_file && filepath.size()) {
|
||||
|
||||
// https://en.cppreference.com/w/cpp/filesystem/path/u8path
|
||||
const auto fsp = std::filesystem::u8path(filepath);
|
||||
#if defined(__WINDOWS__)
|
||||
out_file = _wfopen(fsp.c_str(), L"a");
|
||||
#else
|
||||
out_file = std::fopen(fsp.c_str(), "a");
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void dbg_log::write_stamp()
|
||||
{
|
||||
auto elapsed = std::chrono::high_resolution_clock::now() - start_time;
|
||||
auto duration_ms = std::chrono::duration_cast<std::chrono::milliseconds>(elapsed).count();
|
||||
auto duration_us = std::chrono::duration_cast<std::chrono::microseconds>(elapsed).count();
|
||||
|
||||
std::stringstream ss{};
|
||||
ss << "[" << duration_ms << " ms, " << duration_us << " us] ";
|
||||
auto ss_str = ss.str();
|
||||
|
||||
std::fprintf(out_file, "%s", ss_str.c_str());
|
||||
}
|
||||
|
||||
dbg_log::dbg_log(std::string_view path)
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
filepath = path;
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
dbg_log::dbg_log(std::wstring_view path)
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
filepath = common_helpers::to_str(path);
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
dbg_log::~dbg_log()
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
close();
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void dbg_log::write(std::string_view str)
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
write(str.data());
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void dbg_log::write(std::wstring_view str)
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
write(str.data());
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void dbg_log::write(const char *fmt, ...)
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
std::lock_guard lk(f_mtx);
|
||||
open();
|
||||
if (out_file) {
|
||||
write_stamp();
|
||||
|
||||
std::va_list args;
|
||||
va_start(args, fmt);
|
||||
std::vfprintf(out_file, fmt, args);
|
||||
va_end(args);
|
||||
|
||||
std::fprintf(out_file, "\n");
|
||||
std::fflush(out_file);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void dbg_log::write(const wchar_t *fmt, ...)
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
std::lock_guard lk(f_mtx);
|
||||
open();
|
||||
if (out_file) {
|
||||
write_stamp();
|
||||
|
||||
std::va_list args;
|
||||
va_start(args, fmt);
|
||||
std::vfwprintf(out_file, fmt, args);
|
||||
va_end(args);
|
||||
|
||||
std::fprintf(out_file, "\n");
|
||||
std::fflush(out_file);
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
void dbg_log::close()
|
||||
{
|
||||
|
||||
#ifndef EMU_RELEASE_BUILD
|
||||
std::lock_guard lk(f_mtx);
|
||||
if (out_file) {
|
||||
std::fprintf(out_file, "\nLog file closed\n\n");
|
||||
std::fclose(out_file);
|
||||
out_file = nullptr;
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
@ -1,20 +1,32 @@
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
|
||||
namespace dbg_log
|
||||
{
|
||||
|
||||
bool init(const wchar_t *path);
|
||||
|
||||
bool init(const char *path);
|
||||
|
||||
void write(const std::wstring &str);
|
||||
|
||||
void write(const std::string &str);
|
||||
|
||||
void write(const char* fmt, ...);
|
||||
|
||||
void close();
|
||||
|
||||
}
|
||||
#pragma once
|
||||
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <mutex>
|
||||
#include <cstdio>
|
||||
#include <chrono>
|
||||
|
||||
class dbg_log
|
||||
{
|
||||
private:
|
||||
std::recursive_mutex f_mtx{};
|
||||
std::string filepath{};
|
||||
std::FILE *out_file{};
|
||||
const std::chrono::high_resolution_clock::time_point start_time = std::chrono::high_resolution_clock::now();
|
||||
|
||||
void open();
|
||||
void write_stamp();
|
||||
|
||||
public:
|
||||
dbg_log(std::string_view path);
|
||||
dbg_log(std::wstring_view path);
|
||||
~dbg_log();
|
||||
|
||||
void write(std::string_view str);
|
||||
void write(std::wstring_view str);
|
||||
|
||||
void write(const char* fmt, ...);
|
||||
void write(const wchar_t* fmt, ...);
|
||||
|
||||
void close();
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user