• C++ 日志类


    #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));
    			char * pTime="Time:";
    			char * pEvent=" Event:";
    			char * pEnd="
    ";
    			WriteFile(_hFile, pTime, strlen(pTime), &dwWriteLength, NULL);
    			WriteFile(_hFile, temp, strlen(temp), &dwWriteLength, NULL);
    			WriteFile(_hFile, pEvent, strlen(pEvent), &dwWriteLength, NULL);
    			WriteFile(_hFile, lpBuffer, dwLength, &dwWriteLength, NULL);
    			WriteFile(_hFile, pEnd, strlen(pEnd), &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;
    			_szFileName=NULL;
    		}
    	}
    	
    	const char * GetFileName()
    	{
    		return _szFileName;
    	}
    	
    	void SetFileName(const char *szName)//修改文件名, 同时关闭上一个日志文件
    	{
    		assert(szName);
    		
    		if(_szFileName)
    		{
    			delete []_szFileName;
    			_szFileName=NULL;
    		}
    		
    		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;
    			_szPath=NULL;
    		}
    	}
    	
    	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)//更换文件名
    			{
    				//基类的文件名大小已改变,这里也要改,不然基类delete失改.
    				char * backslash="//";
    				char * suffix=".log";
    				if (_szFileName)
    				{
    					delete [] _szFileName;
    					_szFileName=new char[strlen(_szPath)+strlen(temp)+strlen(backslash)+strlen(suffix)+1];
    				}
    				strcat(strcpy(_szFileName, _szPath), backslash);
    				strcat(strcat(_szFileName, temp), suffix);
    				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
    
  • 相关阅读:
    【总结】机器学习里需要知道的12堂课
    【转载】The Mathematics Of Beauty
    Facebook的朋友推荐系统
    【转载】Netflix: System Architectures for Personalization and Recommendation
    aDev第13期#个性化推荐技术#总结(Part II:江申@百度)
    mahout 0.7关于随机选择数据的一个bug
    Dirichlet Process 和 Dirichlet Process Mixture模型
    aDev第13期#个性化推荐技术#总结(Part I:袁全@一淘)
    httpHandler实现.Net无后缀名Web访问
    还在使用Application_Start做定时器的,你们伤不起!
  • 原文地址:https://www.cnblogs.com/pugna/p/3724387.html
Copyright © 2020-2023  润新知