一个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();

时间: 2025-01-05 21:31:07

一个c++给程序打log的单例模式类的相关文章

Hibernate 第一个Hibernate应用程序

Chapter 1. Tutorial   第一章 使用说明书 Table of Contents   目录 1.1. Part 1 - The first Hibernate Application   第一节 第一个Hibernate应用程序 1.1.1. Setup   设置开发环境 1.1.2. The first class  创建第一个类 1.1.3. The mapping file  创建类与数据库表的映射文件 1.1.4. Hibernate configuration  Hi

一个无锁消息队列引发的血案:怎样做一个真正的程序员?(二)——月:自旋锁

前续 一个无锁消息队列引发的血案:怎样做一个真正的程序员?(一)——地:起因 一个无锁消息队列引发的血案:怎样做一个真正的程序员?(二)——月:自旋锁 平行时空 在复制好上面那一行我就先停下来了,算是先占了个位置,虽然我知道大概要怎么写,不过感觉还是很乱. 我突然想到,既然那么纠结,那么混乱,那么不知所措,我们不如换个视角.记得高中时看过的为数不多的长篇小说<穆斯林的葬礼>,作者是:霍达(女),故事描写了两个发生在不同时代.有着不同的内容却又交错扭结的爱情悲剧,一个是“玉”的故事,一个是“月”

撸了一个微信小程序项目

学会一项开发技能最快的步骤就是:准备,开火,瞄准.最慢的就是:准备,瞄准,瞄准,瞄准-- 因为微信小程序比较简单,直接开撸就行,千万别瞄准. 于是乎,趁着今天上午空气质量不错,撸了一个小程序,放在了男性交友网站上了, 我添加了很全的注释,大家赏个star. 地址:https://github.com/yll2wcf/wechat-weapp-lifeTools 功能介绍 功能比较简单,调用了百度ApiStore的接口即时查询空气质量. 我计划多加一些功能,争取把微信小程序提供的功能全用一遍. 也

【物联网(IoT)开发】使用 Arduino 和 Python在 Bluemix 上开发一个 IoT 应用程序之控制LED灯开关

上篇"[物联网(IoT)开发]Arduino 入门 Hello World(LED闪烁)"只是通过将一段程序烧录到Arduino开发板上控制LEC闪烁,没有任何连网动作,也就是说断开网络提供电源依然还可以工作.本文将介绍如何开发一个应用程序,以便使用适用于物联网 (Internet of Things, IoT) 的技术.我们的应用程序通过串口收集数据,将其存储在一个 Web 服务器上,然后在网页上实时显式结果,并可以在网页上控制LED的开关. 构建一个类似的应用程序的前提条件 对于第

Unity3d 一个优秀的程序必备的几种设计模式

unity编程众所周知,它是属于脚本化,脚本没有一个具体的概念跟架构, 导致在项目过程中,经常出现哪里需要实现什么功能,就随便添加脚本, 结果,就造成了一片混乱,不好管理. 更有甚者,自己的写的代码闲置一段时间后,再去想找某个功能的实现,都要在视图中翻来覆去找半天. 哎!请容许我在此感叹一声,这还是你写的东西么? 因此,一个好的设计模式是多么的重要啊, 那么,我们在使用unity3d开发东西的时候,脚本架构到底应该如何来写? 呵呵... 其实,我也给不了你们具体答案,因为每个人的开发习惯,每个团

手把手教你写一个RN小程序!

时间过得真快,眨眼已经快3年了! 1.我的第一个App 还记得我14年初写的第一个iOS小程序,当时是给别人写的一个单机的相册,也是我开发的第一个完整的app,虽然功能挺少,但是耐不住心中的激动啊,现在我开始学react native,那么现在对于react native也算是有所了解了,就用网上的接口开发一个小程序,现在带大家来写这个程序!接口是用看知乎的API,简简单单的只有get,可以从这里入门,也算是带大家入门吧,过后我会把源代码放在我的github上,前期项目肯定特别简陋,后面慢慢来优

封装一个简单好用的打印Log的工具类And快速开发系列 10个常用工具类

快速开发系列 10个常用工具类 http://blog.csdn.net/lmj623565791/article/details/38965311 ------------------------------------------------------------------------------------------------ 不知众多Android开发者是否在程序开发的工程中也遇到过下面的问题: 0.如何在众多log中快速找到你设置打印的那行log? 1.是否还在不断的切换标签来

node.js教程基础:第一个node.js程序

第一个Node.js程序 可以是基于控制台console和基于Web的node.js应用程序. 基于console的node.js例子 文件:console_example1.js 1 console.log('Hello World); 打开Node.js命令提示符并运行以下代码: >node console_example1.js >Hello World 在这里,console.log()函数在控制台上显示消息. 我们还可以在console.log()函数中使用格式说明符: 1 cons

第十四篇:一个文本查询程序的实现

前言 本文将讲解一个经典的文本查询程序,对前面所学的容器相关知识进行一个从理论到实际的升华,同时也对即将学习的面向对象知识来一次初体验. 程序描述 要求实现这样一个程序:读取用户指定的文件,然后允许用户从中查找某个单词所在的位置. 一个面向过程的落后的设计思想 将待检索文件以行为单位存放到Vector容器中,然后遍历容器,将容器内元素依次转存到字符串流对象中,然后在内层遍历这个字符串流对象,检索是否存在与给定单词匹配的单词.如果有则输出该行内容以及该行序号. 落后的原因及先进的设计思想 这是我以