Предложение Джонатана хорошо, но начиная с C99 у нас есть переменные макросы, поэтому не нужно использовать двойные скобки для отладочного макроса.
Существует облегченная версия заголовка журнала, который я использую:
#define LOG_FATAL (1)
#define LOG_ERR (2)
#define LOG_WARN (3)
#define LOG_INFO (4)
#define LOG_DBG (5)
#define LOG(level, ...) do { \
if (level <= debug_level) { \
fprintf(dbgstream,"%s:%d:", __FILE__, __LINE__); \
fprintf(dbgstream, __VA_ARGS__); \
fprintf(dbgstream, "\n"); \
fflush(dbgstream); \
} \
} while (0)
extern FILE *dbgstream;
extern int debug_level;
Так что где бы мне ни нужно что-то регистрировать, я просто добавляю строку вроде
LOG(LOG_ERR, "I/O error %s occured while opening file %s", strerror(errno), filename);
Во время инициализации программы необходимо указать значения для dbgstream
(обычно по умолчанию stderr
) и debug_level
.
Для реальных проектов вместо того, чтобы вызывать fprintf
много раз, я просто вызываю свою функцию из LOG
макроса и передаю __FILE__
, __LINE__
и __VA_ARGS_
в качестве аргумента - эта функция также печатает дату, время и pid в записывать в журнал и не делать fflush()
каждый раз - только когда счетчик буферизации превышает заданное значение - это значительно повышает производительность ведения журнала.
Но учтите, что некоторые компиляторы могут не поддерживать вариационные макросы, так как он был представлен только в C99.