分享
 
 
 

简单易用的日志类(C++, BC, VC, 多线程) 可按日期生成多个日志, 还可分年月日频率生成文件名

王朝c/c++·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

/*

Log File Library(WIN98/NT/2000)

Compile by: BC++ 5; C++ BUILDER; VC++; VC.NET;

copyright(c) 2004.5 - 2005.3 llbird wushaojian@21cn.com http://blog.csdn.net/wujian53

*/

/*

Use:

//这个代码我用工业现场24X7值守的程序纪录各种信息, 简单易用;

//一般用一个全局日志对象, 有临界排斥可以多线程安全使用。

//有两个类

class LogFile;//用户定义日志文件名

class LogFileEx;//有日志文件名自动生成功能 , 可分年月日频率生成文件名, 可指定日志存放的目录

LogFile gLog("My.Log");

gLog.Log("test", 4);//记录日志

gLog.Log("系统启动");

LogFileEx gLog(".", LogFileEx :: YEAR);//一年生成一个日志文件

LogFileEx gLog(".\\Log", LogFileEx :: MONTH);//一月生成一个日志文件

LogFileEx gLog(".\\Log", LogFileEx :: DAY);//一天生成一个日志文件

//注意日志所属目录创建失败会自动退出, 请注意目录的合法性, 文件生成频率看情况掌握

//24小时运行的程序可以每天生成一个日志文件, 以免内容过多

*/

#ifndef _LOGFILE_H

#define _LOGFILE_H

#include <assert.h>

#include <time.h>

#include <stdio.h>

#include <windows.h>

class LogFile

{

protected:

CRITICAL_SECTION _csLock;

char * _szFileName;

HANDLE _hFile;

bool OpenFile()//打开文件, 指针到文件尾

{

if(IsOpen())

return true;

if(!_szFileName)

return false;

_hFile = CreateFile(

_szFileName,

GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE,

NULL,

OPEN_EXISTING,

FILE_ATTRIBUTE_NORMAL,

NULL

);

if(!IsOpen() && GetLastError() == 2)//打开不成功, 且因为文件不存在, 创建文件

_hFile = CreateFile(

_szFileName,

GENERIC_WRITE,

FILE_SHARE_READ | FILE_SHARE_WRITE,

NULL,

OPEN_ALWAYS,

FILE_ATTRIBUTE_NORMAL,

NULL

);

if(IsOpen())

SetFilePointer(_hFile, 0, NULL, FILE_END);

return IsOpen();

}

DWORD Write(LPCVOID lpBuffer, DWORD dwLength)

{

DWORD dwWriteLength = 0;

if(IsOpen())

WriteFile(_hFile, lpBuffer, dwLength, &dwWriteLength, NULL);

return dwWriteLength;

}

virtual void WriteLog( LPCVOID lpBuffer, DWORD dwLength)//写日志, 可以扩展修改

{

time_t now;

char temp[21];

DWORD dwWriteLength;

if(IsOpen())

{

time(&now);

strftime(temp, 20, "%Y-%m-%d %H:%M:%S", localtime(&now));

WriteFile(_hFile, "\xd\xa#-----------------------------", 32, &dwWriteLength, NULL);

WriteFile(_hFile, temp, 19, &dwWriteLength, NULL);

WriteFile(_hFile, "-----------------------------#\xd\xa", 32, &dwWriteLength, NULL);

WriteFile(_hFile, lpBuffer, dwLength, &dwWriteLength, NULL);

WriteFile(_hFile, "\xd\xa", 2, &dwWriteLength, NULL);

FlushFileBuffers(_hFile);

}

}

void Lock() { ::EnterCriticalSection(&_csLock); }

void Unlock() { ::LeaveCriticalSection(&_csLock); }

public:

LogFile(const char *szFileName = "Log.log")//设定日志文件名

{

_szFileName = NULL;

_hFile = INVALID_HANDLE_VALUE;

::InitializeCriticalSection(&_csLock);

SetFileName(szFileName);

}

virtual ~LogFile()

{

::DeleteCriticalSection(&_csLock);

Close();

if(_szFileName)

delete []_szFileName;

}

const char * GetFileName()

{

return _szFileName;

}

void SetFileName(const char *szName)//修改文件名, 同时关闭上一个日志文件

{

assert(szName);

if(_szFileName)

delete []_szFileName;

Close();

_szFileName = new char[strlen(szName) + 1];

assert(_szFileName);

strcpy(_szFileName, szName);

}

bool IsOpen()

{

return _hFile != INVALID_HANDLE_VALUE;

}

void Close()

{

if(IsOpen())

{

CloseHandle(_hFile);

_hFile = INVALID_HANDLE_VALUE;

}

}

void Log(LPCVOID lpBuffer, DWORD dwLength)//追加日志内容

{

assert(lpBuffer);

__try

{

Lock();

if(!OpenFile())

return;

WriteLog(lpBuffer, dwLength);

}

__finally

{

Unlock();

}

}

void Log(const char *szText)

{

Log(szText, strlen(szText));

}

private://屏蔽函数

LogFile(const LogFile&);

LogFile&operator = (const LogFile&);

};

class LogFileEx : public LogFile

{

protected:

char *_szPath;

char _szLastDate[9];

int _iType;

void SetPath(const char *szPath)

{

assert(szPath);

WIN32_FIND_DATA wfd;

char temp[MAX_PATH + 1] = {0};

if(FindFirstFile(szPath, &wfd) == INVALID_HANDLE_VALUE && CreateDirectory(szPath, NULL) == 0)

{

strcat(strcpy(temp, szPath), " Create Fail. Exit Now! Error ID :");

ltoa(GetLastError(), temp + strlen(temp), 10);

MessageBox(NULL, temp, "Class LogFileEx", MB_OK);

exit(1);

}

else

{

GetFullPathName(szPath, MAX_PATH, temp, NULL);

_szPath = new char[strlen(temp) + 1];

assert(_szPath);

strcpy(_szPath, temp);

}

}

public:

enum LOG_TYPE{YEAR = 0, MONTH = 1, DAY = 2};

LogFileEx(const char *szPath = ".", LOG_TYPE iType = MONTH)

{

_szPath = NULL;

SetPath(szPath);

_iType = iType;

memset(_szLastDate, 0, 9);

}

~LogFileEx()

{

if(_szPath)

delete []_szPath;

}

const char * GetPath()

{

return _szPath;

}

void Log(LPCVOID lpBuffer, DWORD dwLength)

{

assert(lpBuffer);

char temp[10];

static const char format[3][10] = {"%Y", "%Y-%m", "%Y%m%d"};

__try

{

Lock();

time_t now = time(NULL);

strftime(temp, 9, format[_iType], localtime(&now));

if(strcmp(_szLastDate, temp) != 0)//更换文件名

{

strcat(strcpy(_szFileName, _szPath), "\\");

strcat(strcat(_szFileName, temp), ".log");

strcpy(_szLastDate, temp);

Close();

}

if(!OpenFile())

return;

WriteLog(lpBuffer, dwLength);

}

__finally

{

Unlock();

}

}

void Log(const char *szText)

{

Log(szText, strlen(szText));

}

private://屏蔽函数

LogFileEx(const LogFileEx&);

LogFileEx&operator = (const LogFileEx&);

};

#endif

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有