只启动了一个线程 用来写日志.
性能方面没问题, 支持多线程写入.
每3秒自动查看缓冲区是否有数据,有就写入 .或者外部N个线程同时写满一块缓冲区,进行写入.
主要是减少少量数据[几个字节]就写入一次的次数.
写入方面可以用 WriteFile 或者 _fwrite_nolock. 如果用用 WriteFile 还可以使用APC来通知,目前没此需求
另外,写入出错方面,只是简单的打印,可自行修改的完善一些
如果没有别的需求,直接使用Log类即可
Log : start() 启动, stop() 停止 ,append() 写入日志 就3个函数;
-----------------------------------------------------------------------------------------
LogBuffer : Log 用于存放日志的缓冲区
FileWriter : Log 用于创建文件,写文件
FileObject : FileWriter 用来真正写入文件的, 封装了文件指针
一个cpp 文件:
#include <Windows.h>
#include <iostream>
#include <functional>
#include <process.h>
#include <vector>
#include <memory>
#include <string>
#include <atomic>
#include <assert.h>
#include <time.h>
__thread char szErrorBuffer[MAX_PATH] = {0};
class FileObject{
public:
enum Enum_WriteBuffer { WriteBufferSize = 64 * 1024};
FileObject(const std::string & filename)
: __fp(fopen(filename.c_str(),"a+")),
__iError(0)
{
assert(NULL != __fp);
setbuf(__fp,__szBuffer);
}
~FileObject() {
::fclose(__fp);
}
void printError() {
strerror_s(szErrorBuffer,sizeof(szErrorBuffer),__iError);
std::cout << szErrorBuffer << std::endl;
}
bool Write(const char * data, const size_t & iLen) {
if(0 != __iError)
return false;
int iLeft = iLen;
int iPos = 0;
int iRet = 0;
bool bError = false;
while(iLeft > 0){
iRet = ::_fwrite_nolock(data + iPos,sizeof(char) ,iLeft,__fp); // WriteFile
if(ferror(__fp) != 0){
__iError = errno;
b