关闭

MFC 产生log日志文件的问题

466人阅读 评论(0) 收藏 举报
分类:

使用技巧

#ifdef _SAVE_DEBUG_LOG_FILE

void log_debug(DWORD, LPCTSTR, LPCTSTR, INT );

#define LOG_DEBUG(x, y) do{ \
 log_debug( x, y, _T(__FUNCTION__), __LINE__);\
}while(0)

#else

#define LOG_DEBUG(x, y) do{ \
}while(0)
#endif

 

//枚举错误的级别

enum E_LOG_OUTPUT_TYPE
{
 E_LOGTYPE_FAILED  =-1,
 E_LOGTYPE_INFOMATION = 0,
 E_LOGTYPE_SUCCEEDED  =1
};

#define _SAVE_DEBUG_LOG_FILE

通过宏的定义去决定是否保存debug信息

#ifdef _SAVE_DEBUG_LOG_FILE

void log_debug(DWORD, LPCTSTR, LPCTSTR, INT );

#define LOG_DEBUG(x, y) do{ \
 log_debug( x, y, _T(__FUNCTION__), __LINE__);\
}while(0)

#else

#define LOG_DEBUG(x, y) do{ \
}while(0)
#endif

 

static void log_debug( DWORD dwErrorCode,LPCTSTR lpOutputString, LPCTSTR func, INT line )
{

#define MAX_PATH_SIZE(0x100) 

 static BOOL bInited =false;
 static CStdioFile log;

 if( false == bInited)
 {
  TCHARtcPath[MAX_PATH_SIZE];
  GetModuleFileName(NULL, tcPath,MAX_PATH_SIZE);//检索当前进程所执行的可执行文件的路径,就是获得当前可执行文件的路径

  CStringfilename(tcPath);
  CString  strLogName(tcPath);
  CString  strLogDir;
  INT index =filename.ReverseFind(_T('\\'));//返回的是该字符串所在的位置索引
  if( -1 != index )
  {
   INT len =filename.GetLength();
   ++index;
   filename.Delete(index,len - index);//这样就找到了可执行文件的名字了

   strLogDir= filename;
   strLogDir +=_T("Log\\");
   CreateDirectory(strLogDir,NULL);//成功的话返回值非零
   CStringstrTemp;
   strLogName.Delete(0,index);
   strTemp =strLogName.Mid(0,strLogName.ReverseFind(_T('.')));//返回值是整体到点结束的字符串
   time_tnowTime;
   time(&nowTime);//添加此时的秒数
   strLogName.Format(_T("Log\\RUN_%s_%d_LOG.txt"),strTemp, nowTime);//定义文件log的名称是。。。
  }

  
  
  filename +=strLogName;//文件名称的路径
  log.Open( filename,CFile::modeCreate | CFile::modeNoTruncate | CFile::shareDenyWrite |CFile::modeWrite );//用这样的模式进程创建或者检查文件名称的路径
  bInited =true;然后给标志一个新的标志,对此标志进行判断的时候就可以防止(在多次进行写入该次程序运行的时候多个地方的log信息)多次打开文件log文件。
 }

 char* org = _strdup(setlocale(LC_CTYPE,NULL));//为setlocale(LC_CTYPE,NULL)分配空间副本,需要头文件是#include<locale.h>
 setlocale( LC_CTYPE,"chs" );//支持简体中文


 //设置当前系统的时间
 CString  strErrorCodeInfo;
 switch(dwErrorCode)
 {
 case E_LOGTYPE_FAILED:
  strErrorCodeInfo =_T("FAILED---------->");
  break;
 case E_LOGTYPE_SUCCEEDED:
  strErrorCodeInfo =_T("SUCCEEDED------->");
  break;
 case E_LOGTYPE_INFOMATION:
  strErrorCodeInfo =_T("INFOMATION------>");
  break;
 default:
  strErrorCodeInfo =_T("OTHER----------->");
  break;
 }

 

 CTime myTime =CTime::GetCurrentTime();
 CString strTime;
 strTime.Format( _T("%d-%-d%-d %d:%d:%d"),
  myTime.GetYear(),
  myTime.GetMonth(),
  myTime.GetDay(),
  myTime.GetHour(),
  myTime.GetMinute(),
  myTime.GetSecond() );
 CString output;
 output.Format(_T("<%s>line: d - %s : %s%s\r\n"), //文件内容的格式
  strTime,
  line,
  func,
  strErrorCodeInfo,
  lpOutputString);

 log.WriteString(output);
 log.Flush();//强制缓冲区的内容写入指定文件

 

 setlocale( LC_CTYPE, org);
 free( org );

 return;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:1040507次
    • 积分:18213
    • 等级:
    • 排名:第522名
    • 原创:741篇
    • 转载:522篇
    • 译文:0篇
    • 评论:106条
    最新评论