日志记录c++代码

linux 下日志保存c++代码(已测试可用):
log.cpp

#include "log.h"

#include <iostream>
#include <io.h>
#include <time.h>
#include <sys\stat.h>
#include <direct.h>

CLog* CLog::m_Instace = NULL;

#define SUCCESS 0
int LogMsg(unsigned long uLogType, const char* pszFormat, ...)
{
	const int size = 1024 * 45;
	char buf[size] = { 0 };
	va_list args;
	va_start(args, pszFormat);
	vsprintf(buf, pszFormat, args);
	va_end(args);

	CLog::Instance()->LogMsg(uLogType, buf);

	return SUCCESS;
}

CLog::CLog()
{
	setlocale(LC_ALL, "Chinese-simplified");
	InitializeCriticalSection(&m_csFileLock);

	m_maxLogSize = 1 * 1024 * 1024;

	open();

	int logLevel = 1;
	SetLevel(logLevel);

}

CLog* CLog::Instance()
{
	if (m_Instace == NULL)
	{
		m_Instace = new CLog();
	}
	return m_Instace;
}


CLog::~CLog(void)
{
	DeleteCriticalSection(&m_csFileLock);
}

int CLog::LogMsg(unsigned long uLogType, const char* pszFormat/*, ...*/)
{
	if (uLogType < m_uLevel)
	{
		return FALSE;
	}

	EnterCriticalSection(&m_csFileLock);

	//m_log_file = fopen(m_logFilePath.c_str()/*m_szFileName*/, "a+");

	if (m_log_file)
	{
		char szLogType[20] = { 0 };

		WORD wAttr = 0;
		switch (uLogType)
		{
		case LOG_DEBUG:
			strcpy(szLogType, "调试");
			wAttr = FOREGROUND_GREEN;
			break;
		case LOG_INFO:
			strcpy(szLogType, "信息");
			wAttr = FOREGROUND_GREEN | FOREGROUND_INTENSITY;
			break;
		case LOG_PERF:
			strcpy(szLogType, "性能");
			wAttr = FOREGROUND_INTENSITY | FOREGROUND_GREEN | FOREGROUND_BLUE;
			break;
		case LOG_WARNING:
			strcpy(szLogType, "警告");
			wAttr = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY;
			break;
		case LOG_ERROR:
			strcpy(szLogType, "错误");
			wAttr = FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_INTENSITY;
			break;
		case LOG_FATAL:
			strcpy(szLogType, "致命");
			wAttr = FOREGROUND_RED | FOREGROUND_INTENSITY;
			break;
		case LOG_USER:
			strcpy(szLogType, "用户");
			wAttr = FOREGROUND_INTENSITY | FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE;
			break;
		default:
			strcpy(szLogType, "其他");
			wAttr = -1;
			break;
		}

		//set color
		CONSOLE_SCREEN_BUFFER_INFO csbiInfo;
		GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbiInfo);
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wAttr);

		int day = -1;
		__try
		{
			//log time
			SYSTEMTIME st = { 0 };
			GetLocalTime(&st);
			DWORD dwId = GetCurrentThreadId();
			fprintf(m_log_file, "%04d/%02d/%02d %02d:%02d:%02d %03d [%s][%d] ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, szLogType, dwId);

			fprintf(m_log_file, pszFormat);
			fprintf(m_log_file, "\n");

			printf("%04d/%02d/%02d %02d:%02d:%02d %03d [%s][%d]%s.\n", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, szLogType, dwId, pszFormat);

			day = st.wDay;

		}
		__except (EXCEPTION_EXECUTE_HANDLER)
		{
			fclose(m_log_file);

			LeaveCriticalSection(&m_csFileLock);

			return FALSE;
		}

		//reset color
		SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), csbiInfo.wAttributes);

		fflush(m_log_file);

		bool bToday = isToday(day);
		if (!bToday)
		{
			close();

			open();
		}
	}

	LeaveCriticalSection(&m_csFileLock);

	return TRUE;
}

bool CLog::open()
{
	time_t t = time(NULL);
	tm* tt = localtime(&t);
	char tdata[32] = { 0 };
	sprintf(tdata, "%4d%02d%02d", tt->tm_year + 1900, tt->tm_mon + 1, tt->tm_mday);

	m_day = tt->tm_mday;

	string file = "ath.log";
	//string file = "D:\\face_for_atm.log";
	m_logFilePath = file;

	//if (_access(dir.c_str(), 0) == -1)
	//{
	//	int flag = _mkdir(dir.c_str());
	//		
	//	if (flag == 0)
	//	{
	//	}
	//	else
	//	{
	//		return false;
	//	}
	//}


	m_log_file = fopen(m_logFilePath.c_str()/*m_szFileName*/, "a+");

	if (m_log_file)
	{
		return true;
	}

	return false;
}

bool CLog::close()
{
	if (m_log_file != NULL)
	{
		fclose(m_log_file);
		m_log_file = NULL;
	}
	return true;
}

long CLog::getFileSize()
{
	if (m_log_file == NULL)
	{
		return 0;
	}

	fseek(m_log_file, 0, SEEK_END);
	long size = ftell(m_log_file);

	return size;
}

bool CLog::checkLogSize()
{
	int size = getFileSize();
	if (size > m_maxLogSize)
	{
		return true;
	}
	return false;
}

bool CLog::isToday(int curDay)
{
	if (curDay == m_day)
	{
		return true;
	}

	m_day = curDay;
	return false;
}

log.h

#ifndef _LOG_H_
#define _LOG_H_

#include <Windows.h>
#include <string>

#define LOG_DEBUG     0x00000001     //信息日志
#define LOG_INFO      0x00000002     //调试
#define LOG_PERF      0x00000003     //性能
#define LOG_WARNING   0x00000004     //告警
#define LOG_ERROR     0x00000005     //错误
#define LOG_FATAL     0x00000006     //致命
#define LOG_USER      0x00000007     //用户自定义
#define LOG_ALL       0x00000008     //全部

using namespace std;
class CLog
{
public:
	CLog();
	~CLog(void);

	static CLog* Instance();

	void SetLevel(unsigned long nLevel){ m_uLevel = nLevel; };
	int LogMsg(unsigned long uLogType, const char* pszFormat/*, ...*/);

//#define Log(t,f,...) g_Log.LogMsg(t,f,__VA_ARGS__)

	static CLog* m_Instace;

	bool checkLogSize();
	long getFileSize();
	bool isToday(int curDay);

	bool open();
	bool close();

protected:
	unsigned long m_uLevel = 0x00000008;
	CRITICAL_SECTION m_csFileLock;
	//char m_szFileName[MAX_PATH];
	string m_logFilePath;
	FILE *m_log_file;

	int m_day;
	int m_maxLogSize;
};

int LogMsg(unsigned long uLogType, const char* pszFormat, ...);

#define Log(t,f,...) LogMsg(t,f,__VA_ARGS__)

#endif
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值