线程安全的日志类设计
最近在写多线程方面的内容, 其实多线程开发设计清楚了在写, 并不会有太大的坑, 尽管如此, 难免有需要调试的时候, 多线程的程序单步调试有时候难以发现bug, 通过记录日志, 可以用来查找问题, 方便调试.
其实有不少开源的C++日志库, 比如大名鼎鼎的log4cxx, 轻量级的glog, 还有一些热心的同行提供的开源工程, 我大体看了几个, 觉得不是很符合我的胃口, 于是就花了一天的时间, 自己写了一个, 用起来还比较顺手, 想怎么改就怎么改, 目前还是比较适合需求的.
考虑到线程安全, 就有很多要注意的地方, 比如两个线程同时用std::cout来输出信息, 几乎总是会出现冲突, 而处于性能等方面的考虑, 标准库并不提供线程安全的输入输出流, 自己实现一个线程安全的类似的库, 工作量也不小, 我就避开了这个问题, 沿用原来的类, 但是在输出的时候, 每次只能输出一条日志, 不管有多少个线程, 他们写日志的时候, 也是一次写完一条, 然后压入日志缓冲区间, 通过日志线程, 不断的从缓冲区间取出日志, 并输出到控制台上, 同时IO交由日志线程来处理, 不会耽误主线程的时间. 唯一加锁的地方, 就是日志缓冲区那里, 这样会导致多少性能损失, 之后再详细分析一下.
关于字符串格式化, 这个有各种方式, 有printf风格的, 有流风格的, 简单的情况下, 流风格<<, 还可以用, 太复杂的格式化, 就过于繁琐了, sprintf, 不够安全, 可以使用更加安全的函数, 也可以使用boost::format, 方便实用跨平台, 虽然效率比起printf和stringstream都慢了点.