diff --git a/include/logger.h b/include/logger.h index e406137..1864a67 100644 --- a/include/logger.h +++ b/include/logger.h @@ -4,26 +4,31 @@ #include "log_queue.h" #include +#include #include #include #include #include #include +enum class log_type +{ + std_output, + file +}; + class logger { private: std::atomic _enabled; std::stringstream _logLine; + std::ofstream _outFile; log_queue _queue; - - typedef std::chrono::high_resolution_clock hr_clock; - typedef std::chrono::system_clock sys_clock; - typedef std::chrono::system_clock::time_point sys_tp; - typedef std::chrono::high_resolution_clock::time_point hr_tp; + log_type _type; public: logger(); + logger(std::string path); void set_enabled(bool enabled); @@ -48,27 +53,35 @@ private: { if (_enabled) { - _queue.add_log(std::bind(&logger::log_impl, this, s, args..., sys_clock::now(), hr_clock::now(), log_level)); + auto hrc = std::chrono::high_resolution_clock::now(); + auto sc = std::chrono::system_clock::now(); + + _queue.add_log([this, s, args..., sc, hrc, log_level]{ + _logLine.str(""); + //_logLine << "[" << hrc.time_since_epoch().count() << "] "; + + char tm_buffer[50]; + std::time_t tm = std::chrono::system_clock::to_time_t(sc); + std::strftime(tm_buffer, 50, "%F %T", std::localtime(&tm)); + _logLine << "[" << tm_buffer << "] "; + + _logLine << "[" << log_level << "] "; + + form_log_line(s, args...); + + switch(_type) + { + case log_type::std_output: + std::cout << _logLine.str() << std::endl; + break; + case log_type::file: + _outFile << _logLine.str() << std::endl; + break; + } + }); } } - template void log_impl(const char* s, const Args&... args, sys_tp sc, hr_tp hrc, const char* log_level) - { - _logLine.str(""); - //_logLine << "[" << hrc.time_since_epoch().count() << "] "; - - char tm_buffer[50]; - std::time_t tm = std::chrono::system_clock::to_time_t(sc); - std::strftime(tm_buffer, 50, "%F %T", std::localtime(&tm)); - _logLine << "[" << tm_buffer << "] "; - - _logLine << "[" << log_level << "] "; - - form_log_line(s, args...); - - std::cout << _logLine.str() << std::endl; - } - void form_log_line(const char* s); template void form_log_line(const char* s, const T& value, const Args&... args) diff --git a/src/logger.cpp b/src/logger.cpp index 3b45abd..0aaa767 100644 --- a/src/logger.cpp +++ b/src/logger.cpp @@ -4,7 +4,11 @@ logger ulog; -logger::logger(): _enabled(true) +logger::logger(): _enabled(true), _type(log_type::std_output) +{ +} + +logger::logger(std::string path): _enabled(true), _outFile(path), _type(log_type::file) { } diff --git a/test/main.cpp b/test/main.cpp index c63d5ac..8b2b777 100755 --- a/test/main.cpp +++ b/test/main.cpp @@ -561,11 +561,13 @@ TEST(Ustring, replace_string) EXPECT_TRUE(str2 == "33 hello 33 world 33 more 33 and 33 more 33"); } +//logger flog("test.log"); + void func(std::size_t n) { for(std::size_t j = 0; j < 100; ++j) { - ulog.log_info("thread %, line %", n, j); + ulog.log_info("thread %, line %", n, j); } std::cout << "end of thread " << n << std::endl; @@ -594,9 +596,6 @@ int main(int argc, char **argv) for(std::size_t i = 0; i < threadsCount; ++i) threads[i].join(); - - int n = 0; - std::cin >> n; - return 0; + return 0; }