オープンソースC/C++ログクラス

5421 ワード

前言
ログクラスは練習プロジェクトとして、良いログクラスを実現するのは容易ではありません.ここでは最初のバージョンを先に出して、後期に最適化を続けます.機能が簡単で初心者にとってとても友好的で、間違いを指摘することを歓迎します.
紹介する
このログクラスは私がCClogと命名して、第1のCはclassの意味で、この点を無視するならClogと呼ぶことができます.役割はもちろんログ記録であり、書き込みログ操作はスレッドが安全で、文字列Formatのような形式をサポートしています.
環境
Windowsプラットフォームベース
使用例Demo

// test.cpp :              。
//

#include "stdafx.h"
#include 
#include "Clog.h"
#include 

int _tmain(int argc, _TCHAR* argv[])
{
    //     ,       、    ,          -----     。
	CClog::InitClog("dir\\");
    //             
	CClog::Instance().WriteLog("test");
	CClog::Instance().WriteLogFormat("%d,%d,%d",110,112,1);
    //    ,     
	CClog::CloseClog();
	return 0;
}


, 、 , ----- 。

CClog.h


#pragma once

//////////////////////////////////////////////////////////////////////////
//         author:  wzy
//		   csdn:    https://blog.csdn.net/Think88666
//         date:    2019-09-05
//////////////////////////////////////////////////////////////////////////
#include 

class CClog
{
public:
	static bool InitClog(const char *szDstDir);
	static bool CloseClog();
	const static CClog &Instance();
private:
	static CClog *s_log;

private:
	CClog(void);

	FILE *m_hFile;
	char *m_szFileName;
	char *m_szFormatBuff;
	HANDLE m_hMutex;

public:
	~CClog(void);
	void WriteLog(const char *szInfo) const;
	void WriteLogFormat(const char *szFormat,...) const;
};

CClog.cpp


#include "StdAfx.h"
#include "Clog.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define F_OK 0   /* Check for file existence */
#define X_OK 1   /* Check for execute permission. */
#define W_OK 2   /* Check for write permission */
#define R_OK 4   /* Check for read permission */


#define _MUTEX_START_  	DWORD  d  = WaitForSingleObject(m_hMutex, INFINITE); \
							   if(d != WAIT_OBJECT_0 ) return;


#define _MUTEX_END_   ReleaseMutex(m_hMutex);

//   
CClog *CClog::s_log = NULL;

CClog::CClog(void):m_hFile(NULL),m_szFileName(NULL),m_szFormatBuff(NULL)
{
	m_szFileName = new char[400];
	m_szFormatBuff = new char [5120];
	m_hMutex = CreateMutex(NULL,FALSE,NULL);
}

CClog::~CClog(void)
{
	if(m_szFileName)
		delete []m_szFileName;
	if(m_hFile)
		fclose(m_hFile);
	if(m_szFormatBuff)
		delete []m_szFormatBuff;
	CloseHandle(m_hMutex);
}

bool CClog::InitClog( const char *szDstDir )
{
	//check dir
	int nDirFlag = access(szDstDir,F_OK | W_OK);
	if(-1 == nDirFlag)
	{
		int nMkDirFlag = mkdir(szDstDir);
		assert(-1 != nMkDirFlag);
		if(-1 == nMkDirFlag)
			return false;
	}
	//create file
	srand((unsigned int)time(NULL));
	int nRand = rand();
	time_t nNowTime = time(0);
	tm* nowTm = localtime(&nNowTime);
	char szBuff[90] = "\0";
	strftime(szBuff, sizeof(szBuff) - 1, "%Y_%m_%d__%H_%M_%S", nowTm);
	char szBuff2[30] = "\0";
	sprintf(szBuff2,"_%d.log",nRand%10000);
	
	strcat(szBuff,szBuff2);

	if(s_log) delete s_log;
	s_log = new CClog;
	int nLen = strlen(szDstDir);
	assert(nLen+strlen(szBuff)<399);
	strcpy(s_log->m_szFileName,szDstDir);
	if(s_log->m_szFileName[nLen-1] != '/' && s_log->m_szFileName[nLen-1] != '\\' )
	{
		s_log->m_szFileName[nLen] = '/';
		s_log->m_szFileName[nLen+1] = '\0';
	}
	strcat(s_log->m_szFileName,szBuff);


	s_log->m_hFile = fopen(s_log->m_szFileName,"a");
	assert(s_log);
	if(!s_log->m_hFile)
		return false;
	fputs("###Powered by Clog###",s_log->m_hFile);
	return true;

}

bool CClog::CloseClog()
{

	if(s_log)
	{
		delete s_log;
		s_log = NULL;
	}
	return true;
}



void CClog::WriteLog(const char *szInfo) const
{
	_MUTEX_START_

	assert(szInfo);
	if(m_hFile)
	{
		time_t nNowTime = time(0);
		tm* nowTm = localtime(&nNowTime);
		char szBuff[90] = "\0";
		strftime(szBuff, sizeof(szBuff) - 1, "
%Y-%m-%d %H:%M:%S ", nowTm); fputs(szBuff,m_hFile); fputs(szInfo,m_hFile); } _MUTEX_END_ } void CClog::WriteLogFormat(const char *szFormat,...) const { // // _MUTEX_START_ va_list aptr; va_start(aptr, szFormat); // vsnprintf(m_szFormatBuff, 5119,szFormat, aptr); va_end(aptr); if(m_hFile) { time_t nNowTime = time(0); tm* nowTm = localtime(&nNowTime); char szBuff[90] = "\0"; strftime(szBuff, sizeof(szBuff) - 1, "
%Y-%m-%d %H:%M:%S ", nowTm); fputs(szBuff,m_hFile); fputs(m_szFormatBuff,m_hFile); } _MUTEX_END_ } const CClog &CClog::Instance() { assert(s_log); return *s_log; }

GIthub :

https://github.com/1002130915/CClog