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
27enum 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()
35extern int common_log_verbosity_thold;
36
37void 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
41struct common_log;
42
43struct common_log * common_log_init();
44struct common_log * common_log_main(); // singleton, automatically destroys itself on exit
45void common_log_pause (struct common_log * log); // pause the worker thread, not thread-safe
46void common_log_resume(struct common_log * log); // resume the worker thread, not thread-safe
47void common_log_free (struct common_log * log);
48
49LOG_ATTRIBUTE_FORMAT(3, 4)
50void 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
74void common_log_set_file (struct common_log * log, const char * file); // not thread-safe
75void common_log_set_colors (struct common_log * log, log_colors colors); // not thread-safe
76void common_log_set_prefix (struct common_log * log, bool prefix); // whether to output prefix to each log
77void 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