一个小而轻便的日志类

前段时间修改同事用C++写的DXF文件转换程序,那个组件支持DXF<-->XML双向转换,而我只需要单向就行,但是需要能转多个图层,而且属性比较多。在修改过程中,感觉写日志很烦,原来的程序只提供一个全局的log(const char *szMsg)方法,如果想把对象属性写到日志文件中都比较麻烦。我想如果能够写一个类似printf()的方法多好,结果还真的让我找到了,代码如下:
#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  " logger.h "

void  testLogger()
...
{
      Logger
& logger = Logger::getLogger();
 
      logger.log(
"%s, 1+13=%d ""Hi"1+13 );

      Logger::getLogger().log(
"Hello world!");
}
用法类似log4j,不过简单多了:-)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值