log.h 4.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #pragma once
  2. #include "ggml.h" // for ggml_log_level
  3. #ifndef __GNUC__
  4. # define LOG_ATTRIBUTE_FORMAT(...)
  5. #elif defined(__MINGW32__)
  6. # define LOG_ATTRIBUTE_FORMAT(...) __attribute__((format(gnu_printf, __VA_ARGS__)))
  7. #else
  8. # define LOG_ATTRIBUTE_FORMAT(...) __attribute__((format(printf, __VA_ARGS__)))
  9. #endif
  10. #define LOG_DEFAULT_DEBUG 1
  11. #define LOG_DEFAULT_LLAMA 0
  12. // needed by the LOG_TMPL macro to avoid computing log arguments if the verbosity lower
  13. // set via common_log_set_verbosity()
  14. extern int common_log_verbosity_thold;
  15. void common_log_set_verbosity_thold(int verbosity); // not thread-safe
  16. // the common_log uses an internal worker thread to print/write log messages
  17. // when the worker thread is paused, incoming log messages are discarded
  18. struct common_log;
  19. struct common_log * common_log_init();
  20. struct common_log * common_log_main(); // singleton, automatically destroys itself on exit
  21. void common_log_pause (struct common_log * log); // pause the worker thread, not thread-safe
  22. void common_log_resume(struct common_log * log); // resume the worker thread, not thread-safe
  23. void common_log_free (struct common_log * log);
  24. LOG_ATTRIBUTE_FORMAT(3, 4)
  25. void common_log_add(struct common_log * log, enum ggml_log_level level, const char * fmt, ...);
  26. // defaults: file = NULL, colors = false, prefix = false, timestamps = false
  27. //
  28. // regular log output:
  29. //
  30. // ggml_backend_metal_log_allocated_size: allocated buffer, size = 6695.84 MiB, ( 6695.91 / 21845.34)
  31. // llm_load_tensors: ggml ctx size = 0.27 MiB
  32. // llm_load_tensors: offloading 32 repeating layers to GPU
  33. // llm_load_tensors: offloading non-repeating layers to GPU
  34. //
  35. // with prefix = true, timestamps = true, the log output will look like this:
  36. //
  37. // 0.00.035.060 D ggml_backend_metal_log_allocated_size: allocated buffer, size = 6695.84 MiB, ( 6695.91 / 21845.34)
  38. // 0.00.035.064 I llm_load_tensors: ggml ctx size = 0.27 MiB
  39. // 0.00.090.578 I llm_load_tensors: offloading 32 repeating layers to GPU
  40. // 0.00.090.579 I llm_load_tensors: offloading non-repeating layers to GPU
  41. //
  42. // I - info (stdout, V = 0)
  43. // W - warning (stderr, V = 0)
  44. // E - error (stderr, V = 0)
  45. // D - debug (stderr, V = LOG_DEFAULT_DEBUG)
  46. //
  47. void common_log_set_file (struct common_log * log, const char * file); // not thread-safe
  48. void common_log_set_colors (struct common_log * log, bool colors); // not thread-safe
  49. void common_log_set_prefix (struct common_log * log, bool prefix); // whether to output prefix to each log
  50. void common_log_set_timestamps(struct common_log * log, bool timestamps); // whether to output timestamps in the prefix
  51. // helper macros for logging
  52. // use these to avoid computing log arguments if the verbosity of the log is higher than the threshold
  53. //
  54. // for example:
  55. //
  56. // LOG_DBG("this is a debug message: %d\n", expensive_function());
  57. //
  58. // this will avoid calling expensive_function() if LOG_DEFAULT_DEBUG > common_log_verbosity_thold
  59. //
  60. #define LOG_TMPL(level, verbosity, ...) \
  61. do { \
  62. if ((verbosity) <= common_log_verbosity_thold) { \
  63. common_log_add(common_log_main(), (level), __VA_ARGS__); \
  64. } \
  65. } while (0)
  66. #define LOG(...) LOG_TMPL(GGML_LOG_LEVEL_NONE, 0, __VA_ARGS__)
  67. #define LOGV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_NONE, verbosity, __VA_ARGS__)
  68. #define LOG_INF(...) LOG_TMPL(GGML_LOG_LEVEL_INFO, 0, __VA_ARGS__)
  69. #define LOG_WRN(...) LOG_TMPL(GGML_LOG_LEVEL_WARN, 0, __VA_ARGS__)
  70. #define LOG_ERR(...) LOG_TMPL(GGML_LOG_LEVEL_ERROR, 0, __VA_ARGS__)
  71. #define LOG_DBG(...) LOG_TMPL(GGML_LOG_LEVEL_DEBUG, LOG_DEFAULT_DEBUG, __VA_ARGS__)
  72. #define LOG_CNT(...) LOG_TMPL(GGML_LOG_LEVEL_CONT, 0, __VA_ARGS__)
  73. #define LOG_INFV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_INFO, verbosity, __VA_ARGS__)
  74. #define LOG_WRNV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_WARN, verbosity, __VA_ARGS__)
  75. #define LOG_ERRV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_ERROR, verbosity, __VA_ARGS__)
  76. #define LOG_DBGV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_DEBUG, verbosity, __VA_ARGS__)
  77. #define LOG_CNTV(verbosity, ...) LOG_TMPL(GGML_LOG_LEVEL_CONT, verbosity, __VA_ARGS__)