log.hpp 5.8 KB

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