1
0

log.h 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. #pragma once
  2. #include "ggml.h" // for ggml_log_level
  3. #define LOG_CLR_TO_EOL "\033[K\r"
  4. #define LOG_COL_DEFAULT "\033[0m"
  5. #define LOG_COL_BOLD "\033[1m"
  6. #define LOG_COL_RED "\033[31m"
  7. #define LOG_COL_GREEN "\033[32m"
  8. #define LOG_COL_YELLOW "\033[33m"
  9. #define LOG_COL_BLUE "\033[34m"
  10. #define LOG_COL_MAGENTA "\033[35m"
  11. #define LOG_COL_CYAN "\033[36m"
  12. #define LOG_COL_WHITE "\033[37m"
  13. #ifndef __GNUC__
  14. # define LOG_ATTRIBUTE_FORMAT(...)
  15. #elif defined(__MINGW32__) && !defined(__clang__)
  16. # define LOG_ATTRIBUTE_FORMAT(...) __attribute__((format(gnu_printf, __VA_ARGS__)))
  17. #else
  18. # define LOG_ATTRIBUTE_FORMAT(...) __attribute__((format(printf, __VA_ARGS__)))
  19. #endif
  20. #define LOG_LEVEL_DEBUG 4
  21. #define LOG_LEVEL_INFO 3
  22. #define LOG_LEVEL_WARN 2
  23. #define LOG_LEVEL_ERROR 1
  24. #define LOG_LEVEL_OUTPUT 0 // output data from tools
  25. #define LOG_DEFAULT_DEBUG LOG_LEVEL_DEBUG
  26. #define LOG_DEFAULT_LLAMA LOG_LEVEL_INFO
  27. enum log_colors {
  28. LOG_COLORS_AUTO = -1,
  29. LOG_COLORS_DISABLED = 0,
  30. LOG_COLORS_ENABLED = 1,
  31. };
  32. // needed by the LOG_TMPL macro to avoid computing log arguments if the verbosity lower
  33. // set via common_log_set_verbosity()
  34. extern int common_log_verbosity_thold;
  35. void common_log_set_verbosity_thold(int verbosity); // not thread-safe
  36. void common_log_default_callback(enum ggml_log_level level, const char * text, void * user_data);
  37. // the common_log uses an internal worker thread to print/write log messages
  38. // when the worker thread is paused, incoming log messages are discarded
  39. struct common_log;
  40. struct common_log * common_log_init();
  41. struct common_log * common_log_main(); // singleton, automatically destroys itself on exit
  42. void common_log_pause (struct common_log * log); // pause the worker thread, not thread-safe
  43. void common_log_resume(struct common_log * log); // resume the worker thread, not thread-safe
  44. void common_log_free (struct common_log * log);
  45. LOG_ATTRIBUTE_FORMAT(3, 4)
  46. void common_log_add(struct common_log * log, enum ggml_log_level level, const char * fmt, ...);
  47. // defaults: file = NULL, colors = false, prefix = false, timestamps = false
  48. //
  49. // regular log output:
  50. //
  51. // ggml_backend_metal_log_allocated_size: allocated buffer, size = 6695.84 MiB, ( 6695.91 / 21845.34)
  52. // llm_load_tensors: ggml ctx size = 0.27 MiB
  53. // llm_load_tensors: offloading 32 repeating layers to GPU
  54. // llm_load_tensors: offloading non-repeating layers to GPU
  55. //
  56. // with prefix = true, timestamps = true, the log output will look like this:
  57. //
  58. // 0.00.035.060 D ggml_backend_metal_log_allocated_size: allocated buffer, size = 6695.84 MiB, ( 6695.91 / 21845.34)
  59. // 0.00.035.064 I llm_load_tensors: ggml ctx size = 0.27 MiB
  60. // 0.00.090.578 I llm_load_tensors: offloading 32 repeating layers to GPU
  61. // 0.00.090.579 I llm_load_tensors: offloading non-repeating layers to GPU
  62. //
  63. // D - debug (stderr, V = LOG_DEFAULT_DEBUG)
  64. // I - info (stdout, V = LOG_DEFAULT_INFO)
  65. // W - warning (stderr, V = LOG_DEFAULT_WARN)
  66. // E - error (stderr, V = LOG_DEFAULT_ERROR)
  67. // O - output (stdout, V = LOG_DEFAULT_OUTPUT)
  68. //
  69. void common_log_set_file (struct common_log * log, const char * file); // not thread-safe
  70. void common_log_set_colors (struct common_log * log, log_colors colors); // not thread-safe
  71. void common_log_set_prefix (struct common_log * log, bool prefix); // whether to output prefix to each log
  72. void common_log_set_timestamps(struct common_log * log, bool timestamps); // whether to output timestamps in the prefix
  73. void common_log_flush (struct common_log * log); // flush all pending log messages
  74. // helper macros for logging
  75. // use these to avoid computing log arguments if the verbosity of the log is higher than the threshold
  76. //
  77. // for example:
  78. //
  79. // LOG_DBG("this is a debug message: %d\n", expensive_function());
  80. //
  81. // this will avoid calling expensive_function() if LOG_DEFAULT_DEBUG > common_log_verbosity_thold
  82. //
  83. #define LOG_TMPL(level, verbosity, ...) \
  84. do { \
  85. if ((verbosity) <= common_log_verbosity_thold) { \
  86. common_log_add(common_log_main(), (level), __VA_ARGS__); \
  87. } \
  88. } while (0)
  89. #define LOG(...) LOG_TMPL(GGML_LOG_LEVEL_NONE, LOG_LEVEL_OUTPUT, __VA_ARGS__)
  90. #define LOGV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_NONE, verbosity, __VA_ARGS__)
  91. #define LOG_DBG(...) LOG_TMPL(GGML_LOG_LEVEL_DEBUG, LOG_LEVEL_DEBUG, __VA_ARGS__)
  92. #define LOG_INF(...) LOG_TMPL(GGML_LOG_LEVEL_INFO, LOG_LEVEL_INFO, __VA_ARGS__)
  93. #define LOG_WRN(...) LOG_TMPL(GGML_LOG_LEVEL_WARN, LOG_LEVEL_WARN, __VA_ARGS__)
  94. #define LOG_ERR(...) LOG_TMPL(GGML_LOG_LEVEL_ERROR, LOG_LEVEL_ERROR, __VA_ARGS__)
  95. #define LOG_CNT(...) LOG_TMPL(GGML_LOG_LEVEL_CONT, LOG_LEVEL_INFO, __VA_ARGS__) // same as INFO
  96. #define LOG_INFV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_INFO, verbosity, __VA_ARGS__)
  97. #define LOG_WRNV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_WARN, verbosity, __VA_ARGS__)
  98. #define LOG_ERRV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_ERROR, verbosity, __VA_ARGS__)
  99. #define LOG_DBGV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_DEBUG, verbosity, __VA_ARGS__)
  100. #define LOG_CNTV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_CONT, verbosity, __VA_ARGS__)