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