基于单例模式的日志输出
什么是单例模式?
单例模式就是保证一个类只有一个实例,并提供一个访问它的全局访问点。
首先,需要保证一个类只有一个实例;在类中,要构造一个实例,就必须调用类的构造函数,如此,为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为protected或private;最后,需要提供要给全局访问点,就需要在类中定义一个static函数,返回在类内部唯一构造的实例。
下边就是一个常见的单例模式程序例子:
class Singleton
{
private:
Singleton(){}
~Singleton(){}
static Singleton *pInstance;
public:
static Singleton *GetInstance()
{
if (pInstance == NULL) //判断是否第一次调用
{
pInstance = new Singleton ();
}
return pInstance;
}
};
基于单例模式的日志输出
需求:使用单例模式写一个日志输出,输出日志文件为当天日期名如20180831,输出日志格式为[08/31/18 12:22:30 loginxxxxxx]
//syslog.h
#include <ctime>
#include <memory>
#include <iostream>
#include <fstream>
#include <stdlib.h>
using namespace std;
class SysLog
{
public:
static SysLog *myLog()
{
if (NULL == _syslog) //判断是否第一次调用
{
_syslog = new SysLog();
//_syslog->ofs.open("SysLog.log",ios::app);
}
return _syslog;
}
void Log(const string& logInfo);
private:
NebulaSysLog(void) {}
virtual ~SysLog(void) {}
friend class auto_ptr<SysLog>;
static SysLog *_syslog;
char tmp1[100];
char tmp2[100];
ofstream ofs; // 输出文件流
class CGarbo //用于在析构函数中删除NebulaSysLog的实例
{
public:
~CGarbo()
{
if(SysLog::_syslog)
{
SysLog::_syslog->ofs.close();
delete SysLog::_syslog;
SysLog::_syslog = NULL;
}
}
};
static CGarbo Garbo; //定义一个静态成员变量,程序结束时,系统会自动调用它的析构函数
};
SysLog *SysLog::_syslog = NULL;
void SysLog::Log(const string& logInfo)
{
time_t t = time(0);
strftime(tmp1, sizeof(tmp1), "[%D %X %A]", localtime(&t));
strftime(tmp2, sizeof(tmp2), "%Y%m%d.log", localtime(&t));
ofs.open(tmp2,ios::app);
ofs << tmp1 << logInfo.c_str() << endl;
}
//syslog.cpp
#include "Nebula_Sys_Log.h"
int main(int argc, char *argv[])
{
time_t now;
struct tm *tm_now ;
now=time(NULL) ;
tm_now = localtime(&now) ;
NebulaSysLog::myLog()->Log(argv[1]);
cout<<"["<<tm_now->tm_year+1900<<"-"<<tm_now->tm_mon+1<<"-"<<tm_now->tm_mday<<" "
<< tm_now->tm_hour <<":"<<tm_now->tm_min<<":"<<tm_now->tm_sec<<"]"<<argv[1]<<endl;
return 0;
}