#include "log.h" #include "../util_env.h" namespace dxvk { Logger::Logger(const std::string& file_name) : m_minLevel(getMinLogLevel()) { if (m_minLevel != LogLevel::None) m_fileStream = std::ofstream(getFileName(file_name)); } Logger::~Logger() { } void Logger::trace(const std::string& message) { s_instance.emitMsg(LogLevel::Trace, message); } void Logger::debug(const std::string& message) { s_instance.emitMsg(LogLevel::Debug, message); } void Logger::info(const std::string& message) { s_instance.emitMsg(LogLevel::Info, message); } void Logger::warn(const std::string& message) { s_instance.emitMsg(LogLevel::Warn, message); } void Logger::err(const std::string& message) { s_instance.emitMsg(LogLevel::Error, message); } void Logger::log(LogLevel level, const std::string& message) { s_instance.emitMsg(level, message); } void Logger::emitMsg(LogLevel level, const std::string& message) { if (level >= m_minLevel) { std::lock_guard lock(m_mutex); static std::array s_prefixes = {{ "trace: ", "debug: ", "info: ", "warn: ", "err: " }}; const char* prefix = s_prefixes.at(static_cast(level)); std::cerr << prefix << message << std::endl; m_fileStream << prefix << message << std::endl; } } LogLevel Logger::getMinLogLevel() { const std::array, 6> logLevels = {{ { "trace", LogLevel::Trace }, { "debug", LogLevel::Debug }, { "info", LogLevel::Info }, { "warn", LogLevel::Warn }, { "error", LogLevel::Error }, { "none", LogLevel::None }, }}; const std::string logLevelStr = env::getEnvVar(L"DXVK_LOG_LEVEL"); for (const auto& pair : logLevels) { if (logLevelStr == pair.first) return pair.second; } return LogLevel::Info; } std::string Logger::getFileName(const std::string& base) { std::string path = env::getEnvVar(L"DXVK_LOG_PATH"); if (!path.empty() && *path.rbegin() != '/') path += '/'; std::string exeName = env::getExeName(); auto extp = exeName.find_last_of('.'); if (extp != std::string::npos && exeName.substr(extp + 1) == "exe") exeName.erase(extp); path += exeName + "_" + base; return path; } }