Добавил возможность логирования в файл
This commit is contained in:
parent
f6a6737b99
commit
9111a93ec7
@ -4,26 +4,31 @@
|
||||
#include "log_queue.h"
|
||||
|
||||
#include <sstream>
|
||||
#include <fstream>
|
||||
#include <stdexcept>
|
||||
#include <iostream>
|
||||
#include <atomic>
|
||||
#include <functional>
|
||||
#include <ctime>
|
||||
|
||||
enum class log_type
|
||||
{
|
||||
std_output,
|
||||
file
|
||||
};
|
||||
|
||||
class logger
|
||||
{
|
||||
private:
|
||||
std::atomic<bool> _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<Args...>, 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<typename... Args> 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<typename T, typename... Args> void form_log_line(const char* s, const T& value, const Args&... args)
|
||||
|
||||
@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
Loading…
Reference in New Issue
Block a user