2
0

log.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #ifndef AFUN_LOG_H
  2. #define AFUN_LOG_H
  3. #include <iostream>
  4. #include "aFunToolExport.h"
  5. #include "macro.h"
  6. namespace aFuntool {
  7. enum LogLevel {
  8. log_track = 0,
  9. log_debug = 1,
  10. log_info = 2,
  11. log_warning = 3,
  12. log_error = 4,
  13. log_send_error = 5,
  14. log_fatal_error = 6,
  15. };
  16. typedef enum LogLevel LogLevel;
  17. AFUN_TOOL_EXPORT class LogFactory;
  18. AFUN_TOOL_EXPORT class Logger {
  19. const std::string id;
  20. LogLevel level = log_debug;
  21. bool exit = true;
  22. friend class LogFactory;
  23. public:
  24. explicit Logger(const std::string &id_, LogLevel level_ = log_warning, bool exit_ = true);
  25. int writeTrackLog(const char *file, int line, const char *func, const char *format, ...);
  26. int writeDebugLog(const char *file, int line, const char *func, const char *format, ...);
  27. int writeInfoLog(const char *file, int line, const char *func, const char *format, ...);
  28. int writeWarningLog(const char *file, int line, const char *func, const char *format, ...);
  29. int writeErrorLog(const char *file, int line, const char *func, const char *format, ...);
  30. int writeSendErrorLog(const char *file, int line, const char *func, const char *format, ...);
  31. int writeFatalErrorLog(const char *file, int line, const char *func, int exit_code, const char *format, ...);
  32. };
  33. AFUN_TOOL_EXPORT class LogFactory {
  34. bool init; // 是否已经初始化
  35. pid_t pid;
  36. FILE *log; // 记录文件输出的位置
  37. FILE *csv;
  38. bool asyn; // 异步
  39. pthread_t pt;
  40. pthread_cond_t cond; // 有日志
  41. pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  42. struct LogNode *log_buf;
  43. struct LogNode **plog_buf; // 指向 log_buf的末端
  44. public:
  45. Logger sys_log = Logger("SYSTEM");
  46. LogFactory();
  47. ~LogFactory();
  48. LogFactory(const LogFactory &)=delete;
  49. LogFactory &operator=(const LogFactory &)=delete;
  50. int initLogSystem(ConstFilePath path, bool is_asyn = true);
  51. bool destruct();
  52. void writeLog(LogLevel level,
  53. const char *id, pid_t tid,
  54. const char *ti, time_t t,
  55. const char *file, int line, const char *func,
  56. const char *info);
  57. static void writeConsole(LogLevel level,
  58. const char *id, pid_t tid,
  59. const char *ti, time_t t,
  60. const char *file, int line, const char *func,
  61. const char *info);
  62. void writeLogAsyn(LogLevel level,
  63. const char *id, pid_t tid,
  64. const char *ti, time_t t,
  65. const char *file, int line, const char *func, const char *info);
  66. int newLog(Logger *logger,
  67. bool pc,
  68. LogLevel level,
  69. const char *file, int line, const char *func,
  70. const char *format, va_list ap);
  71. bool news(){ return !init || log_buf != nullptr; }
  72. int wait(){ return pthread_cond_wait(&cond, &mutex); }
  73. bool stop(){ return !init && log_buf == nullptr; }
  74. struct LogNode *pop();
  75. };
  76. AFUN_TOOL_EXPORT extern LogFactory log_factory;
  77. }
  78. #ifndef NO_DEFINE_LOG_MACRO
  79. #include "log-m.h"
  80. #define getLogger(logger) ((logger) == nullptr ? &aFuntool::log_factory.sys_log : (logger))
  81. #if aFunWriteTrack
  82. #define trackLog(logger, ...) getLogger(logger)->writeTrackLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__)
  83. #else
  84. #define trackLog(logger, ...) (nullptr)
  85. #endif
  86. #if aFunWriteDebug
  87. #define debugLog(logger, ...) getLogger(logger)->writeDebugLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__)
  88. #define assertDebugLog(c, logger, ...) ((c) || debugLog(logger, "Assert " #c " error : " __VA_ARGS__))
  89. #else
  90. #define debugLog(logger, ...) (nullptr)
  91. #define assertDebugLog(c, logger, ...) (c)
  92. #endif
  93. #if aFunWriteInfo
  94. #define infoLog(logger, ...) getLogger(logger)->writeInfoLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__)
  95. #define assertInfoLog(c, logger, ...) ((c) || infoLog(logger, "Assert " #c " error : " __VA_ARGS__))
  96. #else
  97. #define infoLog(logger, ...) (nullptr)
  98. #define assertInfoLog(c, logger, ...) (c)
  99. #endif
  100. #if !aFunIgnoreWarning
  101. #define warningLog(logger, ...) getLogger(logger)->writeWarningLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__)
  102. #define assertWarningLog(c, logger, ...) ((c) || warningLog(logger, "Assert " #c " error : " __VA_ARGS__))
  103. #else
  104. #define warningLog(logger, ...) (nullptr)
  105. #define assertWarningLog(c, logger, ...) (c)
  106. #endif
  107. #if !aFunIgnoreError
  108. #define errorLog(logger, ...) getLogger(logger)->writeErrorLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__)
  109. #define assertErrorLog(c, logger, ...) ((c) || errorLog(logger, "Assert " #c " error : " __VA_ARGS__))
  110. #else
  111. #define errorLog(logger, ...) (nullptr)
  112. #define assertErrorLog(c, logger, ...) (c)
  113. #endif
  114. #if !aFunOFFAllLog
  115. #define sendErrorLog(logger, ...) getLogger(logger)->writeSendErrorLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, __VA_ARGS__)
  116. #define fatalErrorLog(logger, exit_code, ...) getLogger(logger)->writeFatalErrorLog(__FILENAME__ , (int)__LINE__, __FUNCTION__, exit_code, __VA_ARGS__)
  117. #define assertSendErrorLog(c, logger, ...) ((c) || sendErrorLog(logger, "Assert " #c " error : " __VA_ARGS__))
  118. #define assertFatalErrorLog(c, logger, exit_code, ...) ((c) || fatalErrorLog(logger, exit_code, "Assert " #c " error : " __VA_ARGS__))
  119. #else
  120. #define sendErrorLog(logger, ...) (nullptr)
  121. #define fatalErrorLog(logger, exit_code, ...) (nullptr)
  122. #define assertSendErrorLog(c, logger, ...) (c)
  123. #define assertFatalErrorLog(c, logger, exit_code, ...) (c)
  124. #endif
  125. #endif
  126. #endif //AFUN_LOG_H