lokinet/llarp/util/logging/win32_logger.cpp

114 lines
3.0 KiB
C++
Raw Normal View History

2019-04-11 12:58:23 +00:00
#if defined(_WIN32)
2019-09-01 12:10:49 +00:00
#include <util/logging/win32_logger.hpp>
#include <util/logging/logger_internal.hpp>
2019-04-11 12:58:23 +00:00
static CONSOLE_SCREEN_BUFFER_INFO consoleInfo;
static short old_attrs;
2019-04-11 12:58:23 +00:00
namespace llarp
{
2019-08-15 08:41:04 +00:00
Win32LogStream::Win32LogStream(std::ostream& out)
2019-09-24 08:51:54 +00:00
: OStreamLogStream(true, out), m_Out(out)
2019-04-11 12:58:23 +00:00
{
// 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, const char* fname,
2019-06-18 04:00:18 +00:00
int lineno, const std::string& nodename) const
2019-08-15 06:27:40 +00:00
{
if(!isConsoleModern)
{
switch(lvl)
{
case eLogNone:
break;
case eLogTrace:
ss << "[TRC] ";
2019-08-15 06:27:40 +00:00
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() << " " << fname
<< ":" << lineno << "\t";
}
else
OStreamLogStream::PreLog(ss, lvl, fname, lineno, nodename);
}
void
Win32LogStream::PostLog(std::stringstream& ss) const
{
if(!isConsoleModern)
ss << std::endl;
else
OStreamLogStream::PostLog(ss);
}
void
Win32LogStream::Print(LogLevel lvl, const char*, const std::string& msg)
2019-04-11 12:58:23 +00:00
{
if(!isConsoleModern)
{
GetConsoleScreenBufferInfo(fd1, &consoleInfo);
old_attrs = consoleInfo.wAttributes;
2019-04-11 12:58:23 +00:00
switch(lvl)
{
case eLogNone:
break;
case eLogDebug:
SetConsoleTextAttribute(fd1,
FOREGROUND_RED | FOREGROUND_GREEN
| FOREGROUND_BLUE); // low white on black
2019-04-11 12:58:23 +00:00
break;
case eLogInfo:
SetConsoleTextAttribute(
fd1,
FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN
| FOREGROUND_BLUE); // high white on black
2019-04-11 12:58:23 +00:00
break;
case eLogWarn:
SetConsoleTextAttribute(fd1,
FOREGROUND_RED | FOREGROUND_GREEN
| FOREGROUND_INTENSITY); // bright yellow
2019-04-11 12:58:23 +00:00
break;
case eLogError:
SetConsoleTextAttribute(
fd1, FOREGROUND_RED | FOREGROUND_INTENSITY); // bright red
2019-04-11 12:58:23 +00:00
break;
}
}
2019-08-15 08:41:04 +00:00
m_Out << msg << std::flush;
2019-04-11 12:58:23 +00:00
if(!isConsoleModern)
{
SetConsoleTextAttribute(
fd1, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
}
2019-04-11 12:58:23 +00:00
}
2019-08-15 06:27:40 +00:00
2019-04-11 12:58:23 +00:00
} // namespace llarp
#endif