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