日志记录组件

http://blog.csdn.net/nxjbill/archive/2008/04/29/2342587.aspx

我的日志记录组件 - 东方散人 - CSDN博客

和大家分享下我写的日志记录文件组件。下面是一些定义和调用的封装。如存在bug,欢迎指正。

如需要demo程序和组件可去我在csdn下的下载资源或是去风华软件在线(www.fhuasoft.cn)网站上去下载。

//下面是定义文件

#ifndef _DEBUG_TRACE_2004
#define _DEBUG_TRACE_2004

#include <atlbase.h>
#include "logdeal.h"

#define DOUT_FILE 0x0001 //将调试信息输出到文件中去
#define DOUT_VIEW 0x0002 //将调试信息输出到DebugView中去
#define DOUT_ALL 0xffff //将调试信息发到所有接受调试信息的模块中去

class CLog
{
public:
CLog();
~CLog();

static CLog* Create();
BOOL Trace(BSTR s);
void AddRef();
void Release();
private:
CComPtr<ILOG>m_pLog;
static CLog *plog;

DWORD m_dwRef;
CRITICAL_SECTION m_cr;
};

#define DEBUG_TRACE
#ifdef DEBUG_TRACE
BOOL DebugTrace(LPCTSTR lpszFormat,...);
BOOL DLOGTrace(LPCTSTR lpszFormat,...);
BOOL DTrace(int, LPCTSTR lpszFormat,...);
#define DG DTrace
#define DT DebugTrace
#define _DT DEBUG_TRACE
#else
#define DT
#define DG
#undef _DT
#endif

#endif

//下面是实现文件

#include "stdafx.h"
#include <AFXPRIV.H>
#include "DT.h"

#ifdef DEBUG_TRACE
BOOL DebugTrace(LPCTSTR lpszFormat,...)
{
ASSERT(AfxIsValidString(lpszFormat));

static HWND hwnd = ::FindWindowA(NULL, "DbgView");
if(!IsWindow(hwnd))
hwnd = ::FindWindowA(NULL, "DbgView");

if(hwnd)
{
CString szMsg;

va_list argList;
va_start(argList, lpszFormat);
try
{
szMsg.FormatV(lpszFormat, argList);
}
catch(...)
{
szMsg = "DebugHelper输出字符串格式错误!";
}
va_end(argList);
DWORD dwId = GetCurrentProcessId();
::SendMessage(hwnd,WM_SETTEXT,dwId,(LPARAM)(LPCTSTR)szMsg);
return TRUE;
}
return FALSE;
}
BOOL DLOGTrace(LPCTSTR lpszFormat,...)
{
ASSERT(AfxIsValidString(lpszFormat));

{
CString szMsg;

va_list argList;
va_start(argList, lpszFormat);
try
{
szMsg.FormatV(lpszFormat, argList);
}
catch(...)
{
szMsg = "DebugView输出字符串格式错误!";
}
va_end(argList);
CLog *log = CLog::Create();
log->Trace(szMsg.AllocSysString());
log->Release();
return TRUE;
}
return FALSE;
}

BOOL DTrace(int ntype, LPCTSTR lpszFormat,...)
{
static int nt = -1;
if(nt < 0);

if(ntype & DOUT_FILE)
DLOGTrace(lpszFormat);
if(ntype & DOUT_VIEW)
DebugTrace(lpszFormat);

return TRUE;
}
#endif

#include "logdeal_i.c"
CLog *CLog::plog = NULL;
CLog::CLog()
{
CoInitialize(NULL);
::CoCreateInstance(CLSID_LOG , NULL, CLSCTX_INPROC, IID_ILOG,
(void **)&m_pLog);
plog = NULL;

InitializeCriticalSection(&m_cr);
//取文件名
TCHAR buf[MAX_PATH] ={0};
TCHAR *s;
TCHAR str[MAX_PATH] = {0};
GetModuleFileName(NULL, buf, MAX_PATH);
s = _tcsrchr(buf, '//');
_tcsncpy(str, buf, _tcslen(buf) - _tcslen(s));
SYSTEMTIME t;
GetSystemTime(&t);
_stprintf(buf, "//%02d%02d%02d%02d%02d%02d%", t.wYear, t.wMonth, t.wDay,
t.wHour, t.wMinute, t.wSecond);
_tcscat(str, buf);
_tcscat(str, _T(".txt"));
USES_CONVERSION;
if(m_pLog)
m_pLog->SetFile(T2W(str));
m_dwRef = 0;
}
CLog::~CLog()
{
if(m_pLog)
{
m_pLog.Release();
}
::CoUninitialize();
// if(CLog::m_pLog)
}
CLog *CLog::Create()
{
if(plog == NULL)
{
plog = new CLog();
}
plog->AddRef();
return plog;
}
void CLog::AddRef()
{
EnterCriticalSection(&m_cr);
m_dwRef ++;
LeaveCriticalSection(&m_cr);
}
void CLog::Release()
{
EnterCriticalSection(&m_cr);
m_dwRef --;
if(m_dwRef == 0)
{
DeleteCriticalSection(&m_cr);
delete plog;
}
else
LeaveCriticalSection(&m_cr);
}
BOOL CLog::Trace(BSTR s)
{
if(plog && m_pLog)
{
EnterCriticalSection(&m_cr);
HRESULT hr = m_pLog->Trace(s) ;
LeaveCriticalSection(&m_cr);

return hr == S_OK;
}
return FALSE;
}



原文地址:https://www.cnblogs.com/carl2380/p/2317360.html