前段时间修改同事用C++写的DXF文件转换程序,那个组件支持DXF<-->XML双向转换,而我只需要单向就行,但是需要能转多个图层,而且属性比较多。在修改过程中,感觉写日志很烦,原来的程序只提供一个全局的log(const char *szMsg)方法,如果想把对象属性写到日志文件中都比较麻烦。我想如果能够写一个类似printf()的方法多好,结果还真的让我找到了,代码如下:
用起来非常简单:
用法类似log4j,不过简单多了:-)
#pragma once
#include < stdarg.h >
#include < stdio.h >
class Logger
{
private:
char szFileName[MAX_PATH];
Logger(void) //ctor hidden
{
char *ptr;
GetModuleFileName(NULL, szFileName, sizeof(szFileName));
ptr = strrchr(szFileName, '.');
if(ptr)
*(ptr+1) = '';
strcat_s(szFileName, sizeof(szFileName), "log");
}
~Logger(void){}; //dtor hidden
Logger(Logger const&){}; //copy ctor hidden
Logger operator =(Logger const&){}; //assign op hidden
public:
static Logger& getLogger(void)
{
static Logger single;
return single;
}
void log(const char *format, ...)
{
FILE *fi;
errno_t errNum = fopen_s(&fi, szFileName, "a+");
if(fi == NULL)
return;
va_list argptr;
va_start(argptr, format);
vfprintf(fi, format, argptr);
va_end(argptr);
fclose(fi);
}
void logWithTimeStamp(const char *format, ...)
{
FILE *fi;
SYSTEMTIME st;
errno_t errNum = fopen_s(&fi, szFileName, "a+");
if(fi == NULL)
return;
GetLocalTime(&st);
fprintf(fi, "%d-%02d-%02d %02d:%02d:%02d ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
va_list argptr;
va_start(argptr, format);
vfprintf(fi, format, argptr);
va_end(argptr);
fclose(fi);
}
} ;
#include < stdarg.h >
#include < stdio.h >
class Logger
{
private:
char szFileName[MAX_PATH];
Logger(void) //ctor hidden
{
char *ptr;
GetModuleFileName(NULL, szFileName, sizeof(szFileName));
ptr = strrchr(szFileName, '.');
if(ptr)
*(ptr+1) = '';
strcat_s(szFileName, sizeof(szFileName), "log");
}
~Logger(void){}; //dtor hidden
Logger(Logger const&){}; //copy ctor hidden
Logger operator =(Logger const&){}; //assign op hidden
public:
static Logger& getLogger(void)
{
static Logger single;
return single;
}
void log(const char *format, ...)
{
FILE *fi;
errno_t errNum = fopen_s(&fi, szFileName, "a+");
if(fi == NULL)
return;
va_list argptr;
va_start(argptr, format);
vfprintf(fi, format, argptr);
va_end(argptr);
fclose(fi);
}
void logWithTimeStamp(const char *format, ...)
{
FILE *fi;
SYSTEMTIME st;
errno_t errNum = fopen_s(&fi, szFileName, "a+");
if(fi == NULL)
return;
GetLocalTime(&st);
fprintf(fi, "%d-%02d-%02d %02d:%02d:%02d ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond);
va_list argptr;
va_start(argptr, format);
vfprintf(fi, format, argptr);
va_end(argptr);
fclose(fi);
}
} ;
用起来非常简单:
#include
"
logger.h
"
void testLogger()
... {
Logger& logger = Logger::getLogger();
logger.log("%s, 1+13=%d ", "Hi", 1+13 );
Logger::getLogger().log("Hello world!");
}
void testLogger()
... {
Logger& logger = Logger::getLogger();
logger.log("%s, 1+13=%d ", "Hi", 1+13 );
Logger::getLogger().log("Hello world!");
}