log.hpp 6.0 KB

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