From 9111a93ec73bfb721a09d5c9e1d1dd30ed8d85cb Mon Sep 17 00:00:00 2001 From: selim Date: Sun, 14 Sep 2014 10:05:10 +0400 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D0=B2=D0=BE=D0=B7=D0=BC=D0=BE=D0=B6=D0=BD=D0=BE=D1=81=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BB=D0=BE=D0=B3=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=B2=20=D1=84=D0=B0=D0=B9=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/logger.h | 59 +++++++++++++++++++++++++++++------------------- src/logger.cpp | 6 ++++- test/main.cpp | 9 ++++---- 3 files changed, 45 insertions(+), 29 deletions(-) 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; }