From 3d36ffeb40d8c40bdaca24e9558b99137f0ddf1c Mon Sep 17 00:00:00 2001 From: Alexey Rybalchenko Date: Tue, 20 Aug 2019 17:29:50 +0200 Subject: [PATCH] Use fmt::localtime instead of std one for thread safety --- logger/Logger.cxx | 39 +++++++++++++++------------------------ test/loggerTest.cxx | 7 +++---- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/logger/Logger.cxx b/logger/Logger.cxx index 73527fa..05f1337 100644 --- a/logger/Logger.cxx +++ b/logger/Logger.cxx @@ -7,9 +7,9 @@ ********************************************************************************/ #include "Logger.h" +#include + #include // printf -#include // strftime -#include // setw, setfill #include using namespace std; @@ -172,15 +172,15 @@ const array Logger::fVerbosityNames = map Logger::fVerbosities = { - { Verbosity::verylow, VerbositySpec::Make() }, - { Verbosity::low, VerbositySpec::Make(VerbositySpec::Info::severity) }, - { Verbosity::medium, VerbositySpec::Make(VerbositySpec::Info::timestamp_s, VerbositySpec::Info::severity) }, - { Verbosity::high, VerbositySpec::Make(VerbositySpec::Info::process_name, VerbositySpec::Info::timestamp_s, VerbositySpec::Info::severity) }, - { Verbosity::veryhigh, VerbositySpec::Make(VerbositySpec::Info::process_name, VerbositySpec::Info::timestamp_s, VerbositySpec::Info::severity, VerbositySpec::Info::file_line_function) }, - { Verbosity::user1, VerbositySpec::Make(VerbositySpec::Info::severity) }, - { Verbosity::user2, VerbositySpec::Make(VerbositySpec::Info::severity) }, - { Verbosity::user3, VerbositySpec::Make(VerbositySpec::Info::severity) }, - { Verbosity::user4, VerbositySpec::Make(VerbositySpec::Info::severity) } + { Verbosity::verylow, VerbositySpec::Make() }, + { Verbosity::low, VerbositySpec::Make(VerbositySpec::Info::severity) }, + { Verbosity::medium, VerbositySpec::Make(VerbositySpec::Info::timestamp_s, VerbositySpec::Info::severity) }, + { Verbosity::high, VerbositySpec::Make(VerbositySpec::Info::process_name, VerbositySpec::Info::timestamp_s, VerbositySpec::Info::severity) }, + { Verbosity::veryhigh, VerbositySpec::Make(VerbositySpec::Info::process_name, VerbositySpec::Info::timestamp_us, VerbositySpec::Info::severity, VerbositySpec::Info::file_line_function) }, + { Verbosity::user1, VerbositySpec::Make(VerbositySpec::Info::severity) }, + { Verbosity::user2, VerbositySpec::Make(VerbositySpec::Info::severity) }, + { Verbosity::user3, VerbositySpec::Make(VerbositySpec::Info::severity) }, + { Verbosity::user4, VerbositySpec::Make(VerbositySpec::Info::severity) } }; string Logger::SeverityName(Severity severity) @@ -212,14 +212,6 @@ Logger::Logger(Severity severity, Verbosity verbosity, const string& file, const fMetaData.severity_name = fSeverityNames.at(static_cast(severity)); fMetaData.severity = severity; - char tsstr[32]; - { - lock_guard lock(fMtx); // localtime is not threadsafe, guard it - if (!strftime(tsstr, sizeof(tsstr), "%H:%M:%S", localtime(&(fMetaData.timestamp)))) { - tsstr[0] = 'u'; - } - } - auto spec = fVerbosities[verbosity]; if ((!fColored && LoggingToConsole()) || LoggingToFile()) { @@ -231,11 +223,11 @@ Logger::Logger(Severity severity, Verbosity verbosity, const string& file, const appendSpace = true; break; case VerbositySpec::Info::timestamp_us: - fBWOut << "[" << tsstr << "." << setw(6) << setfill('0') << fMetaData.us.count() << "]"; + fBWOut << fmt::format("[{:%H:%M:%S}.{:06}]", fmt::localtime(fMetaData.timestamp), fMetaData.us.count()); appendSpace = true; break; case VerbositySpec::Info::timestamp_s: - fBWOut << "[" << tsstr << "]"; + fBWOut << fmt::format("[{:%H:%M:%S}]", fmt::localtime(fMetaData.timestamp)); appendSpace = true; break; case VerbositySpec::Info::severity: @@ -273,12 +265,11 @@ Logger::Logger(Severity severity, Verbosity verbosity, const string& file, const appendSpace = true; break; case VerbositySpec::Info::timestamp_us: - fColorOut << "[" << startColor(Color::fgCyan) << tsstr << "." - << setw(6) << setfill('0') << fMetaData.us.count() << endColor() << "]"; + fColorOut << fmt::format("[{}{:%H:%M:%S}.{:06}{}]", startColor(Color::fgCyan), fmt::localtime(fMetaData.timestamp), fMetaData.us.count(), endColor()); appendSpace = true; break; case VerbositySpec::Info::timestamp_s: - fColorOut << "[" << startColor(Color::fgCyan) << tsstr << endColor() << "]"; + fColorOut << fmt::format("[{}{:%H:%M:%S}{}]", startColor(Color::fgCyan), fmt::localtime(fMetaData.timestamp), endColor()); appendSpace = true; break; case VerbositySpec::Info::severity: diff --git a/test/loggerTest.cxx b/test/loggerTest.cxx index e0ccfa1..50ee1c1 100644 --- a/test/loggerTest.cxx +++ b/test/loggerTest.cxx @@ -134,8 +134,7 @@ int main() cout << "cout: is logging fatal: " << fair::Logger::Logging(Severity::fatal) << endl; cout << "cout: is logging nolog: " << fair::Logger::Logging(Severity::nolog) << endl; - for (int i = 0; i < 1000000; ++i) - { + for (int i = 0; i < 1000000; ++i) { silentlyPrintAllVerbositiesWithSeverity(Severity::nolog); } cout << endl; @@ -198,8 +197,8 @@ int main() LOGF(info, "Hello {} {}!", "world", ":-)"); LOGP(info, "Hello %s %s!", "world", ":-)"); - cout << "cout: setting verbosity to 'veryhigh'" << endl; - Logger::SetVerbosity(Verbosity::veryhigh); + cout << "cout: setting verbosity to 'high'" << endl; + Logger::SetVerbosity(Verbosity::high); LOGV(info, verylow) << "I should be printed with very low verbosity";