少废话,直接看东西。
//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:
程序可以改进的地方还有很多,但是已经可以用了,在一般的程序里面运行不会有问题。