⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 log.cpp

📁 linux程序
💻 CPP
字号:
#include <stdio.h>
//#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include "Log.h"

    static Log *systemLog = NULL;
    // systemLog = NULL;
    void LogPrintf(unsigned int logLevel,char *format,...)
    {
	    char logString[500];
	    char logStringTime[700]; 
	    
	    if( systemLog == NULL)
	    {
		    systemLog = new Log;
		    int len = systemLog->OpenLog();
		    if(len < 0)
		    {
			    printf("不能打开日志文件 \n");
			    return;
		    }   
	    }
	    
	    if(logLevel < systemLog->GetCurrentLevel()) //是否需要记录
	        return;
		
	    memset(logString,0,sizeof(logString));
	    memset(logStringTime,0,sizeof(logStringTime));
	    va_list ap;
	    va_start(ap,format);
        int n = vsprintf(logString,format,ap);
        if( n>= 500)
        {
    	    printf("print_err() strlen error:%d.\n",n);
    	    return;
        }

	    strcat(logString,"\n");
	    Timer curTime;
	    //curTime.GetLongTime(logStringTime);
	    sprintf(logStringTime,"[ %04d-%02d-%02d %02d:%02d:%02d ]    ",
		        curTime.GetYear(),curTime.GetMonth(),curTime.GetDay(),
                curTime.GetHour(),curTime.GetMinute(),curTime.GetSecond());
	    strcat(logStringTime,logString);
        systemLog->WriteLog(logStringTime);
        printf("%s",logStringTime);
        va_end(ap); 
    }	
    Log::Log(unsigned int logLevel, unsigned int logType,char *logPrefix,char *logDir,bool isOutputConsole)
    {
    	mLogLevel = logLevel;
    	mIsOutputConsole = isOutputConsole;
    	
    	//mLogBuf = NULL;

		//Timer curTime;
    #ifdef __Win32__	
		CTime curTime = CTime::GetCurrentTime();  
		mLogBeginTime = curTime;
	#endif
		
		mLogType  = logType;
		if(( logPrefix != NULL))
    	{
    		int len = strlen(logPrefix);
    		if( len <= MaxLogFilePrefixLen)
    		    strcpy(mLogFilePrefix,logPrefix);
    	}

    	if(( logDir != NULL) )
    	{
			int len = strlen(logDir);
    		if( len <= MaxLogDirectoryLen )
    		    strcpy(mLogDirectory,logDir);
    	}
    #ifdef __Win32__
		BOOL bVal = CreateDirectory(".\\log",NULL);
	#endif
	#ifdef __REDHATLINUX__
		//SInt32 vao = mkdir("./log",S_IRWXU); 
		SInt32 vao = mkdir(mLogDirectory,S_IRWXU); 
	#endif	
		mLogRemainDay = 2;

    }

    Log::~Log() 
    {
    	
    }

	bool Log::SetLogDirectory(char *dir)
	{
		if(dir == NULL)
			return false;
		if( strlen(dir) > MaxLogDirectoryLen)
			return false;
		strcpy( mLogDirectory , dir);
		return true;

	}

	bool Log::SetLogFilePrefix(char *prefix)
	{
		if(prefix == NULL)
			return false;
		if( strlen(prefix) > MaxLogFilePrefixLen)
			return false;
		strcpy( mLogFilePrefix , prefix);
		return true;

	}
    
	void Log::SetWorkDirectory()
	{

	}

	void Log::SetLogConsoleOutput(bool isOutput)
	{
		mIsOutputConsole = isOutput;
	}

#ifdef __Win32__	
	void Log::GetLogFileName(char *buf, CTime *t)
	{
		if( mLogDirectory != NULL )
		{
			strcpy(buf,mLogDirectory);
			strcat(buf,"\\");
		}

		strcat(buf,mLogFilePrefix);
		char timeStamp[50];
    	memset(timeStamp,0,sizeof(timeStamp));
    	sprintf(timeStamp,"%04d-%02d-%02d",t->GetYear(),t->GetMonth(),t->GetDay());
    	strcat(buf,timeStamp);
		strcat(buf,".txt");
    }
#endif
	
#ifdef __REDHATLINUX__
    void Log::GetLogFileName(char *buf,Timer *t)
	{
		if( mLogDirectory != NULL )
		{
			strcpy(buf,mLogDirectory);
			strcat(buf,"/");
		}

		strcat(buf,mLogFilePrefix);
		char timeStamp[50];
    	memset(timeStamp,0,sizeof(timeStamp));
    	t->GetLogTime(timeStamp);
    	strcat(buf,timeStamp);
		strcat(buf,".txt");
	}
#endif    

    int Log::GetLogFile(char *buf)
    {
     	//
    	///加入时间戳
    #ifdef __Win32__ 
		//
		if( mLogDirectory != NULL )
		{
			strcpy(buf,mLogDirectory);
			strcat(buf,"\\");
		}
		strcat(buf,mLogFilePrefix);
		char timeStamp[50];
    	memset(timeStamp,0,sizeof(timeStamp));
		CTime curTimer = CTime::GetCurrentTime();
    	sprintf(timeStamp,"%04d-%02d-%02d",curTimer.GetYear(),curTimer.GetMonth(),curTimer.GetDay());
    	strcat(buf,timeStamp);
		strcat(buf,".txt");
    #endif

    #ifdef __REDHATLINUX__ 
		//
		if( mLogDirectory != NULL )
		{
			strcpy(buf,mLogDirectory);
			strcat(buf,"/");
		}
		strcat(buf,mLogFilePrefix);
		char timeStamp[50];
    	memset(timeStamp,0,sizeof(timeStamp));
		Timer curTimer;
    	curTimer.GetLogTime(timeStamp);
    	strcat(buf,timeStamp);
		strcat(buf,".txt");
    #endif
    	
		return 0;
    }
    
    int Log::OpenLog()
    {
    	mFileMutex.Lock();
    #ifdef __Win32__
		//CTime curTime = CTime::GetCurrentTime();
    	//mFileOpenTime = curTime;
    #endif
    #ifdef __REDHATLINUX__
    	//Timer curTime;
    	//mFileOpenTime = curTime;
    #endif	
    	
     	memset(mCurrentFileName,0,sizeof(mCurrentFileName));
    	int err = GetLogFile(mCurrentFileName);
    	if(err)
    	{
    		mFileMutex.Unlock();
    	    return err;
    	}
    
		//fp = fopen(mCurrentFileName,"w+");
		fp = fopen(mCurrentFileName,"a+");
    	if(fp == NULL)
    	{
    		printf("不能打开日志文件 %s",mCurrentFileName);
    		mFileMutex.Unlock();
    		return -1;
    	}
        mFileMutex.Unlock();

		return 0;
    	  
    }
    
    int Log::WriteLog(char *buf)
    {
    	int err = 0;

		mFileMutex.Lock();
		if( mIsOutputConsole )
			printf("%s",buf);
    	if(!IsOpen())
    	{
    		mFileMutex.Unlock();
    		return -1;
    	}
		err = fputs(buf,fp);
    	if(err < 0)
    	{
    	   	mFileMutex.Unlock();
    	    return -1;
    	}
    	err = fflush(fp);
    	mFileMutex.Unlock();
    	//if( err != 0 )
    	//    OpenLog();
    	
    	
    #ifdef __Win32__	    
        CTime curTime = CTime::GetCurrentTime();
    #endif
    #ifdef __REDHATLINUX__
    	Timer curTime;
    #endif	
    	if(curTime.GetDay() != mFileOpenTime.GetDay())
    	{
    	  	//CloseLog();
 			ClearLogDirectory();
			/// 删除以前的日志文件
			//OpenLog();
    	}
    
    	return err;
    	
    }
    
    int Log::CloseLog()
    {
    	mFileMutex.Lock();
		fflush(fp);
    	fclose(fp);
    	mFileMutex.Unlock();

		return 0;
    }
    
    int Log::IsOpen()
    {
    	if(ferror(fp) != 0) 
    	    return 0; //-1;
  
    	return 1;
    }
    
    unsigned int Log::GetCurrentLevel()
    {
    	return mLogLevel;
    }

	void Log::ClearLogDirectory()
	{
		/// 删除不需要的日志文件,以节省磁盘空间
		//CreateDirectory
		/*
		if( mLogType == LOG_EVERY_DAY)
			return;
        else if( mLogType == LOG_TWO_FILE_SWAP )
		{
		}
		else if( mLogType == LOG_WEEK_FILE_SWAP )
		{
		}
		else if( mLogType == LOG_MONTH_FILE_SWAP)
		{
		}
		else if( mLogType == LOG_YEAR_FILE_SWAP)
		{
		}
		*/

		//CTimeSpan
	#ifdef __Win32__	
		CTime curTime = CTime::GetCurrentTime();
		if(mLogRemainDay < 0 || mLogRemainDay > 366)
			mLogRemainDay = 2;
		CTimeSpan span(mLogRemainDay,0,0,0);
		curTime = curTime - span;
		//mLogRemainDay
		char delFileName[200];
		memset(delFileName,0,sizeof(delFileName));
        GetLogFileName(delFileName,&curTime);
		DeleteFile(delFileName);
	#endif
	#ifdef __REDHATLINUX__
		Timer curTime;
		if(mLogRemainDay < 0 || mLogRemainDay > 366)
			mLogRemainDay = 2;
		TimerSpan span(mLogRemainDay,0,0,0);
		curTime = curTime - span;
		//mLogRemainDay
		char delFileName[200];
		memset(delFileName,0,sizeof(delFileName));
        GetLogFileName(delFileName,&curTime);
		remove(delFileName);
	#endif	

	}
	

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -