48 std::ios_base::out | std::ios_base::trunc,
false};
52 std::ios_base::out | std::ios_base::app,
false};
54 std::ios_base::out | std::ios_base::app,
false};
56 std::ios_base::out | std::ios_base::app,
false};
58 false, std::ios_base::out | std::ios_base::app,
false};
65 global_logger = logger;
69 LogFacility::_vsDebuggerPresent = IsDebuggerPresent();
76 typedef std::function<void()>
msg;
93 send( [&]() { _done =
true; } );
97 void send(
const msg& msg_ ) { _queue.push( msg_ ); }
103 _work_thread = std::thread( [&]() {
109 _queue.pop_wait( &func );
112 catch ( std::exception& msg )
114 std::cout << msg.what() << std::endl;
133 global_logger =
nullptr;
137 template <
typename Sink>
140 _worker->send( [message,
id]() {
141 std::unique_ptr<fmt::Writer> msg( message );
144 getSink<Sink>()->addMessage( msg.get(), id );
146 catch ( std::exception& msg )
148 std::cout << msg.what() << std::endl;
162 _worker->send( []() { getSink<LogSink_debuglog>()->disable(); } );
168 _worker->send( []() { getSink<LogSink_pollog>()->deinitialize_startlog(); } );
174 _worker->send( [
id]() { getSink<LogSink_flexlog>()->close(
id ); } );
181 auto promise = std::make_shared<std::promise<std::string>>();
182 auto ret = promise->get_future();
186 promise->set_value( getSink<LogSink_flexlog>()->create( logfilename, open_timestamp ) );
190 promise->set_exception( std::current_exception() );
199 auto promise = std::make_shared<std::promise<bool>>();
200 auto ret = promise->get_future();
201 _worker->send( [=]() { promise->set_value(
true ); } );
206 template <
typename Sink>
211 template <
typename Sink>
216 template <
typename Sink>
220 *
_formater << file <<
"[" << line <<
"] " <<
function <<
" : ";
223 template <
typename Sink>
225 const std::string&
function )
228 *
_formater << file <<
"[" << line <<
"] " <<
function <<
" : ";
231 template <
typename Sink>
236 if ( global_logger ==
nullptr )
245 template <
typename Sink>
250 static std::once_flag flag;
251 static Sink* sink =
new Sink();
252 std::call_once( flag, []( Sink* s ) { global_logger->
registerSink( s ); }, sink );
259 _behaviour( behaviour ),
260 _log_filename( behaviour->basename +
".log" ),
261 _active_line( false )
298 if ( open_timestamp )
304 std::chrono::system_clock::now() ) );
318 using std::chrono::system_clock;
319 std::chrono::time_point<system_clock> now = system_clock::now();
330 _active_line = ( msg->data()[msg->size() - 1] !=
'\n' );
341 std::chrono::time_point<std::chrono::system_clock>& now )
343 auto tm_now =
Clib::localtime( std::chrono::system_clock::to_time_t( now ) );
345 ( tm_now.tm_mday !=
_opened.tm_mday || tm_now.tm_mon !=
_opened.tm_mon ) )
349 strftime( buffer,
sizeof buffer,
"%Y-%m-%d", &
_opened );
370 std::cout << msg->str();
373 if (LogFacility::_vsDebuggerPresent)
374 OutputDebugString(msg->c_str());
386 std::cerr << msg->str();
389 if (LogFacility::_vsDebuggerPresent)
390 OutputDebugString(msg->c_str());
447 auto itr =
_logfiles.find( logfilename );
450 _logfiles[logfilename] = std::make_shared<LogSinkGenericFile>();
452 log->setBehaviour( &flexlogBehaviour, logfilename );
453 log->open_log_file( open_timestamp );
463 itr->second->addMessage( msg );
479 template <
typename log1,
typename log2>
484 template <
typename log1,
typename log2>
490 template <
typename log1,
typename log2>
504 #define SINK_TEMPLATE_DEFINES( sink ) \ 505 template class Pol::Clib::Logging::Message<Pol::Clib::Logging::sink>; \ 506 template Pol::Clib::Logging::sink* Pol::Clib::Logging::getSink<Pol::Clib::Logging::sink>(); \ 507 template void Pol::Clib::Logging::LogFacility::save<Pol::Clib::Logging::sink>( \ 508 fmt::Writer * message, const std::string& id ); 510 #define SINK_TEMPLATE_DEFINES_DUAL( sink1, sink2 ) \ 511 template class Pol::Clib::Logging::Message< \ 512 Pol::Clib::Logging::LogSink_dual<Pol::Clib::Logging::sink1, Pol::Clib::Logging::sink2>>; \ 513 template Pol::Clib::Logging::LogSink_dual<Pol::Clib::Logging::sink1, Pol::Clib::Logging::sink2>* \ 514 Pol::Clib::Logging::getSink< \ 515 Pol::Clib::Logging::LogSink_dual<Pol::Clib::Logging::sink1, Pol::Clib::Logging::sink2>>(); \ 516 template void Pol::Clib::Logging::LogFacility::save< \ 517 Pol::Clib::Logging::LogSink_dual<Pol::Clib::Logging::sink1, Pol::Clib::Logging::sink2>>( \ 518 fmt::Writer * message, const std::string& id ); virtual ~LogSinkGenericFile()
void initLogging(LogFacility *logger)
std::string registerFlexLogger(const std::string &logfilename, bool open_timestamp)
bool test_for_rollover(std::chrono::time_point< std::chrono::system_clock > &now)
virtual ~LogSink_flexlog()
static bool _vsDebuggerPresent
#define SINK_TEMPLATE_DEFINES(sink)
message_queue< msg > msg_queue
virtual void addMessage(fmt::Writer *msg) POL_OVERRIDE
std::map< std::string, std::shared_ptr< LogSinkGenericFile > > _logfiles
virtual void addMessage(fmt::Writer *msg) POL_OVERRIDE
std::string _log_filename
std::ofstream _filestream
void save(fmt::Writer *message, const std::string &id)
std::tm localtime(const std::time_t &t)
threadsafe version of localtime
bool LogfileTimestampEveryLine
static LogFileBehaviour pollogBehaviour
const LogFileBehaviour * _behaviour
void setBehaviour(const LogFileBehaviour *behaviour, std::string filename)
static LogFileBehaviour flexlogBehaviour
std::function< void()> msg
virtual void addMessage(fmt::Writer *msg) POL_OVERRIDE
void send(const msg &msg_)
void deinitializeStartLog()
static LogFileBehaviour debuglogBehaviour
void wait_for_empty_queue()
void deinitialize_startlog()
std::chrono::time_point< std::chrono::system_clock > _lasttimestamp
std::unique_ptr< LogWorker > _worker
std::vector< LogSink * > _registered_sinks
void registerSink(LogSink *sink)
static LogFileBehaviour scriptlogBehaviour
void closeFlexLog(const std::string &id)
void open_log_file(bool open_timestamp)
#define SINK_TEMPLATE_DEFINES_DUAL(sink1, sink2)
void close(const std::string &id)
static LogFileBehaviour startlogBehaviour
virtual void addMessage(fmt::Writer *msg) POL_OVERRIDE
std::unique_ptr< fmt::Writer > _formater
std::string create(std::string logfilename, bool open_timestamp)
static void addTimeStamp(std::ostream &stream)
static LogFileBehaviour leaklogBehaviour
virtual void addMessage(fmt::Writer *msg) POL_OVERRIDE
bool run(int argc, char **argv)
virtual void addMessage(fmt::Writer *msg) POL_OVERRIDE
std::ios_base::openmode openmode
LogFacility * global_logger