MyLog.cpp 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include "stdafx.h"
  2. #include "MyLog.h"
  3. MyLog::MyLog(FILE_TYPE type)
  4. {
  5. flag = false;
  6. fileType = type;
  7. curFileCount = 0;
  8. strExeDir = GetExeDir();
  9. if (fileType >= 0 && fileType < FILE_TYPE_TOTLA) {
  10. status = false;
  11. InitLogConfig();
  12. flag = true;
  13. }
  14. }
  15. MyLog::MyLog(FILE_TYPE type,bool status)
  16. {
  17. flag = false;
  18. fileType = type;
  19. curFileCount = 0;
  20. this->status = status;
  21. strExeDir = GetExeDir();
  22. if (fileType >= 0 && fileType < FILE_TYPE_TOTLA) {
  23. InitLogConfig();
  24. flag = true;
  25. }
  26. }
  27. MyLog::~MyLog()
  28. {
  29. //pCategory->shutdown();
  30. }
  31. int MyLog::WriteLog(const std::string msg)
  32. {
  33. pCategory->info(msg.c_str());
  34. //如果日志文件超过大小,则开启新文件名
  35. if (false)
  36. {
  37. curFileCount++;
  38. curFileName = GetFileName();
  39. pAppender = new log4cpp::FileAppender("default", curFileName.c_str());
  40. pAppender->setLayout(pLayout);
  41. pCategory->addAppender(pAppender);
  42. }
  43. return 0;
  44. }
  45. int MyLog::WriteLog(const char * pMsg,...)
  46. {
  47. va_list args;
  48. char log[1024];
  49. va_start(args, pMsg);
  50. vsnprintf_s(log,1024-1,pMsg,args);
  51. std::string strLog = "";
  52. strLog = log;
  53. WriteLog(strLog);
  54. return 0;
  55. }
  56. int MyLog::test()
  57. {
  58. bool bRet = false;
  59. std::string dir = "log/20170603";
  60. dir = GetFileName();
  61. for (int i = 0;i < 10;i++) {
  62. curFileCount++;
  63. dir = GetFileName();
  64. }
  65. dir = "";
  66. dir = GetExeDir();
  67. bRet = IsDirExist(dir);
  68. if (!bRet) {
  69. CreateDir(dir);
  70. }
  71. return 0;
  72. }
  73. int MyLog::InitLogConfig()
  74. {
  75. std::string name = my_log_file_name[fileType];
  76. std::string filename = strExeDir + "log/" + GetFileName();
  77. std::string str_category = my_log_file_name[fileType] + "_category";
  78. pLayout = new log4cpp::PatternLayout();
  79. /*
  80. %c category;
  81. %d 日期;日期可以进一步的设置格式,用花括号包围,例如%d{ %H:%M : %S,%l } 或者 %d{ %d %m %Y %H:%M : %S,%l }。如果不设置具体日期格式,则如下默认格式被使用“Wed Jan 02 02:03 : 55 1980”。日期的格式符号与ANSI C函数strftime中的一致。但增加了一个格式符号%l,表示毫秒,占三个十进制位。
  82. %m 消息;
  83. %n 换行符,会根据平台的不同而不同,但对于用户透明;
  84. %p 优先级;
  85. %r 自从layout被创建后的毫秒数;
  86. %R 从1970年1月1日0时开始到目前为止的秒数;
  87. %u 进程开始到目前为止的时钟周期数;
  88. %x NDC。
  89. */
  90. //如果status是false,表示不输出时间信息
  91. //如果status是true,则RAW_S文件不输出时间信息,其他文件类型输出时间信息
  92. pLayout->setConversionPattern(log_file_pattern[status]);
  93. //appender = new log4cpp::FileAppender(name.c_str(), filename.c_str());
  94. //RollingFileAppender参数说明
  95. //第三个参数表示每个文件的最大阈值,这里为200M
  96. //第四个参数表示备份文件最大数
  97. //第五个参数表示缓冲立即刷新
  98. pAppender = new log4cpp::RollingFileAppender(name.c_str(), filename.c_str(),MAX_FILE_SIZE,MAX_BACKUP_COUNTS,true);
  99. pAppender->setLayout(pLayout);
  100. pCategory = &(log4cpp::Category::getInstance(str_category.c_str()));
  101. pCategory->addAppender(pAppender);
  102. pCategory->setPriority(log4cpp::Priority::INFO);
  103. return 0;
  104. }
  105. std::string MyLog::GetExeDir()
  106. {
  107. std::string dir = "";
  108. TCHAR chpath[MAX_PATH];
  109. ::GetModuleFileName(NULL,chpath, MAX_PATH);
  110. (_tcsrchr(chpath, _T('\\')))[1] = 0;
  111. dir = TCHAR2string(chpath);
  112. return dir;
  113. }
  114. bool MyLog::IsDirExist(std::string path)
  115. {
  116. bool bRet = false;
  117. struct _stat fileStat;
  118. if ((_stat(path.c_str(), &fileStat) == 0) && (fileStat.st_mode & _S_IFDIR))
  119. {
  120. bRet = true;
  121. }
  122. return bRet;
  123. }
  124. bool MyLog::CreateDir(std::string path)
  125. {
  126. std::string cmd = "md " + path;
  127. system(cmd.c_str());//创建一个文件夹
  128. return true;
  129. }
  130. std::string MyLog::TCHAR2string(TCHAR * tch)
  131. {
  132. int iLen = WideCharToMultiByte(CP_ACP, 0, tch, -1, NULL, 0, NULL, NULL);
  133. char* chRtn = new char[iLen * sizeof(char)];
  134. WideCharToMultiByte(CP_ACP, 0, tch, -1, chRtn, iLen, NULL, NULL);
  135. std::string str(chRtn);
  136. return str;
  137. }
  138. std::string MyLog::int2string(int value)
  139. {
  140. return std::to_string(value);
  141. }
  142. /*
  143. * 当日期变化后,在新目录内重新生成日志
  144. */
  145. int MyLog::SetAppender(const char* filename)
  146. {
  147. std::string name = my_log_file_name[fileType];
  148. std::string strFileName = strExeDir + "log/" + filename;
  149. pCategory->removeAppender(pAppender);
  150. pAppender = new log4cpp::RollingFileAppender(name.c_str(), strFileName.c_str(),MAX_FILE_SIZE,MAX_BACKUP_COUNTS,true);
  151. pAppender->setLayout(pLayout);
  152. pCategory->setAppender(pAppender);
  153. return 0;
  154. }
  155. int MyLog::SetAppender(std::string filename)
  156. {
  157. SetAppender(filename.c_str());
  158. return 0;
  159. }
  160. int MyLog::SetLayout(bool status)
  161. {
  162. if (status)
  163. {
  164. pLayout->setConversionPattern(log_file_pattern[1]);
  165. }
  166. else
  167. {
  168. pLayout->setConversionPattern(log_file_pattern[0]);
  169. }
  170. return 0;
  171. }
  172. long MyLog::GetFileSize()
  173. {
  174. if (curFileName == "") {
  175. return 0;
  176. }
  177. struct _stat info;
  178. _stat(curFileName.c_str(), &info);
  179. long size = info.st_size;
  180. return size;
  181. }
  182. std::string MyLog::GetFileName()
  183. {
  184. //日志文件格式为日期 + 计数 + 后缀(.log)
  185. std::string stringDate = "";
  186. char chDate[255] = {0};
  187. time_t today;
  188. tm* t = new tm;
  189. time(&today);
  190. localtime_s(t, &today);
  191. strftime(chDate, 255, "%Y%m%d", t);
  192. stringDate = chDate;
  193. //curFileName = my_log_file_name[fileType] + "_" + curDate + "_" + int2string(curFileCount) + ".log";
  194. curFileName = my_log_file_name[fileType] + "_" + stringDate + ".log";
  195. if (t) {
  196. delete t;
  197. }
  198. return curFileName;
  199. }