编写一个通用的日志组件
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)
{