log.hpp 5.8 KB

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