Добавил вывод времени и log_level

This commit is contained in:
selim 2014-09-11 08:14:27 +04:00
parent 160a1365f3
commit 973d32f484
3 changed files with 50 additions and 24 deletions

View File

@ -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) template<typename... Args> void log_warning(const char* s, const Args&... args)
{ {
const std::function<void()>& func = std::bind(&logger::log_impl<Args...>, this, s, args...); log("warning", s, args...);
_queue.add_log(func); }
}
} 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++;
} }

View File

@ -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>

View File

@ -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;
} }