C++ 基于单例模式的日志输出

基于单例模式的日志输出


什么是单例模式?

单例模式就是保证一个类只有一个实例,并提供一个访问它的全局访问点。
首先,需要保证一个类只有一个实例;在类中,要构造一个实例,就必须调用类的构造函数,如此,为了防止在外部调用类的构造函数而构造实例,需要将构造函数的访问权限标记为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;
}

猜你喜欢

转载自blog.csdn.net/xuezhunzhen9743/article/details/82354845