diff --git a/tracker/code/main/async_log_t.h b/tracker/code/main/async_log_t.h new file mode 100644 index 0000000..0657821 --- /dev/null +++ b/tracker/code/main/async_log_t.h @@ -0,0 +1,99 @@ +#pragma once + +#include +#include +#include +#include +#include +#include +#include +#include + +class async_log_t +{ +private: + using logs_t = std::map< std::string, std::vector >; + logs_t logs_; + std::mutex mtx_; + std::string base_dir_{"./"}; + +public: + bool log(const std::string& fname, const std::string& msg) + { + std::lock_guard _lock(mtx_); + auto log_stream = logs_.find(fname); + if(log_stream == logs_.end()) { + bool insert_ok = false; + std::tie(log_stream, insert_ok) = logs_.emplace( std::make_pair(fname, std::vector()) ); + if(!insert_ok) + return false; + } + log_stream->second.push_back(msg); + return true; + } + + void save(void) + { + logs_t logs_to_save; + + { + std::lock_guard _lock(mtx_); + logs_to_save.swap(logs_); + } + + for(const auto& log_file_iter : logs_to_save) { + std::ofstream of; + of.open( base_dir_ + "/" + log_file_iter.first, std::ofstream::app ); + if(of) { + for(const auto& msg : log_file_iter.second) + of< threads; + + threads.emplace_back( std::thread( [&log_producer](){log_producer("fileA.log");} ) ); + threads.emplace_back( std::thread( [&log_producer](){log_producer("fileB.log");} ) ); + threads.emplace_back( std::thread( [&log_producer](){log_producer("fileC.log");} ) ); + threads.emplace_back( std::thread(log_saver) ); + + for(auto& t : threads) + if( t.joinable() ) + t.join(); + + logs.save(); // last save + +} +*/ \ No newline at end of file