日志处理

日志可能有多种形式,比如以文件存储,显示到控制台屏幕上,或者在程序的一个列表框中……我们可以定义一个日志基类,然后继承之,针对不同的情况设计不同的子类。但如果程序中要求既在程序列表里显示日志,又要记录到文件或者还要记录到数据库等等吧,那么写日志的代码就非常麻烦,要几个日志类重复同样的动作。

利用下面的思路可以解决这个问题,在代码中只需要一个类的一个方法,就可以搞定所有日志类写日志的动作,同时又能起到一定的注释作用,是不是非常好!

OK! Let's go!

首先,定义一个日志类接口,主要给不同情况下生成日志的时候用。比如有的程序在自己的界面列表上输出日志,那么就可以实现这个接口,然后把实现的类传递到CLogHelper对象中,CLogHelper负责用日志接口列表中的日志接口写日志操作,而实现ILog接口的类负责实现日志的真实写入操作。

以下(核心)代码在VC6下编译并测试通过。代码中使用了STL技术。下同。

MyInterface ILog  
{
public:
    ILog();
    virtual ~ILog();

virtual void write(string logMsg);
    virtual void writeLn(string logMsg);

void debugWrite(string logMsg);
    void debugWriteLn(string logMsg);
};

MyInterface 是自己定义的一个接口,按照园子里的方法如下:

#define MyInterface class __declspec(novtable)

CLogHelper类是日志类的助手,可以添加日志对象(ILog类型),提供每个日志对象的写日志功能。它也可以继承ILog接口。

class CLogHelper : public ILog  
{
public:
    CLogHelper();
    virtual ~CLogHelper();

void write(string logMsg);
    void writeLn(string logMsg);

// 下面的方法用于DEBUG环境
    void debugWrite(string logMsg);
    void debugWriteLn(string logMsg);
    
    void add(ILog *log);
    
private:
    list<ILog *> logs;
};

CLogHelper::CLogHelper()
{

}

CLogHelper::~CLogHelper()
{
    logs.clear();
}

void CLogHelper::write(string logMsg)
{
    list<ILog *>::iterator logi;
    for(logi=logs.begin();logi!=logs.end();logi++)
        (*logi)->write(logMsg);
}

void CLogHelper::writeLn(string logMsg)
{
    string msg=logMsg+"\n";
    write(msg);
}

void CLogHelper::add(ILog *log)
{
    logs.push_back(log);
}

void CLogHelper::debugWrite(string logMsg)
{
#ifdef _DEBUG
    write(logMsg);
#endif
}

void CLogHelper::debugWriteLn(string logMsg)
{
    string msg=logMsg+"\n";
    debugWrite(msg);
}

下面是具体的日志类,它们都继承ILog接口。包括写入文件的日志类,控制台显示的日志类、程序列表中用到的日志类等等。

比如定义写入文件的日志类CLog继承ILog接口,代码略。

然后提供一个Log构建器(CLogBuilder),里面包括所有的具体日志类,在构造函数里把具体的日志类添加到CLogHelper中。构造函数提供一个文件路径的参数,表示文件日志要写到什么地方。这个参数默认为mylog.log文件,表示写到程序所在目录下,文件名默认为"mylog.log"。构造函数提供另一个参数为CLogHelper,就是说CLogHelper类是从外部传入的。

class CLogBuilder  
{
public:
    CLogBuilder(CLogHelper *logHelper,string path="mylog.log");
    virtual ~CLogBuilder();

string m_Path;
    
    CLog *fileLog;
};

CLogBuilder::CLogBuilder(CLogHelper *logHelper,string path)
:fileLog(0),m_Path(path)
{
    fileLog=new CLog(m_Path.c_str());
    
    // 向LogHelper中添加日志类
    logHelper->add((ILog *)fileLog);
}

CLogBuilder::~CLogBuilder()
{
    if(fileLog)
    {
        delete(fileLog);
        fileLog=NULL;
    }
}

然后定义一个职责转义类,在其它的类中需要提供写日志的时候,用这个类(定名为CRemark)。如果每个类的每个方法里都有写日志的代码,会把代码搞的很混乱,不突出方法的主题,也好像这个方法完成多项任务似的,代码不简明。记得VC的注释代码中有“// todo :”,所以这个类提供一个方法叫toDo(),其参数就是toDO()语句以下代码所完成工作的内容描述。看起来,这个方法好像是在给代码作注释。这样既起到了注释的作用,同时在toDo()方法中还可以调用日志类去写日志,岂不是一举两得。因为这个类在代码中看只是起到注释的作用,而在它的方法中却转义成了写日志,所以称其为职责转义类。当然,如果你发现这个类还可以干其它的事情,请你一定告诉我。

class CRemark  
{
public:
    CRemark();
    virtual ~CRemark();

CLogHelper *logHelper;
    CLogBuilder *logBuilder;
    
    void toDo(string comment,BOOL isDebug=FALSE);
};

CRemark::CRemark()
:logHelper(0),logBuilder(0)
{
    logHelper=new CLogHelper();
    logBuilder=new CLogBuilder(logHelper);
}

CRemark::~CRemark()
{
    if(logHelper)
    {
        delete(logHelper);
        logHelper=NULL;
    }
    if(logBuilder)
    {
        delete(logBuilder);
        logBuilder=NULL;
    }
}

void CRemark::toDo(string comment,BOOL isDebug)
{
    if(isDebug)
        logHelper->debugWriteLn(comment);
    else
        logHelper->writeLn(comment);
}

代码比较完美和优雅了,就像C#那样,嘻嘻!

可以这样使用:

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
    CRemark mark;
    mark.toDo("嘻嘻哈哈吼吼!");
  //这里是程序中实际的代码

    mark.toDo("DEBUG版本显示。。。",TRUE);

  //这里是程序中实际的代码

mark.toDo("GOOD JOB!");

  //这里是程序中实际的代码

system("pause");

}

程序会在所在目录下创建(默认)mylog.log文件,并在其中显示三行文本;如果改成Release,则只输出两行文本。

转载于:https://www.cnblogs.com/yxsylyh/archive/2011/08/13/loghandling.html

(原创)日志处理(修改)相关推荐

  1. kong 网关日志格式修改

    kong 网关日志格式修改 kong网关默认日志在/usr/local/kong/logs,主要有access.log,admin_access.log,error.log,access.log和ng ...

  2. 短视频批量伪原创 视频md5修改手机版

             短视频批量伪原创 视频md5修改手机版          都说人是自私的,只关注与自己相关的事情,不论是"唐山大地震"还是"毒鸡汤",它们都能 ...

  3. 视频消重伪原创版 怎么修改视频的MD5值

             视频消重伪原创版 怎么修改视频的MD5值          其实,在这流量横飞的抖音里,引流.变现也无非就是通过以下两种方式.                      在短视频操作 ...

  4. 视频消重软件吾爱伪原创 视频如何修改md5

             视频消重软件吾爱伪原创 视频如何修改md5          从上述网红分类中可以看出,搞笑/剧情内容是头部网红的创作首选,反而唱跳才艺的展示内容占比不高,颜值也不再是第一生产力., ...

  5. Java学习day051 记录日志(基本日志、高级日志、修改日志管理器配置、本地化、处理器、过滤器、格式化器、日志记录说明)

    使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识. day051   记录日志(基本日志.高级日志.修改日志管理器配置.本地化.处理器.过滤器.格式化器 ...

  6. 如何在通达信软件上随意画图_[原创]谁能修改下画图工具啊?

    共11 条记录, 每页显示 10 条, 页签: [1] [2] 标题:[原创]谁能修改下画图工具啊? 1楼 xxx3345 发表于:2013/11/8 17:54:00 1,我对通达信画图工具的要求是 ...

  7. 全民小视频打击伪原创 视频md5修改器苹果手机

             全民小视频打击伪原创 视频md5修改器苹果手机          而剧情类的视频内容,也是很能维持粉丝粘性的一种方式,再加上反转带来意想不到的效果,更能引得粉丝的兴趣.如祝晓晗.河南 ...

  8. 抖音视频如何伪原创 视频md5修改器安卓版下载

             抖音视频如何伪原创 视频md5修改器安卓版下载          毋庸置疑的是,技术也是一把双刃剑,大荧幕上无数的科幻作品中都多多少少会表露此方面的担忧.               ...

  9. 火山视频伪原创 视频md5修改教程

             火山视频伪原创 视频md5修改教程          据抖音早期运营团队透露,对比国内当时的几款短视频产品后,他们发现少有针对一二线城市90后用户的短视频产品,这便是抖音需要切入的用 ...

  10. 修改oracle日志大小,修改Oracle重做日志文件大小

    修改Oracle重做日志文件大小 1.创建3个新的日志组 SQL> ALTER DATABASE ADD LOGFILE GROUP 4 ('/u01/app/oracle/oradata/or ...

最新文章

  1. 移动端iPhone系列适配问题的一些坑
  2. Diango 模板层
  3. Android中pendingIntent的深入理解
  4. 今晚直播:GAN在网络特征学习中的应用 | PhD Talk #23
  5. 图谱实战 | 面向C端场景的概念图谱构成、建设与应用索引
  6. java IO(四):键盘录入
  7. 图像匹配得到精确的旋转角度
  8. STC官方软件波特率计算器使用方法
  9. 强劲有力的EnableQ在线调查问卷引擎
  10. faststone capture怎么滚动截图?faststone capture怎么录屏?
  11. 苹果鼠标右键怎么按_如何在Mac上使用多点触控手势?苹果MacOSX系统常用多点触摸板操作手势教程...
  12. 你的计算机没有安装cad2006,win7安装autocad2006无法正常的2种解决方法
  13. 论文阅读:SCAFFOLD: Stochastic Controlled Averaging for On-Device Federated Learning
  14. 解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type 'xx.mapper.xxMapper'...
  15. USB-IF发布针对盲文点字显示器的HID标准
  16. 数据防泄密系统,你了解多少呢?
  17. vmware workstation 8序列号
  18. 信息安全技术 关键信息基础设施安全保护要求
  19. 磁盘分区MBR和GPT格式详解(Linux)
  20. IDEA 的Surround With (例如try/catch)快捷键

热门文章

  1. SCADA之父:物理隔离没什么用
  2. java中绘制长方形,椭圆形,圆形的方法
  3. 042 第一章 简介
  4. GPS时钟模块授时仪 与 同步时钟,1PPS
  5. 【熵】熵,KL散度,交叉熵,最大熵模型
  6. Xgboost通俗理解和总结
  7. Python 正则表达式模块 - re
  8. Hibernate常用查询
  9. 凸优化第二章凸集 2.2 重要例子(仿射集合和凸集)
  10. STM32F4: Generating parallel signals with the FSMC