少废话,直接看东西。

//LogWriter.h
#pragma once
#include <stdio.h>#define LOG_BUFFER_SIZE 1024
class LogWriter
{
public:LogWriter(const char * filepath);~LogWriter(void);bool write(const char * format, ...);
private:static int preMark(char * buffer);
private:FILE * fp;char   m_buffer[LOG_BUFFER_SIZE];
};
//LogWriter.cpp
#include "LogWriter.h"
#include <assert.h>
#include <share.h>
#include <stdarg.h>
#include <time.h>LogWriter::LogWriter(const char * filepath)
{fp = _fsopen(filepath, "a+", _SH_DENYNO);assert(fp != NULL);
}LogWriter::~LogWriter(void)
{if (fp) {fclose(fp);fp = NULL;}
}bool LogWriter::write(const char * format, ...)
{if (fp == NULL)return false;int nsize = 0;int prelen = 0;char * str = m_buffer;prelen = preMark(str);str += prelen;va_list args;va_start(args, format);nsize = _vsnprintf(str, LOG_BUFFER_SIZE - prelen, format, args);va_end(args);fprintf(fp, "%s\n", m_buffer);fflush(fp);return true;
}int LogWriter::preMark(char * buffer)
{time_t now;now = time(&now);struct tm vtm = *localtime(&now);return _snprintf(buffer, LOG_BUFFER_SIZE, "%04d-%02d-%02d %02d:%02d:%02d ",vtm.tm_year+1900, vtm.tm_mon, vtm.tm_mday, vtm.tm_hour, vtm.tm_min, vtm.tm_sec);
}

测试程序:

//main.cpp
#include "LogWriter.h"int main()
{LogWriter log("D:\\app.log");log.write("%s, %d", "hello", 123);
}

看效果:

PS:
程序可以改进的地方还有很多,但是已经可以用了,在一般的程序里面运行不会有问题。

一个简单可用的C++日志类相关推荐

  1. 实现自己的operator new和operator delete以及实现一个简单的内存池管理类

    为什么有必要写自己的operator new和operator delete? 为了效率.缺省的operator new和operator delete具有非常好的通用性,它的这种灵活性也使得在某些特 ...

  2. 一个简单好用的日志框架NLog

    之前我介绍过如何使用log4net来记录日志,但最近喜欢上了另一个简单好用的日志框架NLog. 关于NLog和log4net的比较这里就不多讨论了,感兴趣的朋友可以参看.NET日志工具介绍和log4n ...

  3. Qt5.9一个简单的多线程实例(类QThread)(第一种方法)

    Qt开启多线程,主要用到类QThread.有两种方法,第一种用一个类继承QThread,然后重新改写虚函数run().当要开启新线程时,只需要实例该类,然后调用函数start(),就可以开启一条多线程 ...

  4. php简单的mysql类_一个简单的php mysql操作类

    本文分享一个简单的php.mysql操作类,很简单,主要是数据的连接.查询等.有需要的朋友参考下吧. 分享一段php.mysql操作类的代码,供初学的朋友参考. 一个简单的类使用php和mysql数据 ...

  5. Linux Namespace系列(09):利用Namespace创建一个简单可用的容器

    本文将演示如何利用namespace创建一个完整的容器,并在里面运行busybox.如果对namespace不是很熟悉,请先参考前面几遍介绍不同类型namespace的文章. busybox是一个Li ...

  6. 一个简单又高效的日志系统

    摘要:本文给出一个性能高,使用简单的日志解决方案.本模块实现日志信息的批量写入文件,定时自动flush到文件中,写入文件的日志级别可动态调整,单个日志文件大小可配置,循环对日志文件写入,这样不会造成机 ...

  7. 微信/易信公共平台开发(一):开发了一个简单易用的PHP类(提供源码),十几行代码搞定一个公众号

    这两天学习了一下微信公共平台和易信公共平台的开发 (易信与微信协议是基本一样的)(PS:没听说过易信?你out了?) 公共平台开发原理这里就不讲了,如果是初次接触的同学,建议先看 David_Tang ...

  8. LowRecyclerView:一个简单强大的RecyclerView工具类

    尊重原创,转载注明:http://blog.csdn.net/qq_35980424/article/details/72899985 在开发过程中我们经常使用Listview.GridView等以列 ...

  9. [Apple Shapr3D]【续更】【shapr3D】认识Shapr3D,一个简单易用的设计类软件

    本文适合对象:工程设计.土木工程类的学生可以参考参考,以及对3D建模感兴趣的朋友!艺术设计的同学们,等等我!nomad我晚些再写!!! 使用的软件:Shapr3D 使用的硬件:iPad 9 gener ...

最新文章

  1. l bfgs算法java代码_优化算法——拟牛顿法之L-BFGS算法
  2. python if语句和循环语句
  3. 【网址收藏】WSL安装docker(不折腾版)
  4. 10 有关业务/事件类型WQ在年2021的号码范围不存在
  5. J2EE远程调试,远程debug你的线上Springboot项目
  6. 微软将本地版Exchange、SharePoint和Skype 纳入漏洞奖励计划
  7. 一个优质的Vue组件库应该遵循什么样的设计原则
  8. 如何成为一个AI产品经理?
  9. DataGear 自定义数据可视化图表
  10. 因果系列文章(1):因果推断及相关论文
  11. 苹果CMSV10本地DPLAYER播放器自动下一集设置教程
  12. 英语affrike非洲affrike单词
  13. mysql获取年月日周季度
  14. Oracle dual表详解(zzl)
  15. 06 - 微信公众号的菜单配置
  16. DataStage History
  17. 3dmax入门 | 学3d建模必备软件技能基础教学
  18. 计算机网络超级详细的总结(1)
  19. [转]漫画:混乱的标记语言XHTML2/HTML5(附中文版翻译)
  20. 5.19 c语言--循环选择--找到N个数中最大的一个数

热门文章

  1. 如何了解一个软件的设计?
  2. HVF5220-4D-03,HVF3230-3G-02先导型二位五通电磁阀
  3. 流氓软件卸载后又自动安装怎么办
  4. DataRow对象的RowState和DataRowVersion属性特点
  5. 服务器虚拟化的未来展望,IT号外:未来展望之拥抱虚拟化3.0
  6. python编写一个函数,输入n为偶数时,调用函数求1 / 2 + 1 / 4 + ... + 1 / n, 当输入n为奇数时,调用函数1 / 1 + 1 / 3 + ... + 1 / n(指针函数
  7. 计算机毕业设计基于asp.net的大学生交友网站
  8. 3.9使用ValidationSummary控件
  9. 如何正确使用HTTP代理?
  10. 商业模式创新与设计 -- 黄力泓