C++的一个日志类,和log4cplus很像

filelogs.h

#ifndef H_FILELOGS_H
#define H_FILELOGS_H

#include "stdlib.h"
#include "stdio.h"
#include <string.h>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>

#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(<ime);
#ifdef WIN32
	pNow = localtime(<ime);
#else
	pNow = localtime_r(<ime, &now);
#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;
}
时间: 2024-11-09 21:18:32

C++的一个日志类,和log4cplus很像的相关文章

高吞吐量的一个日志函数类_用于IOCP (Delphi)

在开发服务器端程序的时候,日志是必须的一个功能.由于服务器端的要频繁的把数据写入日志,开始的时候用了一个很简单日志函数 就是直接把日志字符写入文件中.然后关闭连接.一直也应用良好.但做压力测试的时候,因为要每个连接的数据都要写入日志,发现运行的一段时间后,频繁掉线,CPU占用率,居高不下,优化了可以想到的很多地方,有一定的效果,仔细观察发现,硬盘灯狂闪不止,说明硬盘I/0操作过于紧张.但测试的时候,基本是不读写硬盘的,恍然发现,是日志函数影响到整个系统的性能.每一个日志数据的时候,就要打开文件,

分享一个PHP调试日志类

分享一个我自己用的在 WordPress 开发中用得到的一个调试日志类. <?php /** * @author: suifengtec coolwp.com * @date: 2013-02-03 09:55:55 * @last Modified by: suifengtec coolwp.com * @last Modified time: 2015-07-12 18:40:02 */ if(function_exists('add_action')){ defined('ABSPATH'

一个项目需要考虑的问题:项目路径,数据库设计和权限,安全策略,日志类实现,页面基本结构

整个项目的流程 1.构建整个项目的框架结构[基本常量的定义] [实现一个框架需要权衡和良好的包含体系] 2.数据库设计和权限控制[对访问数据库的用户权限控制:默认新创建的用户对库内的数据并没有操作权限:Grant语句进行全新啊管理] 在项目建立之初,对数据库表结构进行设计是项目的关键. 考虑到各个业务层面上,设计各自的表结构. 注意数据库的三范式结构: 数据不可分割:第一范式[关联型数据库][针对每一列字段] 每一行数据的独立性:第二范式[针对每一行数据] 数据表之间的数据不要重复冗余:第三范式

[原创]分享一个轻量级日志类

日常开发中,常常会在程序部署到生产环境后发现有些问题,但无法直接调试,这就需要用到日志,本来想找一些开源的完善的日志类来实现,但试了几个都感觉太重.于是意识到一个问题,懒是偷不得的,只好撸起袖子,自己写一个.这个日志类是基于订阅模式的,而且是线程安全的,现在分享给大家,希望能给大家带来帮助. 闲话不多说,直接上代码.代码有两个实现版本(Java与C#),这里放出的是C#. 一共用到三个类:JzgLogs.cs主类,LogBuffer.cs日志缓冲类,LogInfo是用于日志缓冲中做记录的实体类,

C++开源日志类

今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.1.0 2.log4cxx 下载地址:http://logging.apache.org/log4cxx/download.html (log4cxx 是由JAVA实现的 log4j 开源的,用C++实

PHP用单例模式实现一个数据库类

使用单例模式的出发点: 1.php的应用主要在于数据库应用, 所以一个应用中会存在大量的数据库操作, 使用单例模式, 则可以避免大量的new 操作消耗的资源. 2.如果系统中需要有一个类来全局控制某些配置信息, 那么使用单例模式可以很方便的实现. 这个可以参看ZF的FrontController部分. 3.在一次页面请求中, 便于进行调试, 因为所有的代码(例如数据库操作类db)都集中在一个类中, 我们可以在类中设置钩子, 输出日志,从而避免到处var_dump, echo. 创造单例注意: 1

怎么样做好日志类的报警监控

上一篇文章写了普通数字类型类型的监控报警,本文谈一下怎么样做好日志类的监控和报警 一.日志类报警的特点 1.接受人员希望直接看到日志的内容: 2.对应技术栈涉及比较广的系统,,一个问题会引发不同主机上面不同系统同时产生日志.举例:openstack 的nova在保存快照时出错,会引起nova-api,galnce-api,horizen同时产生错误日志. 二.遇到的痛点: 1.有很多人想随时查看日志,不同的人想要查看不同的日志: 2.日志类的报警,不适合用微信直接发送内容,原因一是转义麻烦,二是

C#日志类

日志在我们日常程序中是非常容易触及到的东西,当然我们在程序中可以用很多种方式来记录. 在C#中我们可以用log4net.dll,也可以利用IO将记录写入文件. 作用: 记录用户的操作 记录程序中的异常,我们可以捕获到很多有用的东西 为数据分析提供依据 这篇文章给了我们写日志非常好的建议:http://blog.jobbole.com/52018/ 下面是我在项目经常用到的一个log类, 1 /// <summary> 2 ///Log 的摘要说明 3 /// </summary>

C#日志类记录

每个程序都要和日志打交道.程序日志的质量直接影响了排除问题的难度.普通程序调试信息直接输出控制台,复杂程序则通过文本,xml等方式记录运行时的调试信息.在C#中Diagnostics命名空间下有一个微软提供的专门用于记录信息的TraceSource类.TraceSource的使用方法很简单,只需要4行代码 TraceSource ts = new TraceSource("Code.Main", SourceLevels.All); ts.Listeners.Add(new Conso