ES-DE/es-core/src/Log.cpp

98 lines
2.3 KiB
C++
Raw Normal View History

// SPDX-License-Identifier: MIT
//
// EmulationStation Desktop Edition
// Log.cpp
//
2021-11-15 19:47:00 +00:00
// Log output.
// This class is thread safe.
//
#include "Log.h"
2021-11-15 22:45:17 +00:00
#include "utils/StringUtil.h"
2017-11-01 22:21:10 +00:00
2022-06-22 05:06:20 +00:00
LogLevel Log::getReportingLevel()
{
std::unique_lock<std::mutex> lock {sLogMutex};
2022-06-22 05:06:20 +00:00
return sReportingLevel;
}
void Log::setReportingLevel(LogLevel level)
{
std::unique_lock<std::mutex> lock {sLogMutex};
2022-06-22 05:06:20 +00:00
sReportingLevel = level;
}
std::string Log::getLogPath()
{
return Utils::FileSystem::getHomePath() + "/.emulationstation/es_log.txt";
}
void Log::init()
{
Utils::FileSystem::removeFile(getLogPath() + ".bak");
// Rename the previous log file.
Utils::FileSystem::renameFile(getLogPath(), getLogPath() + ".bak", true);
return;
}
void Log::open()
{
std::unique_lock<std::mutex> lock {sLogMutex};
#if defined(_WIN64)
2021-11-15 22:45:17 +00:00
sFile.open(Utils::String::stringToWideString(getLogPath()).c_str());
#else
2021-11-15 19:47:00 +00:00
sFile.open(getLogPath().c_str());
#endif
}
void Log::flush()
{
std::unique_lock<std::mutex> lock {sLogMutex};
sFile.flush();
}
void Log::close()
{
std::unique_lock<std::mutex> lock {sLogMutex};
if (sFile.is_open())
sFile.close();
}
std::ostringstream& Log::get(LogLevel level)
{
2022-01-16 17:18:28 +00:00
time_t t {time(nullptr)};
struct tm tm;
#if defined(_WIN64)
// Of course Windows does not follow standards and puts the parameters the other way
// around compared to POSIX.
localtime_s(&tm, &t);
#else
localtime_r(&t, &tm);
#endif
std::unique_lock<std::mutex> lock {sLogMutex};
2021-11-15 19:47:00 +00:00
mOutStringStream << std::put_time(&tm, "%b %d %T ") << mLogLevelMap[level] << ":\t";
mMessageLevel = level;
2021-11-15 19:47:00 +00:00
return mOutStringStream;
}
Log::~Log()
{
std::unique_lock<std::mutex> lock {sLogMutex};
2023-01-28 12:36:22 +00:00
mOutStringStream << std::endl;
2021-11-15 19:47:00 +00:00
if (!sFile.is_open()) {
// Not open yet, print to stdout.
std::cerr << "Error: Tried to write to log file before it was open, "
"the following won't be logged:\n";
2021-11-15 19:47:00 +00:00
std::cerr << mOutStringStream.str();
return;
}
2021-11-15 19:47:00 +00:00
sFile << mOutStringStream.str();
2021-11-15 19:47:00 +00:00
// If it's an error or the --debug flag has been set, then print to the console as well.
if (mMessageLevel == LogError || sReportingLevel >= LogDebug)
std::cerr << mOutStringStream.str();
}