MyLog.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  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_TOTAL) {
  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_TOTAL) {
  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 (getCurTime() != m_Lasttime)
  36. {
  37. m_Lasttime = getCurTime();
  38. std::string filename = GetFileName();
  39. SetAppender(filename);
  40. }
  41. return 0;
  42. }
  43. int MyLog::WriteLog(const char * pMsg,...)
  44. {
  45. va_list args;
  46. char log[1024];
  47. va_start(args, pMsg);
  48. vsnprintf_s(log,1024-1,pMsg,args);
  49. std::string strLog = "";
  50. strLog = log;
  51. WriteLog(strLog);
  52. return 0;
  53. }
  54. int MyLog::test()
  55. {
  56. bool bRet = false;
  57. std::string dir = "log/20170603";
  58. dir = GetFileName();
  59. for (int i = 0;i < 10;i++) {
  60. curFileCount++;
  61. dir = GetFileName();
  62. }
  63. dir = "";
  64. dir = GetExeDir();
  65. bRet = IsDirExist(dir);
  66. if (!bRet) {
  67. CreateDir(dir.c_str());
  68. }
  69. return 0;
  70. }
  71. int MyLog::InitLogConfig()
  72. {
  73. std::string name = my_log_file_name[fileType];
  74. std::string str_category = my_log_file_name[fileType] + "_category";
  75. m_Lasttime = getCurTime();
  76. std::string filepath = strExeDir + "log\\" + m_Lasttime + "\\";
  77. if (!IsDirExist(filepath))
  78. {
  79. CreateDir(filepath.c_str());
  80. }
  81. std::string filename = filepath + GetFileName();
  82. pLayout = new log4cpp::PatternLayout();
  83. /*
  84. %c category;
  85. %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,表示毫秒,占三个十进制位。
  86. %m 消息;
  87. %n 换行符,会根据平台的不同而不同,但对于用户透明;
  88. %p 优先级;
  89. %r 自从layout被创建后的毫秒数;
  90. %R 从1970年1月1日0时开始到目前为止的秒数;
  91. %u 进程开始到目前为止的时钟周期数;
  92. %x NDC。
  93. */
  94. //如果status是false,表示不输出时间信息
  95. //如果status是true,则RAW_S文件不输出时间信息,其他文件类型输出时间信息
  96. pLayout->setConversionPattern(log_file_pattern[status]);
  97. //appender = new log4cpp::FileAppender(name.c_str(), filename.c_str());
  98. //RollingFileAppender参数说明
  99. //第三个参数表示每个文件的最大阈值,这里为200M
  100. //第四个参数表示备份文件最大数
  101. //第五个参数表示缓冲立即刷新
  102. pAppender = new log4cpp::RollingFileAppender(name.c_str(), filename.c_str(),MAX_FILE_SIZE,MAX_BACKUP_COUNTS,true);
  103. pAppender->setLayout(pLayout);
  104. pCategory = &(log4cpp::Category::getInstance(str_category.c_str()));
  105. pCategory->addAppender(pAppender);
  106. pCategory->setPriority(log4cpp::Priority::INFO);
  107. return 0;
  108. }
  109. std::string MyLog::GetExeDir()
  110. {
  111. std::string dir = "";
  112. TCHAR chpath[MAX_PATH];
  113. ::GetModuleFileName(NULL,chpath, MAX_PATH);
  114. (_tcsrchr(chpath, _T('\\')))[1] = 0;
  115. dir = TCHAR2string(chpath);
  116. return dir;
  117. }
  118. bool MyLog::IsDirExist(std::string path)
  119. {
  120. bool bRet = false;
  121. struct _stat fileStat;
  122. if ((_stat(path.c_str(), &fileStat) == 0) && (fileStat.st_mode & _S_IFDIR))
  123. {
  124. bRet = true;
  125. }
  126. return bRet;
  127. }
  128. bool MyLog::CreateDir(const char * pDir)
  129. {
  130. //std::string cmd = "md " + path;
  131. //system(cmd.c_str());//创建一个文件夹
  132. int i = 0;
  133. int iRet;
  134. int iLen;
  135. char* pszDir;
  136. if(NULL == pDir)
  137. {
  138. return 0;
  139. }
  140. pszDir = strdup(pDir);
  141. iLen = strlen(pszDir);
  142. // 创建中间目录
  143. for (i = 0;i < iLen;i ++)
  144. {
  145. if (pszDir[i] == '\\' || pszDir[i] == '/')
  146. {
  147. pszDir[i] = '\0';
  148. //如果不存在,创建
  149. iRet = ACCESS(pszDir,0);
  150. if (iRet != 0)
  151. {
  152. iRet = MKDIR(pszDir);
  153. if (iRet != 0)
  154. {
  155. return false;
  156. }
  157. }
  158. //支持linux,将所有\换成/
  159. pszDir[i] = '/';
  160. }
  161. }
  162. iRet = MKDIR(pszDir);
  163. free(pszDir);
  164. return true;
  165. }
  166. std::string MyLog::TCHAR2string(TCHAR * tch)
  167. {
  168. int iLen = WideCharToMultiByte(CP_ACP, 0, tch, -1, NULL, 0, NULL, NULL);
  169. char* chRtn = new char[iLen * sizeof(char)];
  170. WideCharToMultiByte(CP_ACP, 0, tch, -1, chRtn, iLen, NULL, NULL);
  171. std::string str(chRtn);
  172. return str;
  173. }
  174. std::string MyLog::int2string(int value)
  175. {
  176. return std::to_string(value);
  177. }
  178. /*
  179. * 当日期变化后,在新目录内重新生成日志
  180. */
  181. int MyLog::SetAppender(const char* filename)
  182. {
  183. std::string name = my_log_file_name[fileType];
  184. //std::string strFileName = strExeDir + "log/" + filename;
  185. std::string filepath = strExeDir + "log/" + m_Lasttime + "/";
  186. if (!IsDirExist(filepath))
  187. {
  188. CreateDir(filepath.c_str());
  189. }
  190. std::string strFileName = filepath + filename;
  191. pCategory->removeAppender(pAppender);
  192. pAppender = new log4cpp::RollingFileAppender(name.c_str(), strFileName.c_str(),MAX_FILE_SIZE,MAX_BACKUP_COUNTS,true);
  193. //need malloc again
  194. pLayout = new log4cpp::PatternLayout();
  195. pLayout->setConversionPattern(log_file_pattern[status]);
  196. pAppender->setLayout(pLayout);
  197. pCategory->setAppender(pAppender);
  198. return 0;
  199. }
  200. int MyLog::SetAppender(std::string filename)
  201. {
  202. SetAppender(filename.c_str());
  203. return 0;
  204. }
  205. int MyLog::SetLayout(bool status)
  206. {
  207. if (status)
  208. {
  209. pLayout->setConversionPattern(log_file_pattern[1]);
  210. }
  211. else
  212. {
  213. pLayout->setConversionPattern(log_file_pattern[0]);
  214. }
  215. return 0;
  216. }
  217. long MyLog::GetFileSize()
  218. {
  219. if (curFileName == "") {
  220. return 0;
  221. }
  222. struct _stat info;
  223. _stat(curFileName.c_str(), &info);
  224. long size = info.st_size;
  225. return size;
  226. }
  227. std::string MyLog::getCurTime()
  228. {
  229. std::string stringDate;
  230. char chDate[255] = {0};
  231. time_t today;
  232. tm* t = new tm;
  233. time(&today);
  234. localtime_s(t, &today);
  235. strftime(chDate, 255, "%Y%m%d", t);
  236. stringDate = chDate;
  237. if (t) {
  238. delete t;
  239. }
  240. return stringDate;
  241. }
  242. std::string MyLog::GetFileName()
  243. {
  244. //日志文件格式为日期 + 计数 + 后缀(.log)
  245. std::string stringDate = "";
  246. stringDate = getCurTime();
  247. //curFileName = my_log_file_name[fileType] + "_" + curDate + "_" + int2string(curFileCount) + ".log";
  248. curFileName = my_log_file_name[fileType] + "_" + stringDate + ".log";
  249. return curFileName;
  250. }