简易的日志类

打日志是开发不可或缺的功能, 它经常比断点好用, 并且可用性更广.

在很久以前, 我总习惯性的printf, cout, 把日志打印在控制台.

直到我发现, 这除了针对性的看日志, 并没有什么乱用.

你的程序提交到测试那里, 程序出现意外, 你不能指望测试给你提供崩溃当时的日志, 也不能及时赶到现场, 发动写轮眼记下原因.

所以, 日志除了打印在屏幕, 还要写日到文件...

 1     //    日志写入.
 2     class Log {
 3     public:
 4         //    日志结束符.
 5         class End {};
 6
 7         Log()
 8         {
 9         }
10
11         ~Log()
12         {
13             _logfile.close();
14         }
15
16         template <class T>
17         Log &operator <<(const T &value)
18         {
19             if (open())
20             {
21                 _osstream << value;
22             }
23             return *this;
24         }
25
26         Log &operator <<(const End &e)
27         {
28             auto now = std::chrono::system_clock::now();
29             auto time = std::chrono::system_clock::to_time_t(now);
30             auto str = ctime(&time);
31             _osstream << "\n" << str << "\n";
32             const auto &logstr = _osstream.str();
33             _osstream.str("");
34             _logfile << logstr << std::endl;
35             cocos2d::log("[log] %s", logstr.c_str());
36             return *this;
37         }
38
39     private:
40         bool open()
41         {
42             if (!_logfile.is_open())
43             {
44                 auto path = FileUtils::getInstance()->getWritablePath();
45                 auto full = path + "/game.log";
46                 _logfile.open(full, std::ios::app);
47
48                 *this << "\n\n\n-----------------game begin-----------------" << End();
49             }
50             return !!_logfile;
51         }
52         std::ofstream        _logfile;
53         std::ostringstream    _osstream;
54     };

这是C++风格的日志类, 通过重载运算符 << 来对流写入.

通过重载 End 来执行打印, 写入.

这个End是一个空类, 它主要用于区分, 让其执行收尾工作.

写入的内容通过一个 stirngstream 保存, 并且在收尾的时候清空.

1 extern Log glog;
2
3 glog << 123 << "|" << "hehehe" << Log::End;

咱们可以向上面这样使用.

在很多时候, 我们只需要一次写入一段字符串.

所以, 咱们可以定义一个宏.

extern lutils::Log glog;

#ifdef MMC_LOG
#define LLOG(str) \
    glog << __FILE__ << "|" << __LINE__ << "|" << str << lutils::Log::End()
#else
#define LLOG(str)
#endif

然后在需要的时候 LLOG("log1")..

这个LLOG通过MMC_LOG开关来控制...

时间: 2024-10-29 19:09:59

简易的日志类的相关文章

c++ 日志类 线程安全+缓存

根据上一次的测试,有缓存的日志类性能会更好.用到了time.h类函数,所以在linux下就要改动一下了,windows环境下写的. 思路采用(参照muduo库的日志,不过认为他线程不安全,和没用缓存,就改造了下) 1.有一个总的缓存,logboss,为一个恶汉模式的单例类,指针对象为智能指针,析构函数讲缓存写入文件. 2.有一个logger类,作为临时缓存,析构函数,将里面的缓存写入总缓存(在总缓存写入的时候加锁).如果缓存超过一定限度,就将前面的缓存写入文件先. void LogBoss::a

javadoc简易数组工具类文档(API)

制作简易数组工具类文档(API) 如何创建文档 以数组工具类(Array)为例一丶创建一个数组工具类  要求实现(1)遍历数组(2)求数组中的最大值(3)查询数组中的元素在数组中第一次出现的索引(4)将数组元素翻转并遍历 /** * 这是数组的一个工具类 * @author Apple * @version V1.0 * */ public class Array{  private Array(){ //将无参构造私有化,无法实例化  }    /**遍历数组  * @param arr :需

怎么样做好日志类的报警监控

上一篇文章写了普通数字类型类型的监控报警,本文谈一下怎么样做好日志类的监控和报警 一.日志类报警的特点 1.接受人员希望直接看到日志的内容: 2.对应技术栈涉及比较广的系统,,一个问题会引发不同主机上面不同系统同时产生日志.举例:openstack 的nova在保存快照时出错,会引起nova-api,galnce-api,horizen同时产生错误日志. 二.遇到的痛点: 1.有很多人想随时查看日志,不同的人想要查看不同的日志: 2.日志类的报警,不适合用微信直接发送内容,原因一是转义麻烦,二是

C++开源日志类

今天想给我的C++项目找一个开源的日志类,用于记录系统日志,结果浪费了半个下午的时间.从网上搜索相关资料,找到以下几个备选方案: 1.log4cplus 下载地址:http://sourceforge.net/projects/log4cplus/files/log4cplus-stable/1.1.0 2.log4cxx 下载地址:http://logging.apache.org/log4cxx/download.html (log4cxx 是由JAVA实现的 log4j 开源的,用C++实

C#日志类记录

每个程序都要和日志打交道.程序日志的质量直接影响了排除问题的难度.普通程序调试信息直接输出控制台,复杂程序则通过文本,xml等方式记录运行时的调试信息.在C#中Diagnostics命名空间下有一个微软提供的专门用于记录信息的TraceSource类.TraceSource的使用方法很简单,只需要4行代码 TraceSource ts = new TraceSource("Code.Main", SourceLevels.All); ts.Listeners.Add(new Conso

WorldWind源码剖析系列:日志类Log

Utility工程中的日志类Log主要用来输出Debug状态下的调试信息.该类的类图如下: 日志类Log中使用到的类和内嵌结构体类型主要有以下这些: public class LogEventArgs : EventArgs//日志事件参数 { public int level; public string category; public string message; public LogEventArgs(int _l, string _c, string _m) { level = _l

关于日志类Log4j的使用

log4j 的配置 1 #下面定义日志输出级别是 INFO,并且配置了2个输出目的地,一个是A3,一个是console 2 3 log4j.rootLogger = INFO,A3,CONSOLE 4 5 #日志最低的输出级别 6 log4j.appender.A3.Threshold=INFO 7 log4j.appender.A3.encoding=UTF-8 8 #每天产生一个文件DailyRollingFileAppender 9 log4j.appender.A3 = org.apac

android Loger日志类(获取内置sd卡)

Android手机自带内部存储路径的获取 原文地址:http://my.oschina.net/liucundong/blog/288183 直接贴代码: public static String getExternalSdCardPath() { if (SDCardUtils.isSDCardEnable()) { File sdCardFile = new File(Environment.getExternalStorageDirectory().getAbsolutePath());

日志类(三)TLog ①

功能未完善. 待续. 1 TLogThread = class(TThread) 2 private 3 FInterval: Integer; 4 FLogServers: TList; 5 FEvent: TEvent; 6 procedure SetInterval(pvInterval: Integer); 7 protected 8 property Interval: Integer read FInterval write SetInterval; 9 property LogSe