Flush log on signal
This commit is contained in:
parent
267304ce6a
commit
d60eb6f659
2 changed files with 40 additions and 0 deletions
|
|
@ -43,6 +43,7 @@ namespace psemek::log
|
||||||
struct sink
|
struct sink
|
||||||
{
|
{
|
||||||
virtual void put_message(message const & msg) = 0;
|
virtual void put_message(message const & msg) = 0;
|
||||||
|
virtual void flush() = 0;
|
||||||
virtual ~sink() {}
|
virtual ~sink() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@
|
||||||
#include <thread>
|
#include <thread>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <csignal>
|
||||||
|
|
||||||
namespace psemek::log
|
namespace psemek::log
|
||||||
{
|
{
|
||||||
|
|
@ -25,6 +26,39 @@ namespace psemek::log
|
||||||
std::mutex sinks_mutex;
|
std::mutex sinks_mutex;
|
||||||
std::vector<std::unique_ptr<sink>> sinks;
|
std::vector<std::unique_ptr<sink>> sinks;
|
||||||
|
|
||||||
|
std::pair<int, std::string> const signals[] =
|
||||||
|
{
|
||||||
|
{SIGSEGV, "Aborting due to SIGSEGV"},
|
||||||
|
{SIGABRT, "Aborting due to SIGABRT"},
|
||||||
|
{SIGTERM, "Aborting due to SIGTERM"},
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sinks_flusher
|
||||||
|
{
|
||||||
|
sinks_flusher()
|
||||||
|
{
|
||||||
|
for (auto const & p : signals)
|
||||||
|
std::signal(p.first, &handler);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
static void handler(int signal)
|
||||||
|
{
|
||||||
|
for (auto const & p : signals)
|
||||||
|
{
|
||||||
|
if (p.first == signal)
|
||||||
|
{
|
||||||
|
put_message(level::error, p.second);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto & sink : sinks)
|
||||||
|
sink->flush();
|
||||||
|
std::exit(1);
|
||||||
|
}
|
||||||
|
} flusher;
|
||||||
|
|
||||||
void put_message(level l, std::string const & str, std::string const & thread_name)
|
void put_message(level l, std::string const & str, std::string const & thread_name)
|
||||||
{
|
{
|
||||||
message msg
|
message msg
|
||||||
|
|
@ -76,6 +110,11 @@ namespace psemek::log
|
||||||
stream_->write(str.data(), str.size());
|
stream_->write(str.data(), str.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void flush() override
|
||||||
|
{
|
||||||
|
// stream_->flush();
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::unique_ptr<io::ostream> stream_;
|
std::unique_ptr<io::ostream> stream_;
|
||||||
level level_;
|
level level_;
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue