一个c++给程序打log的单例模式类

开发过程中需要给程序打log. 所以照着网上写了个单例模式的log类

1 #ifndef MISCLOGWRITER_H_
 2 #define MISCLOGWRITER_H_
 3 
 4 #include <iostream>
 5 #include <fstream>
 6 #include <string>
 7 #include <vector>
 8 
 9 namespace miscfactory
10 {
11 class MiscLogWriter
12 {
13     public:
14         ~MiscLogWriter();
15         //获取本类的对象  
16         static MiscLogWriter* getInstance();                        //删除本类的对象           void del();
17       //往log文件写东西
18         bool writeLog(const char* logInfo);
20         bool writeLog(const std::string& logInfo);
22         bool writeLog(std::vector<char*>& vectorLogInfo);
24         bool writeLog(std::vector<std::string>& vectorLogInfo);
25      //清空文件内容
26         static bool clearFile();
27         //重新设置文件路径
28         static bool setLogLocation(const char* logPath);
29 
30     private:
31         MiscLogWriter();   //之所以把构造函数弄成私有是因为:不允许外界直接定义这个log类的对象,只能我这个类通过getInstance自己定义对象
32      //打开log文件,关闭log文件
33         static std::ofstream* openFile();
34         static bool closeFile(std::ofstream* ofsHandle);
35 
36     //指定的log文件所在的路径是否合法
37         static bool isAvailableLocation(const char* logPath);
38 
39         static std::string        m_filePath;   //log's 文件路径
40         static MiscLogWriter*    m_miscLogWriter; //本类的一个对象指针,getInstance总是返回这个对象的指针. 弄成静态的是因为可以让静态函数getInstance直接返回
41     };
42 }//namespace miscfactory
43 
44 #endif /*MISCLOGWRITER_H_*/
1 #include "miscfactory/misclogwriter.h"
  2 #include <string.h>
  3 #include <iostream>
  4 #include <fstream>
  5 
  6 namespace miscfactory
  7 {
  8 
  9 using namespace std;
 10 
 11 MiscLogWriter* MiscLogWriter::m_miscLogWriter = NULL;
 12 std::string MiscLogWriter::m_filePath = string("./miscLog.log");   //静态成员变量必须要初始化,而且初始化要放到cpp中不能放到.h中
 13 
 14 MiscLogWriter::MiscLogWriter()
 15 {
 16 
 17 }
 18 
 19 MiscLogWriter::~MiscLogWriter()
 20 {       /*//在析构函数中是否需要删除静态成员变量m_miscLogWriter指向的对象.或者说,这个析构函数到底会不会被执行.如果有这几行,成员函数del执行时候,是否有冲突??
if (m_miscLogWriter != NULL)       {           if (m_miscLogWriter != NULL)                {                delete m_miscLogWriter;                m_miscLogWriter = NULL;           }       }       */
 26 }
 27     void MiscLogWriter::del() //单例模式下,把静态成员变量所指向的对象的删除工作放在析构函数中是不合适的吧,是否应该提供一个del函数,如果是,这个函数是否应该是静态 ????    {        if (m_miscLogWriter != NULL)         {            delete m_miscLogWriter;            m_miscLogWriter = NULL;         }    }
 28 MiscLogWriter* MiscLogWriter::getInstance()
 29 {
 30     if (m_miscLogWriter != NULL )
 31     {
 32         return m_miscLogWriter;
 33     }
 34 
 35     return m_miscLogWriter = new MiscLogWriter();
 36 }
 37 
 38 bool MiscLogWriter::setLogLocation(const char* logPath)
 39 {
 40     if (!isAvailableLocation(logPath))
 41     {
 42         cout<<"logLocation ["<<logPath<<"] is unAvailable"<<endl;
 43         return false;
 44     }
 45 
 46     m_filePath = string(logPath);
 47     return true;
 48 }
 49 
 50 bool MiscLogWriter::isAvailableLocation(const char* logLocation)
 51 {
 52     //TODO  check whether logLocation is a correct path
 53     return true;
 54 }
 55 bool MiscLogWriter::writeLog(const char* logInfo)
 56 {
 57     ofstream* ofsHander = openFile();
 58     if (ofsHander == NULL)
 59     {
 60         cout<<"fileOpenError"<<endl;
 61         return false;
 62     }
 63 
 64     ofsHander->write( logInfo, strlen(logInfo) );
 65     ofsHander->write( "\n", strlen("\n") );
 66     closeFile(ofsHander);
 67     return true;
 68 }
 69 
 70 bool MiscLogWriter::writeLog(const string& logInfo)
 71 {
 72     return writeLog(logInfo.data());
 73 }
 74 
 75 bool MiscLogWriter::writeLog(vector<char*>& vectorLogInfo)
 76 {
 77     for (int i = 0; i < vectorLogInfo.size(); i++)
 78     {
 79         if (!writeLog(vectorLogInfo[i]))
 80         {
 81             return false;
 82         }
 83     }
 84 
 85     return true;
 86 }
 87 
 88 bool MiscLogWriter::writeLog(vector<string>& vectorLogInfo)
 89 {
 90     for (int i = 0; i < vectorLogInfo.size(); i++)
 91     {
 92         if (!writeLog(vectorLogInfo[i].data()))
 93         {
 94             return false;
 95         }
 96     }
 97 
 98     return true;
 99 }
100 
101 ofstream* MiscLogWriter::openFile()
102 {
103     if(!isAvailableLocation(m_filePath.data()))
104     {
105         return NULL;
106     }
107 
108     ofstream* ofsHandle = new ofstream(m_filePath, ios::app); //追加方式打开文件
109     return ofsHandle;
110 }
111 
112 bool MiscLogWriter::closeFile(ofstream* ofsHandle)
113 {
114     if (ofsHandle == NULL)
115     {
116         return true;
117     }
118 
119     if (ofsHandle->is_open())
120     {
121         ofsHandle->close();
122         delete ofsHandle;
123         ofsHandle = NULL;
124     }
125 
126     return true;
127 }
128 
129 bool MiscLogWriter::clearFile()
130 {
131     if(!isAvailableLocation(m_filePath.data()))
132     {
133         return false;
134     }
135 
136     ofstream* ofsHandle = new ofstream(m_filePath, ios::out); //清空方式打开文件
137     return closeFile(ofsHandle);
138 }
139 }//namespace miscfactory

调用

MiscLogWriter::setLogLocation("./miscLog.log");

MiscLogWriter::clearFile();

MiscLogWriter::getInstance().WriterLog("abc");

MiscLogWriter::getInstance().WriterLog("123");

MiscLogWriter::getInstance().del();
原文链接: https://www.cnblogs.com/silentNight/p/5515301.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/233714

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月13日 下午4:00
下一篇 2023年2月13日 下午4:00

相关推荐