log.h 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #ifndef _MACRO_LogModule
  2. #define _MACRO_LogModule
  3. #include <stdio.h>
  4. #include "log_macro.h"
  5. #include "CritSection.h"
  6. /* 每个线程的buffer size*/
  7. #define _LOG_BUFFSIZE 1024*1024*4
  8. /* 当前进程的 Stream IO buffer size*/
  9. #define _SYS_BUFFSIZE 1024*1024*8
  10. /* log 文件字符串路径最大长度*/
  11. #define _LOG_PATH_LEN 250
  12. /* 日志对应的模块名*/
  13. #define _LOG_MODULE_LEN 32
  14. typedef enum LogLevel {
  15. LL_DEBUG = 1,
  16. LL_TRACE = 2,
  17. LL_NOTICE = 3,
  18. LL_WARNING = 4,
  19. LL_ERROR = 5,
  20. }LogLevel;
  21. class Log_Writer
  22. {
  23. public:
  24. Log_Writer()
  25. {
  26. m_system_level = LL_NOTICE;
  27. fp = NULL;
  28. m_issync = false;
  29. m_isappend = true;
  30. m_filelocation[0] ='\0';
  31. }
  32. ~Log_Writer(){
  33. logclose();
  34. }
  35. bool loginit(LogLevel l, const char *filelocation, bool append = true, bool issync = true);
  36. bool log(LogLevel l,char *logformat,...);
  37. LogLevel get_level();
  38. bool logclose();
  39. private:
  40. const char* logLevelToString(LogLevel l);
  41. bool checklevel(LogLevel l);
  42. int premakestr(char* m_buffer, LogLevel l);
  43. bool _write(char *_pbuffer, int len);
  44. private:
  45. enum LogLevel m_system_level;
  46. FILE* fp;
  47. bool m_issync;
  48. bool m_isappend;
  49. char m_filelocation[MAX_PATH];
  50. ThreadSection m_mutex;
  51. static char m_buffer[_LOG_BUFFSIZE];
  52. //The __thread specifier may be applied to any global, file-scoped static, function-scoped static,
  53. //or static data member of a class. It may not be applied to block-scoped automatic or non-static data member
  54. //in the log scence,It's safe!!!!
  55. //一言以蔽之,此场景不用担心__thread带来资源leak,同时也不用担心多个Log_Writer会干扰,
  56. //因为一个线程同一时间只有一个Log_Writer在干活,干完之后m_buffer就reset了
  57. //所以即便一个线程用户多个Log_Write串行(因为一个线程内的运行态只有串行) 也是线程安全的!!!
  58. };
  59. extern Log_Writer WARN_W;
  60. extern Log_Writer INFO_W;
  61. /**
  62. * LogLevel 日志级别
  63. * p_modulename 模块名 如mysql
  64. * p_logdir 日志输出目录
  65. * */
  66. bool log_init(LogLevel l, const char* p_modulename, const char* p_logdir);
  67. #endif