C++下的简单Logtrace的编写

这个博客介绍了如何在C++中编写一个简单的日志跟踪类LOG,包括设置日志文件、查看日志、设置前缀等方法。通过示例展示了如何在代码中使用这个日志系统进行调试和警告信息的输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <afx.h>
#include <shellapi.h>

class LOG
{
public:
 LOG();
 virtual ~LOG();
public:
 static CString  GetLogFile();
 static short  SetLogFile(LPCTSTR strPath);
 static short  ViewLogFile();  

 static short  SetPrefix(LPCTSTR strPrefix);

 static CString  sOutV(LPCTSTR strType, LPCTSTR strFormat = NULL, va_list valist = NULL);
 static CString  sOut0(LPCTSTR strType, LPCTSTR strFormat = NULL,...);
 static CString  sOut ( LPCTSTR strFormat = NULL,...); 

 static short  OutV(LPCTSTR strType, LPCTSTR strFormat = NULL, va_list valist = NULL);
 static short  Out0(LPCTSTR strType, LPCTSTR strFormat = NULL,...);
 static short  Out (LPCTSTR strFormat = NULL,...);

protected:
 static CString  s_strLogFile;
 static CString  s_strLogPrefix;
 static HANDLE  s_hWriteEvent;
};

 

//////////////////////////////////////////////////////////////////////////////////////////

#include "LogTrace.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

 

// 得到可执行程序所在目录
//  BOOL bIncludeSep -- 是否包含最后的分隔符"/"

CString GetExePath(BOOL bIncludeSep)
{
 // 得到当前的文件名
 CString strFileName;   
 GetModuleFileName(GetModuleHandle(0) ,strFileName.GetBuffer(_MAX_PATH),_MAX_PATH);
 strFileName.ReleaseBuffer();   
 
 // 得到当前目录
 strFileName=strFileName.Left(strFileName.ReverseFind(_T('//'))+1); 
 
 if(bIncludeSep) 
  return strFileName;
 else  return strFileName.Left(strFileName.GetLength()-1);
}//-获取最后的文件名 如果给定文件不是全路径,就是相对于exe-

CString GetFileForExePath(LPCTSTR strCurFileName)
{
 CString strPath = strCurFileName;  
 if(!strPath.IsEmpty())  {
  //-相对路径-      
  if(strPath.Find(_T(":"))<=0)           
  {              
   strPath.Format(_T("%s%s"), GetExePath(FALSE), strCurFileName);
  }     
 }      
 return strPath; 
}  

#define LOG_EVENT _T("ChyLogWrite")
CString LOG::s_strLogFile = _T(""); 
CString LOG::s_strLogPrefix = _T(""); 
HANDLE LOG::s_hWriteEvent = NULL; 

LOG::LOG() 
{

}   

LOG::~LOG() 
{

}   

short LOG::SetLogFile(LPCTSTR strPath)
{
 if(strPath==NULL || strPath[0]==0)
  s_strLogFile = GetFileForExePath(L"log.log");
 else  s_strLogFile = GetFileForExePath(strPath);
 return 1;
}

CString LOG::GetLogFile()
{
 return s_strLogFile;
}

short LOG::ViewLogFile()
{
 CString strLogFile = GetLogFile();
 ShellExecute(NULL, _T("open"), strLogFile, NULL, NULL, SW_SHOW);
 return strLogFile.IsEmpty()?0:1;
}

short LOG::SetPrefix(LPCTSTR strPrefix)
{
 if(strPrefix && strPrefix[0])
 { 
  s_strLogPrefix = strPrefix;
 } 
 return 1;
}

CString LOG::sOutV(LPCTSTR strType, LPCTSTR strFormat, va_list valist)

 CString   strPart_Prefix;
 if(!s_strLogPrefix.IsEmpty())
 { 
  strPart_Prefix.Format(_T("[%s]"), s_strLogPrefix);
 } 
 CString   strPart_Time;
 {  SYSTEMTIME sysTime  = {0};
 GetLocalTime(&sysTime); 
 strPart_Time.Format(_T("[%2d-%2d %2d:%2d:%2d_%3d]"),   
  sysTime.wMonth, sysTime.wDay,    
  sysTime.wHour, sysTime.wMinute, sysTime.wSecond,   
  sysTime.wMilliseconds);  
 } 
 
 CString   strPart_Type;
 if(strType && strType[0])
 { 
  strPart_Type.Format(_T("[%s]"), strType);
 } 
 
 CString   strPart_Info;
 {    
  strPart_Info.FormatV(strFormat, valist);
 }  
 
 CString str = strPart_Prefix + strPart_Time + strPart_Type+ strPart_Info;
 
 return str;
}

CString LOG::sOut0(LPCTSTR strType, LPCTSTR strFormat,...)
{
 va_list  valist;
 va_start(valist, strFormat);    
 CString strInfo = sOutV(strType, strFormat, valist);
 va_end(valist);  return strInfo;
}

CString LOG::sOut(LPCTSTR strFormat,...)
{
 va_list  valist;
 va_start(valist, strFormat);
 CString strInfo = sOutV(NULL, strFormat, valist);
 va_end(valist); 
 
 return strInfo;
}

short LOG::OutV(LPCTSTR strType, LPCTSTR strFormat, va_list valist)

{
 //--
 if(s_hWriteEvent==NULL)
 { 
  s_hWriteEvent = OpenEvent(0, FALSE,LOG_EVENT); 
  if(s_hWriteEvent==NULL)  
   s_hWriteEvent = CreateEvent(NULL, FALSE, TRUE, LOG_EVENT); 
 }
 WaitForSingleObject(s_hWriteEvent, INFINITE);

 //-打开关闭文件-
 if(s_strLogFile.IsEmpty())  SetLogFile(NULL);
 CStdioFile file;
 if(file.Open(s_strLogFile, CFile::modeCreate|CFile::modeNoTruncate|CFile::modeWrite))
 {
  CString  strPart_NewLine = _T("/n"); 
  CString  strInfo = sOutV(strType, strFormat, valist);   
  CString  str = strPart_NewLine + strInfo; 
  file.SeekToEnd(); 
  file.WriteString(str); 
  file.Close();
 } 
 SetEvent(s_hWriteEvent);
 return 1;
}

short LOG::Out0(LPCTSTR strType, LPCTSTR strFormat,...)
{
 va_list  valist;
 va_start(valist, strFormat);    
 short rtn = OutV(strType, strFormat, valist);
 va_end(valist); 
 return rtn;
}

short LOG::Out(LPCTSTR strFormat,...)
{
 va_list  valist;
 va_start(valist, strFormat);
 short rtn = OutV(NULL, strFormat, valist);
 va_end(valist);
 return rtn;
}

 

/////////////////////////////////////////////////////////

 

使用,在要产生log的地方

 

#include "LogTrace.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif

 

然后使用:

   LOG::Out0(L"debug", L"hello");
   LOG::Out0(L"warn5", L"hello %d", 25);
   LOG::Out0(L"warn3", L"hello %s, you have %d apples!", L"libai", 10);
   LOG::Out (L"hello %s, you have %d apples!", L"libai", 10);

 

就可以了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liangls1982

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值