#pragma once
#include "SDKDefine.h"
#include "AX_Mutex.h"
//////////////////////////////////////////////////////////////////////////
enum LogLevel
{
LogLevel_All,
LogLevel_Debug,
LogLevel_Info,
LogLevel_Warn,
LogLevel_Error,
LogLevel_Fatal,
LogLevel_Off
};
extern char* strLogLevel[];
class Logger
{
DECLARE_SINGLETON(Logger);
public:
void SetMinLevel(LogLevel minLevel);
LogLevel GetMinLevel() const;
void SetLogInfo(LogLevel level, char* file, int line);
virtual void WriteLog(const char* format, ...);
private:
Logger();
LogLevel m_minLevel;//日志级别开关, 表示高于此级别的日志才允许被记录
//临时信息
char* m_file;
int m_line;
LogLevel m_level;
AX_Mutex m_mutex;
};
//////////////////////////////////////////////////////////////////////////
#define LOG_SET_LEVEL(minLevel) Logger::Instance()->SetMinLevel(minLevel)
#define LOG_GET_LEVEL Logger::Instance()->GetMinLevel()
#define LOG_RELEASE Logger::Release()
#define LOG_DEBUG Logger::Instance()->SetLogInfo(LogLevel_Debug, __FILE__, __LINE__); Logger::Instance()->WriteLog
#define LOG_INFO Logger::Instance()->SetLogInfo(LogLevel_Info, __FILE__, __LINE__); Logger::Instance()->WriteLog
#define LOG_WARN Logger::Instance()->SetLogInfo(LogLevel_Warn, __FILE__, __LINE__); Logger::Instance()->WriteLog
#define LOG_ERROR Logger::Instance()->SetLogInfo(LogLevel_Error, __FILE__, __LINE__); Logger::Instance()->WriteLog
#define LOG_FATAL Logger::Instance()->SetLogInfo(LogLevel_Fatal, __FILE__, __LINE__); Logger::Instance()->WriteLog
/////////////////////////////////////////////////////////
//cpp
#include "Logger.h"
#include <stdio.h>
#include <time.h>
#include <stdarg.h>
char* strLogLevel[] =
{
"All",
"Debug",
"Info",
"Warn",
"Error",
"Fatal",
"Off"
};
IMPLEMENT_SINGLETON(Logger);
Logger::Logger() : m_minLevel(LogLevel_All)
{
}
void Logger::SetMinLevel( LogLevel minLevel )
{
m_minLevel = minLevel;
}
LogLevel Logger::GetMinLevel() const
{
return m_minLevel;
}
void Logger::SetLogInfo( LogLevel level, char* file, int line )
{
m_mutex.acquire();
m_level = level;
m_file = file;
m_line = line;
}
void Logger::WriteLog( const char* format, ... )
{
if (m_level >= m_minLevel)
{
fprintf(stderr, "\n==================Log Begin====================\n");
char str[30];
time_t now = time(NULL);
struct tm datetime = {0};
localtime_s(&datetime, &now);
_snprintf_s(str, 30, 30, "%d-%02d-%02d %02d:%02d:%02d",datetime.tm_year+1900,datetime.tm_mon+1,datetime.tm_mday,datetime.tm_hour,datetime.tm_min,datetime.tm_sec);
fprintf(stderr, "%s %d \n%s [%s]\n", m_file, m_line, str, strLogLevel[m_level]);
va_list argp;
va_start(argp, format);
vfprintf (stderr, format, argp);
va_end(argp);
fprintf(stderr, "\n------------------Log End----------------------\n");
}
m_mutex.release();
}
原文链接: https://www.cnblogs.com/joeguo/archive/2010/09/03/1889241.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14635
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!