解决这个问题的一种方法是建立一个宏系统,它可以很容易地关闭 printfs 而无需在代码中删除它们。我使用这样的东西:
#define LOGMESSAGE(LEVEL, ...) logging_messagef(LEVEL, __FILE__, __LINE__, __FUNCTION__, __VA_ARGS__);
/* Generally speaking, user code should only use these macros. They
* are pithy. You can use them like a printf:
*
* DBGMESSAGE("%f%% chance of fnords for the next %d days.", fnordProb, days);
*
* You don't need to put newlines in them; the logging functions will
* do that when appropriate.
*/
#define FATALMESSAGE(...) LOGMESSAGE(LOG_FATAL, __VA_ARGS__);
#define EMERGMESSAGE(...) LOGMESSAGE(LOG_EMERG, __VA_ARGS__);
#define ALERTMESSAGE(...) LOGMESSAGE(LOG_ALERT, __VA_ARGS__);
#define CRITMESSAGE(...) LOGMESSAGE(LOG_CRIT, __VA_ARGS__);
#define ERRMESSAGE(...) LOGMESSAGE(LOG_ERR, __VA_ARGS__);
#define WARNMESSAGE(...) LOGMESSAGE(LOG_WARNING, __VA_ARGS__);
#define NOTICEMESSAGE(...) LOGMESSAGE(LOG_NOTICE, __VA_ARGS__);
#define INFOMESSAGE(...) LOGMESSAGE(LOG_INFO, __VA_ARGS__);
#define DBGMESSAGE(...) LOGMESSAGE(LOG_DEBUG, __VA_ARGS__);
#if defined(PAINFULLY_VERBOSE)
# define PV_DBGMESSAGE(...) LOGMESSAGE(LOG_DEBUG, __VA_ARGS__);
#else
# define PV_DBGMESSAGE(...) ((void)0);
#endif
logging_messagef()
是在单独.c
文件中定义的函数。根据消息的用途,在代码中使用 XMESSAGE(...) 宏。这个设置最好的一点是它可以同时用于调试和日志记录,并且logging_messagef()
可以更改函数以执行多种不同的操作(printf 到 stderr,到日志文件,使用 syslog 或其他一些系统日志记录工具等.),logging_messagef()
当您不需要它们时, 可以忽略低于特定级别的消息。PV_DBGMESSAGE()
适用于那些您肯定希望在生产中关闭的大量调试消息。