编写一个通用的日志组件

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

编写一个通用的日志组件

编写程序通常要输出日志,这样程序如果运行出错,就可以通过日志查看出错的原因。下面就利用VC++编写一个通用的日志组件。当一个新的项目来临时,就可以直接使用了。该组件为windows 环境下标准的动态链接库,除了VC++外,其他语言如VB,C#也可以调用。

在头文件里定义几个输出接口

实现代码:

bool g_bFileOpen = false;

FILE * g_pFile = 0;

TCHAR g_tszErrorInfo[100] = {0};

TCHAR g_tszLogFilePath[_MAX_DIR] = {0};

CRITICAL_SECTION g_cs;

TCHAR g_tszOldFileName[50] = {0};

WSLOG_API bool SetLogFilePath(LPCTSTR ptszLogFilePath)

{

int iLen = _tcslen(ptszLogFilePath);

if (iLen > _MAX_DIR)

{

_tcscpy(g_tszErrorInfo, _T("路径太长!"));

return false;

}

// 如果是多层,需要创建各层文件夹

bool bRet;

int startPos=0;

const TCHAR * pos = _tcsstr(ptszLogFilePath, _T("\\"));

while(pos)

{

TCHAR cTmpValue[_MAX_DIR];

memset(cTmpValue, 0, _MAX_DIR);

_tcsncpy(cTmpValue, ptszLogFilePath, pos - ptszLogFilePath + 1);

bRet = SetCurrentDirectory(cTmpValue);

if(!bRet) //文件夹不存在,需要建立

{

BOOL bRet2 = CreateDirectory( cTmpValue, NULL );

if ( FALSE == bRet2 )

{

memset(g_tszErrorInfo, 0, 100 * sizeof(TCHAR));

_tcscpy(g_tszErrorInfo, _T("文件夹创建失败!"));

return false;

}

}

startPos = pos - ptszLogFilePath + 1;

pos = _tcsstr(ptszLogFilePath + startPos, _T("\\"));

}

::CreateDirectory(ptszLogFilePath, NULL);

_tcscpy(g_tszLogFilePath, ptszLogFilePath);

::InitializeCriticalSection(&g_cs);

return true;

}

WSLOG_API bool WriteLog(EM_LOG_TYPE emLogType, LPCTSTR ptszInfo)

{

if (_tcslen(g_tszLogFilePath) == 0)

{

_tcscpy(g_tszErrorInfo, _T("未指定日志存放目录!"));

return false;

}

::EnterCriticalSection(&g_cs); // 线程同步

SYSTEMTIME st;

GetLocalTime(&st);

// 先打开文件

TCHAR tszFileName[MAX_PATH] = {0};

if (g_pFile == NULL)

{

TCHAR tszDate[50] = {0};

_stprintf(tszDate, _T("%d-%02d-%02d.txt"), st.wYear, st.wMonth, st.wDay);

_tcscpy_s(tszFileName, MAX_PATH, g_tszLogFilePath);

int iLen = _tcslen(g_tszLogFilePath);

if (g_tszLogFilePath[iLen - 1] == _T('\\') || g_tszLogFilePath[iLen - 1] == _T('/')) _tcscat(tszFileName, tszDate);

else

{

_tcscat(tszFileName, _T("\\"));

_tcscat(tszFileName, tszDate);

}

g_pFile = _tfopen(tszFileName, _T("a+"));

}

else // 日志文件已经打开

{

TCHAR tszDate[50] = {0};

_stprintf(tszDate, _T("%d-%02d-%02d.txt"), st.wYear, st.wMonth, st.wDay);

if (_tcscmp(tszDate, g_tszOldFileName) != 0) // 不一样,说明日期变了

{

fclose(g_pFile);

g_pFile = NULL;

_tcscpy_s(tszFileName, MAX_PATH, g_tszLogFilePath);

int iLen = _tcslen(g_tszLogFilePath);

if (g_tszLogFilePath[iLen - 1] == _T('\\') || g_tszLogFilePath[iLen - 1] == _T('/')) _tcscat(tszFileName, tszDate);

else

{

_tcscat(tszFileName, _T("\\"));

_tcscat(tszFileName, tszDate);

}

g_pFile = _tfopen(tszFileName, _T("a+"));

_tcscpy(g_tszOldFileName, tszDate);

}

}

// 写日志

char szTime[50] = {0};

sprintf(szTime, "[%d-%02d-%02d %02d:%02d:%02d:%03d]", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);

fwrite(szTime, strlen(szTime), 1, g_pFile);

char szLogType[50] = {0};

switch (emLogType)

{

相关文档
最新文档