建立log記錄檔

來源:互聯網
上載者:User
#include "log.h"#include <string>#include <Shlwapi.h>#include <stdio.h>#include <fstream>#pragma comment( lib, "Shlwapi.lib" )using namespace std;#define LOG_MSG_SIZE ( 100 * 1024 )static wstring g_wsPath;static wstring g_wsFileName;static BOOL    g_bIsOpen = FALSE;static string ToStr( wstring WStr );//**************************************************////fun:若未初始化Log檔案路徑,則初始化Log檔案路徑////pa:PathLog輸出檔案路徑,預設為NULL,則輸出//到可指定檔案目前的目錄下,記錄檔名//與可執行檔名相同////**************************************************VOID LogInit( WCHAR* Path ){if ( NULL == Path ){if ( L"" == g_wsPath ){WCHAR* pwszPath = new WCHAR[_MAX_ENV];ZeroMemory( pwszPath, _MAX_ENV*sizeof(WCHAR) );GetModuleFileNameW( NULL, pwszPath, _MAX_ENV );WCHAR* pwszTemp = wcsrchr( pwszPath, L'.' );(*pwszTemp) = 0;g_wsPath = pwszPath;g_wsPath += L".log";delete[] pwszPath;}}else{g_wsPath = Path;}if ( L"" == g_wsFileName ){WCHAR* pwszPath = new WCHAR[_MAX_ENV];ZeroMemory( pwszPath, _MAX_ENV*sizeof(WCHAR) );GetModuleFileNameW( NULL, pwszPath, _MAX_ENV );WCHAR* pwszTemp = wcsrchr( pwszPath, '\\' );g_wsFileName = pwszPath + 1;delete[] pwszPath;}}//**************************************************////fun:輸出運行流程日誌////pa:Func函數名//File檔案名稱//Line行號//Msg流程日誌資訊////**************************************************VOID LogInfo( CHAR* Func, CHAR* File, DWORD Line, const WCHAR* Msg, ... ){while ( g_bIsOpen ){Sleep(10);}g_bIsOpen = TRUE;LogInit();WCHAR* pwszMsg = new WCHAR[LOG_MSG_SIZE];ZeroMemory( pwszMsg, LOG_MSG_SIZE*sizeof(WCHAR) );va_list ArgsList;va_start( ArgsList, Msg );vswprintf( pwszMsg, LOG_MSG_SIZE, Msg, ArgsList );va_end( ArgsList );string sMsg = ToStr( pwszMsg );fstream fFile;fFile.open( g_wsPath.c_str(), ios_base::out|ios_base::app );fFile<<"******************** Info ********************"<<endl<<endl;fFile<<sMsg.c_str()<<endl<<endl;fFile<<"Fun:    "<<Func<<endl;fFile<<"File:   "<<File<<endl;fFile<<"Line:   "<<Line<<endl;fFile<<"Exe:    "<<g_wsFileName.c_str()<<endl<<endl;fFile<<"******************** Info ********************"<<endl<<endl;fFile.close();g_bIsOpen = FALSE;delete[] pwszMsg;}//**************************************************////fun:輸出錯誤記錄檔////pa:Func函數名//File檔案名稱//Line行號//Msg流程日誌資訊////**************************************************VOID LogError( CHAR* Func, CHAR* File, DWORD Line, const WCHAR* Msg, ... ){while ( g_bIsOpen ){Sleep(10);}g_bIsOpen = TRUE;LogInit();WCHAR* pwszMsg = new WCHAR[LOG_MSG_SIZE];ZeroMemory( pwszMsg, LOG_MSG_SIZE*sizeof(WCHAR) );va_list ArgsList;va_start( ArgsList, Msg );vswprintf( pwszMsg, LOG_MSG_SIZE, Msg, ArgsList );va_end( ArgsList );string sMsg = ToStr( pwszMsg );fstream fFile;fFile.open( g_wsPath.c_str(), ios_base::out|ios_base::app );fFile<<"******************** Error ********************"<<endl<<endl;fFile<<sMsg.c_str()<<endl<<endl;fFile<<"Fun:    "<<Func<<endl;fFile<<"File:   "<<File<<endl;fFile<<"Line:   "<<Line<<endl;fFile<<"Exe:    "<<g_wsFileName.c_str()<<endl<<endl;fFile<<"******************** Error ********************"<<endl<<endl;fFile.close();g_bIsOpen = FALSE;delete[] pwszMsg;}//**************************************************////fun:輸出錯誤記錄檔////pa:Func函數名//File檔案名稱//Line行號//ErrCode錯誤碼//Msg流程日誌資訊////**************************************************VOID LogError( CHAR* Func, CHAR* File, DWORD Line, DWORD ErrCode, const WCHAR* Msg, ... ){while ( g_bIsOpen ){Sleep(10);}g_bIsOpen = TRUE;LogInit();WCHAR* pwszMsg = new WCHAR[LOG_MSG_SIZE];ZeroMemory( pwszMsg, LOG_MSG_SIZE*sizeof(WCHAR) );va_list ArgsList;va_start( ArgsList, Msg );vswprintf( pwszMsg, LOG_MSG_SIZE, Msg, ArgsList );va_end( ArgsList );string sMsg = ToStr( pwszMsg );fstream fFile;fFile.open( g_wsPath.c_str(), ios_base::out|ios_base::app );fFile<<"******************** Error ********************"<<endl<<endl;fFile<<sMsg.c_str()<<endl;fFile<<"Code:   "<<ErrCode<<endl<<endl;fFile<<"Fun:    "<<Func<<endl;fFile<<"File:   "<<File<<endl;fFile<<"Line:   "<<Line<<endl;fFile<<"Exe:    "<<g_wsFileName.c_str()<<endl<<endl;fFile<<"******************** Error ********************"<<endl<<endl;fFile.close();g_bIsOpen = FALSE;delete[] pwszMsg;}//**************************************************////fun:將Unicode字串轉換為UTF-8字串////pa:Func函數名//File檔案名稱//Line行號//Msg流程日誌資訊////**************************************************std::string ToStr( wstring WStr ){DWORD dwStrlen = WideCharToMultiByte( CP_ACP, 0, WStr.c_str(), -1, NULL, 0, NULL, NULL );CHAR* pDest = new CHAR[dwStrlen];dwStrlen = WideCharToMultiByte( CP_ACP, 0, WStr.c_str(), -1, pDest, dwStrlen, NULL, NULL );string sRes = pDest;delete[] pDest;return sRes;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.