LogMgr.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:4k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. #include "stdafx.h"
  20. #include "LogMgr.h"
  21. //直接传filename进来,一个绝对路径
  22. LogMgr::LogMgr()
  23. {
  24. m_bPrintTime = TRUE;
  25. m_tBuf[0] = 0;
  26. }
  27. LogMgr::LogMgr(string fileName) : m_fileName(fileName) {
  28. m_bPrintTime = TRUE;
  29. m_tBuf[0] = 0;
  30. }
  31. LogMgr::LogMgr(LogMgr& logmgr)
  32. {
  33. m_fileName = logmgr.m_fileName;
  34. m_bPrintTime = logmgr.m_bPrintTime;
  35. strcpy(m_tBuf, logmgr.m_tBuf);
  36. }
  37. LogMgr::~LogMgr() {
  38. Uninit();
  39. }
  40. P2P_RETURN_TYPE LogMgr::Init(string fileName) {
  41. m_fileName = fileName;
  42. struct tm *newtime;
  43. time_t long_time;
  44. time( &long_time );                /* Get time as long integer. */
  45. newtime = localtime( &long_time ); /* Convert to local time. */
  46. if(!newtime)
  47. return PRT_SYS;
  48. TCHAR buf[MAX_PATH_EX] = _T("");
  49. sprintf(buf, "%d-%d-%d-%d-%d-%d-%d.tmp", 
  50. newtime->tm_year+1900, newtime->tm_mon+1, newtime->tm_mday, 
  51. newtime->tm_hour, newtime->tm_min, newtime->tm_sec, GetTickCount());
  52. m_fileName.append(buf);
  53. // 4. 打开文件
  54. m_ofs.open(m_fileName.data(), ios_base::out | ios_base::trunc);
  55. if(!m_ofs.is_open()) {
  56. // 如果此日志文件已经被占用,则返回错误
  57. printf("无法打开日志文件: %s.n", m_fileName.data());
  58. return PRT_SYS;
  59. }
  60. return PRT_OK;
  61. }
  62. void LogMgr::Uninit() {
  63. m_ofs.close();
  64. // 退出的时候不删除日志
  65. //remove(m_fileName.data());
  66. }
  67. void LogMgr::StatusOut(const char* fmt, ...) {
  68. // 听了某妄人的言论之后,我使用 operator!()代替了is_open(),结果在m_ofs.close()之后,
  69. // operator!()仍然返回成功!然后在试图写入数据的地方抛出了exception, 恨!
  70. // 可能is_open()只能判断打开是否成功,不能确定打开是否正确,但是!operator!()也太不符合习惯了
  71. if(!m_ofs.is_open() || !fmt)
  72. return;
  73. m_tBuf[0] = 0;
  74. if(m_bPrintTime) {
  75. struct tm *newtime;
  76. time_t long_time;
  77. time( &long_time );                /* Get time as long integer. */
  78. newtime = localtime( &long_time ); /* Convert to local time. */
  79. if(newtime)
  80. sprintf(m_tBuf, "%.8s.%d: ", asctime(newtime)+11, GetTickCount()%1000);
  81. }
  82. // parse that string format
  83. try {
  84. va_list argptr;
  85. va_start(argptr, fmt);
  86. _vsnprintf(m_tBuf+strlen(m_tBuf), TBUF_SIZE, fmt, argptr);
  87. va_end(argptr);
  88. printf("%sn", m_tBuf);
  89. m_ofs<<m_tBuf<<endl;
  90. m_ofs.flush();
  91. }
  92. catch(...) {
  93. assert(0);
  94. m_tBuf[0] = 0;
  95. }
  96. }
  97. void LogMgr::StatusErr(const char* title, int errcode) {
  98. if(!m_ofs.is_open() || !title)
  99. return;
  100. LPVOID lpMsgBuf = NULL;
  101. FormatMessage( 
  102. FORMAT_MESSAGE_ALLOCATE_BUFFER | 
  103. FORMAT_MESSAGE_FROM_SYSTEM | 
  104. FORMAT_MESSAGE_IGNORE_INSERTS,
  105. NULL,
  106. errcode,
  107. MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
  108. (LPTSTR) &lpMsgBuf,
  109. 0,
  110. NULL 
  111. );
  112. if(lpMsgBuf)
  113. StatusOut("%s. Error(%d): %s", title, errcode, (LPCTSTR)lpMsgBuf);
  114. LocalFree(lpMsgBuf);
  115. }
  116. void LogMgr::RemoveOldTmpFile(const char* prefix, const char* tmpPath) {
  117. if(!tmpPath || !prefix)
  118. return;
  119. WIN32_FIND_DATA fileData;
  120. string match = tmpPath;
  121. match.append(prefix);
  122. match.append("*.tmp");
  123. HANDLE hFind = FindFirstFile(match.data(), &fileData);
  124. if(hFind == INVALID_HANDLE_VALUE)
  125. return;
  126. for(;;) {
  127. string path = tmpPath;
  128. path.append(fileData.cFileName);
  129. DeleteFile(path.data());
  130. if(!FindNextFile(hFind, &fileData))
  131. break; 
  132. }
  133. FindClose(hFind);
  134. }