You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lokinet/llarp/util/logging/win32_logger.cpp

117 lines
3.0 KiB
C++

#if defined(_WIN32)
#include "win32_logger.hpp"
#include "logger_internal.hpp"
static CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
static short old_attrs;
namespace llarp
{
Win32LogStream::Win32LogStream(std::ostream& out) : OStreamLogStream(true, out), m_Out(out)
{
// Attempt to use ANSI escapes directly
// if the modern console is active.
DWORD mode_flags;
GetConsoleMode(fd1, &mode_flags);
// since release SDKs don't have ANSI escape support yet
// we get all or nothing: if we can't get it, then we wouldn't
// be able to get any of them individually
mode_flags |= 0x0004 | 0x0008;
BOOL t = SetConsoleMode(fd1, mode_flags);
if (!t)
this->isConsoleModern = false; // fall back to setting colours manually
}
void
Win32LogStream::PreLog(
std::stringstream& ss,
LogLevel lvl,
std::string_view filename,
int lineno,
const std::string& nodename) const
{
if (!isConsoleModern)
{
switch (lvl)
{
case eLogNone:
break;
case eLogTrace:
ss << "[TRC] ";
break;
case eLogDebug:
ss << "[DBG] ";
break;
case eLogInfo:
ss << "[NFO] ";
break;
case eLogWarn:
ss << "[WRN] ";
break;
case eLogError:
ss << "[ERR] ";
break;
}
ss << "[" << nodename << "]"
<< "(" << thread_id_string() << ") " << log_timestamp() << " " << filename << ":" << lineno
<< "\t";
}
else
OStreamLogStream::PreLog(ss, lvl, filename, lineno, nodename);
}
void
Win32LogStream::PostLog(std::stringstream& ss) const
{
if (!isConsoleModern)
ss << std::endl;
else
OStreamLogStream::PostLog(ss);
}
void
Win32LogStream::Print(LogLevel lvl, std::string_view, const std::string& msg)
{
if (!isConsoleModern)
{
GetConsoleScreenBufferInfo(fd1, &consoleInfo);
old_attrs = consoleInfo.wAttributes;
switch (lvl)
{
case eLogNone:
break;
case eLogTrace:
case eLogDebug:
SetConsoleTextAttribute(
fd1,
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); // low white on black
break;
case eLogInfo:
SetConsoleTextAttribute(
fd1,
FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN
| FOREGROUND_BLUE); // high white on black
break;
case eLogWarn:
SetConsoleTextAttribute(
fd1,
FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); // bright yellow
break;
case eLogError:
SetConsoleTextAttribute(fd1, FOREGROUND_RED | FOREGROUND_INTENSITY); // bright red
break;
}
}
m_Out << msg << std::flush;
if (!isConsoleModern)
{
SetConsoleTextAttribute(fd1, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
}
} // namespace llarp
#endif