neovim/neovim — pull request #644 by philix (2014-04-29 00:31:57+00:00)
Title: [RFC] Macro-based log utility for Neovim

I find logs very useful for quick debugging while developing. Vim already implemented some ad-hoc logging in some places (see `regexp_nfa.c`, `time_msg()`...). I think that having a generic logging utility is a good idea.

Use cases:
- Log warnings about programming errors, use of deprecated functions...
- Log informational messages that give the programmer a clue about the progress of execution
- Help debugging the MsgPack-RPC server by logging each request
- Quick debug by temporarily adding `DLOG`s to code
- ...

How the log look like:

```
$ tail -f ~/.nvimlog
2014/04/28 17:15:15 [info] 4829 - Starting Neovim main loop.
``

## Main commit message

This commit introduces 4 macros (for different log levels) that can be used
to log messages to $HOME/.neovimlog:

- 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.