[dxvk] Re-implemented logger

This commit is contained in:
Philip Rebohle 2017-10-10 23:44:06 +02:00
parent 00e63d71a9
commit 46845e60be
8 changed files with 98 additions and 33 deletions

View File

@ -2,10 +2,10 @@
namespace dxvk {
Log g_logger("dxvk.log");
Logger g_logger("dxvk.log");
void log(const std::string& message) {
g_logger.log(message);
Logger* getGlobalLogger() {
return &g_logger;
}
}

View File

@ -5,10 +5,6 @@
namespace dxvk {
/**
* \brief Adds a message to the global DXVK log
* \param [in] message Log message
*/
void log(const std::string& message);
Logger* getGlobalLogger();
}

View File

@ -1,26 +1,39 @@
#include "log.h"
#include "../../dxvk/dxvk_main.h"
namespace dxvk {
Log::Log(const std::string& filename)
: m_stream(filename, std::ios_base::out | std::ios_base::trunc) {
Logger::Logger(const std::string& file_name)
: m_fileStream(file_name) { }
Logger::~Logger() { }
void Logger::trace(const std::string& message) {
getGlobalLogger()->log(std::string("trace: ") + message);
}
Log::~Log() {
void Logger::info(const std::string& message) {
getGlobalLogger()->log(std::string("info: ") + message);
}
void Log::log(const std::string& message) {
void Logger::warn(const std::string& message) {
getGlobalLogger()->log(std::string("warn: ") + message);
}
void Logger::err(const std::string& message) {
getGlobalLogger()->log(std::string("err: ") + message);
}
void Logger::log(const std::string& message) {
std::lock_guard<std::mutex> lock(m_mutex);
std::cerr << message << std::endl;
std::cerr.flush();
m_stream << message << std::endl;
m_stream.flush();
m_fileStream << message << std::endl;
m_fileStream.flush();
}
}

View File

@ -12,29 +12,28 @@ namespace dxvk {
/**
* \brief Logger
*
* Logs messages generated by DXVK and
* the client APIs using DXVK.
* Logger for one DLL. Creates a text file and
* writes all log messages to that file.
*/
class Log : public RcObject {
class Logger {
public:
Log(const std::string& filename);
~Log();
Logger(const std::string& file_name);
~Logger();
/**
* \brief Adds a message to the log
*
* Prints the message to stderr and appends
* it to the log file at the same time.
*/
void log(const std::string& message);
static void trace(const std::string& message);
static void info (const std::string& message);
static void warn (const std::string& message);
static void err (const std::string& message);
private:
std::mutex m_mutex;
std::fstream m_stream;
std::ofstream m_fileStream;
void log(const std::string& message);
};
}

View File

@ -0,0 +1,11 @@
#include "log_debug.h"
namespace dxvk::debug {
std::string methodName(const std::string& prettyName) {
size_t end = prettyName.find("(");
size_t begin = prettyName.substr(0, end).rfind(" ") + 1;
return prettyName.substr(begin,end - begin);
}
}

45
src/util/log/log_debug.h Normal file
View File

@ -0,0 +1,45 @@
#pragma once
#include <sstream>
#include "log.h"
#define METHOD_NAME __PRETTY_FUNCTION__
#define TRACE_ENABLED
#ifdef TRACE_ENABLED
#define TRACE(...) \
do { dxvk::debug::trace(METHOD_NAME, __VA_ARGS__); } while (0)
#else
#define TRACE(...) \
do { } while (0)
#endif
namespace dxvk::debug {
std::string methodName(const std::string& prettyName);
inline void traceArgs(std::stringstream& stream) { }
template<typename Arg1>
void traceArgs(std::stringstream& stream, const Arg1& arg1) {
stream << arg1;
}
template<typename Arg1, typename Arg2, typename... Args>
void traceArgs(std::stringstream& stream, const Arg1& arg1, const Arg2& arg2, const Args&... args) {
stream << arg1 << ",";
traceArgs(stream, arg2, args...);
}
template<typename... Args>
void trace(const std::string& funcName, const Args&... args) {
std::stringstream stream;
stream << methodName(funcName) << "(";
traceArgs(stream, args...);
stream << ")";
Logger::trace(stream.str());
}
}

View File

@ -1,5 +1,6 @@
util_src = files([
'log/log.cpp',
'log/log_debug.cpp',
])
util_lib = static_library('util', util_src,

View File

@ -112,7 +112,7 @@ int WINAPI WinMain(HINSTANCE hInstance,
}
}
} catch (const dxvk::DxvkError& e) {
dxvk::log(e.message());
Logger::err(e.message());
return msg.wParam;
}
}