Add red color to stderr logging

This commit is contained in:
Nikita Lisitsa 2023-08-06 19:00:34 +03:00
parent 04243db779
commit f6377045c9
6 changed files with 131 additions and 16 deletions

View file

@ -0,0 +1,10 @@
#pragma once
#include <psemek/io/stream.hpp>
namespace psemek::log
{
std::unique_ptr<io::ostream> colored_stream(std::unique_ptr<io::ostream> stream, std::string open, std::string close);
}

View file

@ -0,0 +1,45 @@
#include <psemek/log/colored_stream.hpp>
namespace psemek::log
{
namespace
{
struct colored_stream_impl
: io::ostream
{
colored_stream_impl(std::unique_ptr<io::ostream> stream, std::string open, std::string close)
: stream_(std::move(stream))
, open_(std::move(open))
, close_(std::move(close))
{}
std::size_t write(char const * p, std::size_t size) override
{
std::size_t result = 0;
stream_->write(open_.data(), open_.size());
result += stream_->write(p, size);
stream_->write(close_.data(), close_.size());
return result;
}
void flush() override
{
stream_->flush();
}
private:
std::unique_ptr<io::ostream> stream_;
std::string open_;
std::string close_;
};
}
std::unique_ptr<io::ostream> colored_stream(std::unique_ptr<io::ostream> stream, std::string open, std::string close)
{
return std::make_unique<colored_stream_impl>(std::move(stream), std::move(open), std::move(close));
}
}

View file

@ -6,8 +6,10 @@
#include <psemek/util/clock.hpp>
#include <psemek/util/pretty_print.hpp>
#include <psemek/log/log.hpp>
#include <psemek/log/colored_stream.hpp>
#include <psemek/io/synchronized.hpp>
#include <psemek/util/exception.hpp>
#include <psemek/util/terminal_color.hpp>
#undef main
@ -28,6 +30,9 @@ int main(int argc, char ** argv) try
synchronized_stdout_stderr.push_back(io::std_err());
synchronized_stdout_stderr = io::synchronized(std::move(synchronized_stdout_stderr));
if (util::terminal_color::supported())
synchronized_stdout_stderr[1] = log::colored_stream(std::move(synchronized_stdout_stderr[1]), std::string{util::terminal_color::red()}, std::string{util::terminal_color::normal()});
log::add_sink(log::default_sink(std::move(synchronized_stdout_stderr[0]), stdio_log_level, log::level::info));
log::add_sink(log::default_sink(std::move(synchronized_stdout_stderr[1]), log::level::warning, log::level::error));
log::register_thread("main");

View file

@ -0,0 +1,16 @@
#pragma once
#include <string_view>
namespace psemek::util::terminal_color
{
bool supported();
std::string_view bold();
std::string_view red();
std::string_view green();
std::string_view yellow();
std::string_view cyan();
std::string_view normal();
}

View file

@ -0,0 +1,47 @@
#include <psemek/util/terminal_color.hpp>
#include <cstdlib>
namespace psemek::util::terminal_color
{
bool supported()
{
std::string_view term;
if (auto t = std::getenv("TERM"))
term = t;
return term == "linux" || term.starts_with("xterm");
}
std::string_view bold()
{
return "\033[1m";
}
std::string_view red()
{
return "\033[1;31m";
}
std::string_view green()
{
return "\033[1;32m";
}
std::string_view yellow()
{
return "\033[33m";
}
std::string_view cyan()
{
return "\033[36m";
}
std::string_view normal()
{
return "\033[0m";
}
}

View file

@ -1,6 +1,7 @@
#include <psemek/test/test.hpp>
#include <psemek/util/pretty_print.hpp>
#include <psemek/util/exception.hpp>
#include <psemek/util/terminal_color.hpp>
#include <psemek/log/log.hpp>
#include <map>
@ -63,15 +64,6 @@ namespace psemek::test
}
static bool terminal_has_color()
{
std::string_view term;
if (auto t = std::getenv("TERM"))
term = t;
return term == "linux" || term.starts_with("xterm");
}
int main(int argc, char ** argv)
{
std::string_view bold;
@ -81,14 +73,14 @@ int main(int argc, char ** argv)
std::string_view cyan;
std::string_view normal;
if (terminal_has_color())
if (psemek::util::terminal_color::supported())
{
bold = "\033[1m";
red = "\033[1;31m";
green = "\033[1;32m";
yellow = "\033[33m";
cyan = "\033[36m";
normal = "\033[0m";
bold = psemek::util::terminal_color::bold();
red = psemek::util::terminal_color::red();
green = psemek::util::terminal_color::green();
yellow = psemek::util::terminal_color::yellow();
cyan = psemek::util::terminal_color::cyan();
normal = psemek::util::terminal_color::normal();
}
std::set<std::string> tests;