mirror of
https://github.com/FairRootGroup/FairLogger.git
synced 2025-10-13 00:31:12 +00:00
Allow use after static destruction took place
This commit is contained in:
parent
2d5dd004cb
commit
180acaae26
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1 +1,2 @@
|
||||||
build/
|
build/
|
||||||
|
.vscode
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <ctime> // strftime
|
#include <ctime> // strftime
|
||||||
#include <iomanip> // setw, setfill
|
#include <iomanip> // setw, setfill
|
||||||
|
#include <cstdio> // printf
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -84,6 +85,8 @@ Severity Logger::fMinSeverity = Severity::info;
|
||||||
function<void()> Logger::fFatalCallback;
|
function<void()> Logger::fFatalCallback;
|
||||||
unordered_map<string, pair<Severity, function<void(const string& content, const LogMetaData& metadata)>>> Logger::fCustomSinks;
|
unordered_map<string, pair<Severity, function<void(const string& content, const LogMetaData& metadata)>>> Logger::fCustomSinks;
|
||||||
mutex Logger::fMtx;
|
mutex Logger::fMtx;
|
||||||
|
bool Logger::fIsDestructed = false;
|
||||||
|
Logger::DestructionHelper fDestructionHelper;
|
||||||
|
|
||||||
#if defined(__APPLE__) || defined(__FreeBSD__)
|
#if defined(__APPLE__) || defined(__FreeBSD__)
|
||||||
const string Logger::fProcessName = getprogname();
|
const string Logger::fProcessName = getprogname();
|
||||||
|
@ -199,17 +202,19 @@ string Logger::VerbosityName(Verbosity verbosity)
|
||||||
|
|
||||||
Logger::Logger(Severity severity, const string& file, const string& line, const string& func)
|
Logger::Logger(Severity severity, const string& file, const string& line, const string& func)
|
||||||
{
|
{
|
||||||
chrono::time_point<chrono::system_clock> now = chrono::system_clock::now();
|
if (!fIsDestructed) {
|
||||||
size_t pos = file.rfind("/");
|
chrono::time_point<chrono::system_clock> now = chrono::system_clock::now();
|
||||||
|
size_t pos = file.rfind("/");
|
||||||
|
|
||||||
fMetaData.timestamp = chrono::system_clock::to_time_t(now);
|
fMetaData.timestamp = chrono::system_clock::to_time_t(now);
|
||||||
fMetaData.us = chrono::duration_cast<chrono::microseconds>(now.time_since_epoch()) % 1000000;
|
fMetaData.us = chrono::duration_cast<chrono::microseconds>(now.time_since_epoch()) % 1000000;
|
||||||
fMetaData.process_name = fProcessName;
|
fMetaData.process_name = fProcessName;
|
||||||
fMetaData.file = file.substr(pos + 1);
|
fMetaData.file = file.substr(pos + 1);
|
||||||
fMetaData.line = line;
|
fMetaData.line = line;
|
||||||
fMetaData.func = func;
|
fMetaData.func = func;
|
||||||
fMetaData.severity_name = fSeverityNames.at(static_cast<size_t>(severity));
|
fMetaData.severity_name = fSeverityNames.at(static_cast<size_t>(severity));
|
||||||
fMetaData.severity = severity;
|
fMetaData.severity = severity;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Logger::SetConsoleSeverity(const Severity severity)
|
void Logger::SetConsoleSeverity(const Severity severity)
|
||||||
|
@ -524,6 +529,10 @@ void Logger::RemoveCustomSink(const string& key)
|
||||||
|
|
||||||
Logger& Logger::Log()
|
Logger& Logger::Log()
|
||||||
{
|
{
|
||||||
|
if (fIsDestructed) {
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
char tsstr[32];
|
char tsstr[32];
|
||||||
{
|
{
|
||||||
lock_guard<mutex> lock(fMtx); // localtime is not threadsafe, guard it
|
lock_guard<mutex> lock(fMtx); // localtime is not threadsafe, guard it
|
||||||
|
@ -538,36 +547,36 @@ Logger& Logger::Log()
|
||||||
bool appendSpace = false;
|
bool appendSpace = false;
|
||||||
for (const auto info : spec.fOrder) {
|
for (const auto info : spec.fOrder) {
|
||||||
switch (info) {
|
switch (info) {
|
||||||
case VerbositySpec::Info::process_name:
|
case VerbositySpec::Info::process_name:
|
||||||
fBWOut << "[" << fMetaData.process_name << "]";
|
fBWOut << "[" << fMetaData.process_name << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::timestamp_us:
|
case VerbositySpec::Info::timestamp_us:
|
||||||
fBWOut << "[" << tsstr << "." << setw(6) << setfill('0') << fMetaData.us.count() << "]";
|
fBWOut << "[" << tsstr << "." << setw(6) << setfill('0') << fMetaData.us.count() << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::timestamp_s:
|
case VerbositySpec::Info::timestamp_s:
|
||||||
fBWOut << "[" << tsstr << "]";
|
fBWOut << "[" << tsstr << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::severity:
|
case VerbositySpec::Info::severity:
|
||||||
fBWOut << "[" << fMetaData.severity_name << "]";
|
fBWOut << "[" << fMetaData.severity_name << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::file_line_function:
|
case VerbositySpec::Info::file_line_function:
|
||||||
fBWOut << "[" << fMetaData.file << ":" << fMetaData.line << ":" << fMetaData.func << "]";
|
fBWOut << "[" << fMetaData.file << ":" << fMetaData.line << ":" << fMetaData.func << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::file_line:
|
case VerbositySpec::Info::file_line:
|
||||||
fBWOut << "[" << fMetaData.file << ":" << fMetaData.line << "]";
|
fBWOut << "[" << fMetaData.file << ":" << fMetaData.line << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::file:
|
case VerbositySpec::Info::file:
|
||||||
fBWOut << "[" << fMetaData.file << "]";
|
fBWOut << "[" << fMetaData.file << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -580,40 +589,40 @@ Logger& Logger::Log()
|
||||||
bool appendSpace = false;
|
bool appendSpace = false;
|
||||||
for (const auto info : spec.fOrder) {
|
for (const auto info : spec.fOrder) {
|
||||||
switch (info) {
|
switch (info) {
|
||||||
case VerbositySpec::Info::process_name:
|
case VerbositySpec::Info::process_name:
|
||||||
fColorOut << "[" << ColorOut(Color::fgBlue, fMetaData.process_name) << "]";
|
fColorOut << "[" << ColorOut(Color::fgBlue, fMetaData.process_name) << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::timestamp_us:
|
case VerbositySpec::Info::timestamp_us:
|
||||||
fColorOut << "[" << startColor(Color::fgCyan) << tsstr << "."
|
fColorOut << "[" << startColor(Color::fgCyan) << tsstr << "."
|
||||||
<< setw(6) << setfill('0') << fMetaData.us.count() << endColor() << "]";
|
<< setw(6) << setfill('0') << fMetaData.us.count() << endColor() << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::timestamp_s:
|
case VerbositySpec::Info::timestamp_s:
|
||||||
fColorOut << "[" << startColor(Color::fgCyan) << tsstr << endColor() << "]";
|
fColorOut << "[" << startColor(Color::fgCyan) << tsstr << endColor() << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::severity:
|
case VerbositySpec::Info::severity:
|
||||||
fColorOut << "[" << ColoredSeverityWriter(fMetaData.severity) << "]";
|
fColorOut << "[" << ColoredSeverityWriter(fMetaData.severity) << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::file_line_function:
|
case VerbositySpec::Info::file_line_function:
|
||||||
fColorOut << "[" << ColorOut(Color::fgBlue, fMetaData.file) << ":"
|
fColorOut << "[" << ColorOut(Color::fgBlue, fMetaData.file) << ":"
|
||||||
<< ColorOut(Color::fgYellow, fMetaData.line) << ":"
|
<< ColorOut(Color::fgYellow, fMetaData.line) << ":"
|
||||||
<< ColorOut(Color::fgBlue, fMetaData.func) << "]";
|
<< ColorOut(Color::fgBlue, fMetaData.func) << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::file_line:
|
case VerbositySpec::Info::file_line:
|
||||||
fColorOut << "[" << ColorOut(Color::fgBlue, fMetaData.file) << ":"
|
fColorOut << "[" << ColorOut(Color::fgBlue, fMetaData.file) << ":"
|
||||||
<< ColorOut(Color::fgYellow, fMetaData.line) << "]";
|
<< ColorOut(Color::fgYellow, fMetaData.line) << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
case VerbositySpec::Info::file:
|
case VerbositySpec::Info::file:
|
||||||
fColorOut << "[" << ColorOut(Color::fgBlue, fMetaData.file) << "]";
|
fColorOut << "[" << ColorOut(Color::fgBlue, fMetaData.file) << "]";
|
||||||
appendSpace = true;
|
appendSpace = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -639,6 +648,11 @@ Logger& Logger::operator<<(ostream& (*manip) (ostream&))
|
||||||
|
|
||||||
Logger::~Logger() noexcept(false)
|
Logger::~Logger() noexcept(false)
|
||||||
{
|
{
|
||||||
|
if (fIsDestructed) {
|
||||||
|
printf("post-static destruction output: %s\n", fContent.str().c_str());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (auto& it : fCustomSinks) {
|
for (auto& it : fCustomSinks) {
|
||||||
if (LoggingCustom(it.second.first)) {
|
if (LoggingCustom(it.second.first)) {
|
||||||
lock_guard<mutex> lock(fMtx);
|
lock_guard<mutex> lock(fMtx);
|
||||||
|
|
|
@ -335,6 +335,10 @@ class Logger
|
||||||
|
|
||||||
virtual ~Logger() noexcept(false);
|
virtual ~Logger() noexcept(false);
|
||||||
|
|
||||||
|
// protection for use after static destruction took place
|
||||||
|
static bool fIsDestructed;
|
||||||
|
static struct DestructionHelper { ~DestructionHelper() { Logger::fIsDestructed = true; }} fDestructionHelper;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LogMetaData fMetaData;
|
LogMetaData fMetaData;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user