log.c 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. #include "precompile.h"
  2. #include "log.h"
  3. #include "log_mgr.h"
  4. #include "log_single.h"
  5. #include "log_periodic.h"
  6. #include "log_udpclient.h"
  7. #include "log_udpdaemon.h"
  8. #include "iniutil.h"
  9. #include "fileutil.h"
  10. #include "sockutil.h"
  11. #include "modCheck.h"
  12. #define XLOG_VERSION 0x0101
  13. TOOLKIT_API int xlog_version();
  14. TOOLKIT_API int xlog_init2(const char *inifile, const char *sections);
  15. TOOLKIT_API int xlog_set_level(const char* inst, int level);
  16. TOOLKIT_API int xlog_get_level(const char* inst, int *level);
  17. TOOLKIT_API int xlog_log_f(const char *inst, int level, const char *fmt, ...);
  18. // #define XLOG_TRACE(inst, fmt, ...) \
  19. // xlog_log_f(inst, XLOG_LEVEL_TRACE, fmt, __VA_ARGS__)
  20. // #define XLOG_DEBUG(inst, fmt, ...) \
  21. // xlog_log_f(inst, XLOG_LEVEL_DEBUG, fmt, __VA_ARGS__)
  22. // #define XLOG_INFO(inst, fmt, ...) \
  23. // xlog_log_f(inst, XLOG_LEVEL_INFO, fmt, __VA_ARGS__)
  24. // #define XLOG_WARN(inst, fmt, ...) \
  25. // xlog_log_f(inst, XLOG_LEVEL_WARN, fmt, __VA_ARGS__)
  26. // #define XLOG_ERROR(inst, fmt, ...) \
  27. // xlog_log_f(inst, XLOG_LEVEL_ERROR, fmt, __VA_ARGS__)
  28. // #define XLOG_FATAL(inst, fmt, ...) \
  29. // xlog_log_f(inst, XLOG_LEVEL_FATAL, fmt, __VA_ARGS__)
  30. static char *find_best_config()
  31. {
  32. char path[MAX_PATH];
  33. char *filepart;
  34. GetModuleFileNameA(NULL, path, MAX_PATH);
  35. filepart = strrchr(path, '\\');
  36. if (filepart) {
  37. *filepart = 0;
  38. filepart++;
  39. if (strlen(filepart) > 4) {
  40. int i;
  41. struct {
  42. char *fmt;
  43. char *str1;
  44. char *str2;
  45. }defaultfilepath[] = {
  46. {"%s\\ini\\log\\%s.ini", path, filepart},
  47. {"%s\\etc\\log\\%s.ini", path, filepart},
  48. {"%s\\conf\\log\\%s.ini", path, filepart},
  49. {"%s\\log.ini", path, NULL},
  50. {"%s\\ini\\log.ini", path, filepart},
  51. {"%s\\etc\\log.ini", path, filepart},
  52. {"%s\\conf\\log.ini", path, filepart},
  53. {NULL, NULL, NULL},
  54. };
  55. filepart[strlen(filepart)-4] = 0;
  56. for (i = 0; defaultfilepath[i].fmt != NULL; ++i) {
  57. char tmp[MAX_PATH];
  58. sprintf(tmp, defaultfilepath[i].fmt, defaultfilepath[i].str1, defaultfilepath->str2);
  59. if (ExistsFileA(tmp))
  60. return _strdup(tmp);
  61. }
  62. }
  63. }
  64. return NULL;
  65. }
  66. static int contains_name(va_list arg, const char *name)
  67. {
  68. char *p;
  69. while((p = va_arg(arg, char*)) != NULL) {
  70. if (_stricmp(name, p) == 0)
  71. return TRUE;
  72. }
  73. return 0;
  74. }
  75. TOOLKIT_API int xlog_version()
  76. {
  77. return XLOG_VERSION;
  78. }
  79. TOOLKIT_API int xlog_init(const char *file)
  80. {
  81. return xlog_init2(file, NULL);
  82. }
  83. TOOLKIT_API int xlog_init2(const char *file, const char *sections)
  84. {
  85. logfactory_t *fac;
  86. array_header_t *arr_section = NULL;
  87. char *copysections = NULL;
  88. char *best_config_file = NULL;
  89. int rc = 0;
  90. if (toolkit_getResource()->g_initialized++) {
  91. return 0;
  92. }
  93. winsock_init();
  94. if (sections) {
  95. const char *delimers = ",| ";
  96. char *p;
  97. copysections = _strdup(sections);
  98. arr_section = array_make(3, sizeof(char*));
  99. p = strtok(copysections, delimers);
  100. while (p) {
  101. ARRAY_PUSH(arr_section, char*) = p;
  102. p = strtok(NULL, delimers);
  103. }
  104. }
  105. logmgr_create(&((logmgr_t *)(toolkit_getResource()->g_mgr)));
  106. singlefilefactory_create(&fac);
  107. logmgr_register_factory((logmgr_t *)(toolkit_getResource()->g_mgr), fac);
  108. periodicfilefactory_create(&fac);
  109. logmgr_register_factory((logmgr_t *)(toolkit_getResource()->g_mgr), fac);
  110. udplogfactory_create(&fac);
  111. logmgr_register_factory((logmgr_t *)(toolkit_getResource()->g_mgr), fac);
  112. udplogdaemonfactory_create(&fac);
  113. logmgr_register_factory((logmgr_t *)(toolkit_getResource()->g_mgr), fac);
  114. if (!file) {
  115. best_config_file = find_best_config();
  116. }
  117. if (best_config_file)
  118. {
  119. int i;
  120. array_header_t *arr_sec = inifile_read_section_all(best_config_file);
  121. if (arr_sec) {
  122. for (i = 0; i < arr_sec->nelts; ++i) {
  123. int found = 0;
  124. int kk;
  125. char *sec = ARRAY_IDX(arr_sec, i, char*);
  126. if (sections) {
  127. for (kk = 0; kk < arr_section->nelts; ++kk)
  128. if (_stricmp(sec, ARRAY_IDX(arr_section, kk, char*)) == 0)
  129. found = 1;
  130. }
  131. if (!sections || found) {
  132. array_header_t *arr_key = inifile_read_section_key_all(best_config_file, sec);
  133. if (arr_key) {
  134. char *type_tag = ARRAY_IDX(arr_key, 0, char*);
  135. if (type_tag && _stricmp(type_tag, "type") == 0) {
  136. char *type_value = inifile_read_str(best_config_file, sec, type_tag, "");
  137. if (type_value) {
  138. if (strlen(type_value) > 0) {
  139. logbase_t *log;
  140. rc = logmgr_create_log((logmgr_t *)(toolkit_getResource()->g_mgr), type_value, sec, &log);
  141. if (rc == 0) {
  142. int k;
  143. for (k = 1; k < arr_key->nelts; ++k) {
  144. char *key_tag = ARRAY_IDX(arr_key, k, char*);
  145. char *key_value = inifile_read_str(best_config_file, sec, key_tag, "");
  146. if (key_value) {
  147. logfactory_set_log_param(log->factory, log, key_tag, key_value);
  148. free(key_value);
  149. }
  150. }
  151. rc = logmgr_init_log((logmgr_t *)(toolkit_getResource()->g_mgr), log);
  152. if (rc != 0) {
  153. logmgr_destroy_log((logmgr_t *)(toolkit_getResource()->g_mgr), log);
  154. }
  155. }
  156. }
  157. free(type_value);
  158. }
  159. }
  160. array_free2(arr_key);
  161. }
  162. }
  163. }
  164. array_free2(arr_sec);
  165. }
  166. }
  167. //on_error:
  168. if (copysections)
  169. free(copysections);
  170. if (arr_section)
  171. array_free(arr_section);
  172. if (rc < 0) {
  173. logmgr_destroy((logmgr_t *)(toolkit_getResource()->g_mgr));
  174. (logmgr_t *)(toolkit_getResource()->g_mgr) = NULL;
  175. }
  176. return rc;
  177. }
  178. TOOLKIT_API int xlog_add_logger(const char *name, const char *type, ...)
  179. {
  180. logbase_t *log;
  181. int rc;
  182. if (!name || !strlen(name))
  183. return -1;
  184. if (!type || !strlen(type))
  185. return -1;
  186. rc = logmgr_create_log((logmgr_t *)(toolkit_getResource()->g_mgr), type, name, &log);
  187. if (rc == 0) {
  188. va_list arg;
  189. const char *key, *value;
  190. va_start(arg, type);
  191. key = va_arg(arg, const char*);
  192. while (key) {
  193. value = va_arg(arg, const char*);
  194. logfactory_set_log_param(log->factory, log, key, value);
  195. key = va_arg(arg, const char*);
  196. }
  197. va_end(arg);
  198. rc = logmgr_init_log((logmgr_t *)(toolkit_getResource()->g_mgr), log);
  199. if (rc != 0) {
  200. logmgr_destroy_log((logmgr_t *)(toolkit_getResource()->g_mgr), log);
  201. }
  202. }
  203. return rc;
  204. }
  205. TOOLKIT_API int xlog_remove_logger(const char *name)
  206. {
  207. logbase_t *log;
  208. if (name) {
  209. log = logmgr_find_log((logmgr_t *)(toolkit_getResource()->g_mgr), name);
  210. if (log) {
  211. logmgr_term_log((logmgr_t *)(toolkit_getResource()->g_mgr), log);
  212. logmgr_destroy_log((logmgr_t *)(toolkit_getResource()->g_mgr), log);
  213. return 0;
  214. }
  215. }
  216. return -1;
  217. }
  218. TOOLKIT_API int xlog_term()
  219. {
  220. toolkit_getResource()->g_initialized--;
  221. if (toolkit_getResource()->g_initialized) {
  222. return 0;
  223. }
  224. if ((logmgr_t *)(toolkit_getResource()->g_mgr)) {
  225. logmgr_destroy((logmgr_t *)(toolkit_getResource()->g_mgr));
  226. (toolkit_getResource()->g_mgr) = 0;
  227. winsock_term();
  228. return 0;
  229. }
  230. return -1;
  231. }
  232. TOOLKIT_API int xlog_set_level(const char* inst, int level)
  233. {
  234. if (!inst)
  235. return -1;
  236. if ((logmgr_t *)(toolkit_getResource()->g_mgr)) {
  237. logbase_t *log = logmgr_find_log((logmgr_t *)(toolkit_getResource()->g_mgr), inst);
  238. if (log) {
  239. log->level = level;
  240. return 0;
  241. }
  242. }
  243. return -1;
  244. }
  245. TOOLKIT_API int xlog_get_level(const char* inst, int *level)
  246. {
  247. if (!inst)
  248. return -1;
  249. if ((logmgr_t *)(toolkit_getResource()->g_mgr)) {
  250. logbase_t *log = logmgr_find_log((logmgr_t *)(toolkit_getResource()->g_mgr), inst);
  251. if (log) {
  252. *level = log->level;
  253. return 0;
  254. }
  255. }
  256. return -1;
  257. }
  258. TOOLKIT_API int xlog_log(const char *inst, int level, const char *str)
  259. {
  260. logbase_t *log;
  261. int n;
  262. if (!(logmgr_t *)(toolkit_getResource()->g_mgr))
  263. return -1;
  264. n = str ? strlen(str) : 0;
  265. if (n == 0)
  266. return 0;
  267. log = logmgr_find_log((logmgr_t *)(toolkit_getResource()->g_mgr), inst);
  268. if (log) {
  269. FILETIME ft;
  270. SYSTEMTIME st;
  271. GetSystemTime(&st);
  272. SystemTimeToFileTime(&st, &ft);
  273. logfactory_log_record(log->factory, log, level, ft.dwLowDateTime, ft.dwHighDateTime, str, n);
  274. return 0;
  275. }
  276. return -1;
  277. }
  278. TOOLKIT_API int xlog_log_f(const char *inst, int level, const char *fmt, ...)
  279. {
  280. va_list arg;
  281. va_start(arg, fmt);
  282. return xlog_log_v(inst, level, fmt, arg);
  283. }
  284. TOOLKIT_API int xlog_log_v(const char *inst, int level, const char *fmt, va_list arg)
  285. {
  286. int n;
  287. logbase_t *log;
  288. if (!(logmgr_t *)(toolkit_getResource()->g_mgr))
  289. return -1;
  290. log = logmgr_find_log((logmgr_t *)(toolkit_getResource()->g_mgr), inst);
  291. if (!log)
  292. return -1;
  293. if (level < log->level)
  294. return 0;
  295. n = _vscprintf(fmt, arg);//因为添加了Debug {}, 所以可能超过了1024长度
  296. if (n >= 0 && n < 1050) {
  297. FILETIME ft;
  298. SYSTEMTIME st;
  299. char *buf = _alloca(n+1);
  300. vsprintf(buf, fmt, arg);
  301. GetSystemTime(&st);
  302. SystemTimeToFileTime(&st, &ft);
  303. logfactory_log_record(log->factory, log, level, ft.dwLowDateTime, ft.dwHighDateTime, buf, n);
  304. return 0;
  305. }
  306. return -1;
  307. }
  308. TOOLKIT_API logbase_t *xlog_find_log(const char *inst)
  309. {
  310. return logmgr_find_log((logmgr_t *)(toolkit_getResource()->g_mgr), inst);
  311. }