Добавил вывод времени и log_level
This commit is contained in:
parent
160a1365f3
commit
973d32f484
@ -8,6 +8,7 @@
|
|||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <atomic>
|
#include <atomic>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <ctime>
|
||||||
|
|
||||||
class logger
|
class logger
|
||||||
{
|
{
|
||||||
@ -16,40 +17,68 @@ private:
|
|||||||
std::stringstream _logLine;
|
std::stringstream _logLine;
|
||||||
log_queue _queue;
|
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;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
logger();
|
logger();
|
||||||
|
|
||||||
void set_enabled(bool enabled);
|
void set_enabled(bool enabled);
|
||||||
|
|
||||||
template<typename... Args> void log(const char* s, const Args&... args)
|
template<typename... Args> void log_info(const char* s, const Args&... args)
|
||||||
{
|
{
|
||||||
//const long time = std::chrono::high_resolution_clock::now().time_since_epoch().count();
|
log("info", s, args...);
|
||||||
|
|
||||||
if(_enabled)
|
|
||||||
{
|
|
||||||
const std::function<void()>& func = std::bind(&logger::log_impl<Args...>, this, s, args...);
|
|
||||||
_queue.add_log(func);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<typename... Args> void log_warning(const char* s, const Args&... args)
|
||||||
|
{
|
||||||
|
log("warning", s, args...);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename... Args> void log_error(const char* s, const Args&... args)
|
||||||
|
{
|
||||||
|
log("error", s, args...);
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
template<typename... Args> void log_impl(const char* s, const Args&... args)
|
template<typename... Args> void log(const char* log_level, const char* s, const Args&... args)
|
||||||
{
|
{
|
||||||
_logLine.str("");
|
if (_enabled)
|
||||||
log_internal(s, args...);
|
{
|
||||||
|
_queue.add_log(std::bind(&logger::log_impl<Args...>, this, s, args..., sys_clock::now(), hr_clock::now(), log_level));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void log_internal(const char* s);
|
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() << "] ";
|
||||||
|
|
||||||
template<typename T, typename... Args> void log_internal(const char* s, const T& value, const Args&... args)
|
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)
|
||||||
{
|
{
|
||||||
while (*s)
|
while (*s)
|
||||||
{
|
{
|
||||||
if (*s == '%' && *++s != '%')
|
if (*s == '%' && *++s != '%')
|
||||||
{
|
{
|
||||||
_logLine << value;
|
_logLine << value;
|
||||||
return log_internal(s, args...);
|
return form_log_line(s, args...);
|
||||||
}
|
}
|
||||||
_logLine << *s++;
|
_logLine << *s++;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -51,7 +51,7 @@
|
|||||||
</PrecompiledHeader>
|
</PrecompiledHeader>
|
||||||
<WarningLevel>Level3</WarningLevel>
|
<WarningLevel>Level3</WarningLevel>
|
||||||
<Optimization>Disabled</Optimization>
|
<Optimization>Disabled</Optimization>
|
||||||
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)\gtest\include;$(SolutionDir)\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)\gtest\include;$(SolutionDir)\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
@ -69,7 +69,7 @@
|
|||||||
<Optimization>MaxSpeed</Optimization>
|
<Optimization>MaxSpeed</Optimization>
|
||||||
<FunctionLevelLinking>true</FunctionLevelLinking>
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
<IntrinsicFunctions>true</IntrinsicFunctions>
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
<AdditionalIncludeDirectories>$(SolutionDir)\gtest\include;$(SolutionDir)\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
<AdditionalIncludeDirectories>$(SolutionDir)\gtest\include;$(SolutionDir)\..\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
<Link>
|
<Link>
|
||||||
|
|||||||
@ -13,7 +13,7 @@ void logger::set_enabled(bool enabled)
|
|||||||
_enabled = enabled;
|
_enabled = enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
void logger::log_internal(const char *s)
|
void logger::form_log_line(const char *s)
|
||||||
{
|
{
|
||||||
while (*s)
|
while (*s)
|
||||||
{
|
{
|
||||||
@ -21,8 +21,5 @@ void logger::log_internal(const char *s)
|
|||||||
throw std::runtime_error("invalid format string: missing arguments");
|
throw std::runtime_error("invalid format string: missing arguments");
|
||||||
_logLine << *s++;
|
_logLine << *s++;
|
||||||
}
|
}
|
||||||
|
|
||||||
// actually logging
|
|
||||||
std::cout << _logLine.str() << std::endl;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user