linux c++ 日志类,类似log4cplus的一个C++日志类

filelogs.h

#ifndef H_FILELOGS_H

#define H_FILELOGS_H

#include "stdlib.h"

#include "stdio.h"

#include

#include

#include

#include

#define MAX_FILE_LEN 5242880 //5M

#define MAX_PATH_LEN 300

#define RTN_FAIL -1

#define RTN_SUCCESS 0

#define WriteLog(Msg) WriteMsgLog(__FILE__,__LINE__,Msg)

class CFileLogs

{

public:

CFileLogs();

virtual ~CFileLogs();

bool IsOpen();

int init(int iLogLevel,const char *pcDebugLogFileName);

bool OpenFile(char *);

bool OpenNewOutputFile(char *);

bool GetLock();

int WriteMsgLog(const char *,int,const char *);

int WriteOutputMsg(const char *);

public:

char m_FileName[MAX_PATH_LEN + FILENAME_MAX + 1];

int m_LogLevel;

private:

bool m_lock;

FILE *m_file;

private:

bool CheckFile();

void GetTimeStr(char *);

};

#endif

filelogs.cpp

// filelogs.cpp: implementation of the CFileLogs class.

//

//

#include "filelogs.h"

//

// Construction/Destruction

//

CFileLogs::CFileLogs()

{

m_lock = false;

m_file = NULL;

}

CFileLogs::~CFileLogs()

{

if(m_file != NULL)

fclose(m_file);

}

//

// public method

//

bool CFileLogs::GetLock()

{

if(m_lock == true)

return false;

m_lock = true;

return true;

}

bool CFileLogs::IsOpen()

{

if(m_file != NULL)

return true;

else

return false;

}

int CFileLogs::init(int iLogLevel,const char *pcDebugLogFileName)

{

this->m_LogLevel = iLogLevel;

//if log level less than 1 , then don't open log file

if (this->m_LogLevel > 0) {

if (pcDebugLogFileName == NULL) {

return RTN_FAIL;

}else {

strcpy(this->m_FileName, pcDebugLogFileName);

//this->m_DebugLogFileName = strDuplicate(pcDebugLogFileName);

}

}

FILE *logFile=NULL;

if (this->m_LogLevel >= 3) {

logFile = fopen(this->m_FileName,(char *)"a+");

if (logFile == NULL) {

printf("Cannot open file %s to write!\n", this->m_FileName);

return RTN_FAIL;

}

fclose(logFile);

}

return RTN_SUCCESS;

}

bool CFileLogs::OpenFile(char *filePathAndName)

{

if(filePathAndName == NULL)

return false;

sprintf(m_FileName, filePathAndName);

if((m_file = fopen(m_FileName, "a")) == NULL)

return false;

return true;

}

bool CFileLogs::OpenNewOutputFile(char *filePathAndName)

{

if(filePathAndName == NULL)

return false;

if( IsOpen() )

fclose(m_file);

sprintf(m_FileName, filePathAndName);

if((m_file = fopen(m_FileName, "a")) == NULL)

return false;

return true;

}

int CFileLogs::WriteMsgLog(const char *pcsrcfile,int line,const char *strMsg)

{

char buf[100];

CheckFile();

if(m_file == NULL)

m_file = fopen(m_FileName, "a");

if(m_file != NULL && strMsg != NULL) {

GetTimeStr(buf);

fprintf(m_file, "[%s]line[%d][%s] %s\n",pcsrcfile,line,buf,strMsg);//pcsrcfile

fflush( m_file );

}

else {

return 0;

}

m_lock = false;

return 1;

}

int CFileLogs::WriteOutputMsg(const char *strMsg)

{

if (m_file == NULL)

m_file = fopen(m_FileName, "a");

if (m_file != NULL && strMsg != NULL) {

fprintf(m_file, "%s\n",strMsg);

fflush( m_file );

}

else {

return 0;

}

m_lock = false;

return 1;

}

bool CFileLogs::CheckFile()

{

struct stat statBuf;

int nRet;

char strNewName[500];

struct tm * pTime;

if(m_file == NULL)

return false;

nRet = fstat(

#ifdef LINUX

fileno(m_file)

#else

#ifdef HPUX

fileno(m_file)

#else

m_file->_file

#endif

#endif

, &statBuf );

if( nRet != 0 ) {

printf( "CFileLogs:Bad file handle!\n" );

return false;

} else {

if(statBuf.st_size > MAX_FILE_LEN) {

pTime = localtime(&statBuf.st_mtime);

sprintf( strNewName, "%sY%dM%dD%dH%dM%dS%d", m_FileName, pTime->tm_year + 1900, pTime->tm_mon+1, pTime->tm_mday, pTime->tm_hour, pTime->tm_min, pTime->tm_sec);

fclose(m_file);

m_file = NULL;

rename(m_FileName, strNewName);

}

}

return true;

}

void CFileLogs::GetTimeStr(char *pStr)

{

time_t ltime;

struct tm *pNow,now;

time(

#ifdef WIN32

pNow = localtime(

#else

pNow = localtime_r(

#endif

sprintf(pStr, (char *)"%2d-%02d-%02d %02d:%02d:%02d",

pNow->tm_year + 1900, pNow->tm_mon+1, pNow->tm_mday,

pNow->tm_hour, pNow->tm_min, pNow->tm_sec);

return;

}

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com

特别注意:本站所有转载文章言论不代表本站观点!

本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值