aboutsummaryrefslogtreecommitdiff
path: root/src/log.h
diff options
context:
space:
mode:
authorFelipe Oliveira Carvalho <felipekde@gmail.com>2014-04-28 19:40:13 -0300
committerFelipe Oliveira Carvalho <felipekde@gmail.com>2014-05-06 09:22:39 -0300
commitee62510d4e623e5fb4a0cc7d5b450ce18c24e25f (patch)
tree5bd1fd960070d0ca794f3f1ed2cd4fcbc297cef0 /src/log.h
parentc53d3f0071129ffe1daf3d86b5cb6c83c483ecda (diff)
downloadrneovim-ee62510d4e623e5fb4a0cc7d5b450ce18c24e25f.tar.gz
rneovim-ee62510d4e623e5fb4a0cc7d5b450ce18c24e25f.tar.bz2
rneovim-ee62510d4e623e5fb4a0cc7d5b450ce18c24e25f.zip
Macro-based log utility for Neovim
This commit introduces 4 macros (for different log levels) that can be used to log messages to $HOME/.nvimlog: - DLOG: log a debug message (e.g. `DLOG("sum(%d, %d): %d", x, y, sum(x, y));`) - ILOG: log some useful information (e.g. `ILOG("Main loop started")`) - WLOG: log a warning (e.g. `WLOG("Command not found: %s", command)`) - ELOG: log an error (e.g. `ELOG("Out of memory. Exiting.")`) All these macros are disabled if `NDEBUG` or `DISABLE_LOG` is defined. This guarantees that a `Release` build won't log anything. `MIN_LOG_LEVEL` can be defined to reduce the verbosity of the log. The log levels are: ``` DEBUG_LOG_LEVEL 0 INFO_LOG_LEVEL 1 WARNING_LOG_LEVEL 2 ERROR_LOG_LEVEL 3 ``` `MIN_LOG_LEVEL` is 0 by default enabling all levels. If `MIN_LOG_LEVEL` is set to 2, for example, only warnings and errors will be logged. That's how the log looks like: ``` DATETIME LOG_LEVEL FUNCTION LINE PID FORMATTED MESSAGE 2014/05/01 23:46:14 [info @ main_loop:582] 44376 - Starting Neovim main loop. 2014/05/01 23:46:31 [info @ main_loop:582] 44400 - Starting Neovim main loop. ```
Diffstat (limited to 'src/log.h')
-rw-r--r--src/log.h57
1 files changed, 57 insertions, 0 deletions
diff --git a/src/log.h b/src/log.h
new file mode 100644
index 0000000000..45c8fdbfd8
--- /dev/null
+++ b/src/log.h
@@ -0,0 +1,57 @@
+#ifndef NEOVIM_LOG_H
+#define NEOVIM_LOG_H
+
+#include <stdbool.h>
+
+#include "func_attr.h"
+
+#define DEBUG_LOG_LEVEL 0
+#define INFO_LOG_LEVEL 1
+#define WARNING_LOG_LEVEL 2
+#define ERROR_LOG_LEVEL 3
+
+bool do_log(int log_level, const char *func_name, int line_num,
+ const char* fmt, ...) FUNC_ATTR_UNUSED;
+
+#define DLOG(...)
+#define ILOG(...)
+#define WLOG(...)
+#define ELOG(...)
+
+// Logging is disabled if NDEBUG or DISABLE_LOG is defined.
+#ifdef NDEBUG
+# define DISABLE_LOG
+#endif
+
+// MIN_LOG_LEVEL can be defined during compilation to adjust the desired level
+// of logging. DEBUG_LOG_LEVEL is used by default.
+#ifndef MIN_LOG_LEVEL
+# define MIN_LOG_LEVEL DEBUG_LOG_LEVEL
+#endif
+
+#ifndef DISABLE_LOG
+
+# if MIN_LOG_LEVEL <= DEBUG_LOG_LEVEL
+# undef DLOG
+# define DLOG(...) do_log(DEBUG_LOG_LEVEL, __func__, __LINE__, __VA_ARGS__)
+# endif
+
+# if MIN_LOG_LEVEL <= INFO_LOG_LEVEL
+# undef ILOG
+# define ILOG(...) do_log(INFO_LOG_LEVEL, __func__, __LINE__, __VA_ARGS__)
+# endif
+
+# if MIN_LOG_LEVEL <= WARNING_LOG_LEVEL
+# undef WLOG
+# define WLOG(...) do_log(WARNING_LOG_LEVEL, __func__, __LINE__, __VA_ARGS__)
+# endif
+
+# if MIN_LOG_LEVEL <= ERROR_LOG_LEVEL
+# undef ELOG
+# define ELOG(...) do_log(ERROR_LOG_LEVEL, __func__, __LINE__, __VA_ARGS__)
+# endif
+
+#endif
+
+#endif // NEOVIM_LOG_H
+