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