23 #define MU_MESSAGE(lev, src, msg, ...) do { \ 24 if ((lev) <= mutils::Log::level) { \ 25 bool db = (mutils::Log::level >= mutils::Log::DEBUG); \ 26 mutils::cxxfprintf(mutils::Log::stream, "%s: %s:%0*d: " msg "\n", \ 27 mutils::Log::name(lev), (db ? (src) : ""), \ 28 (db ? 1 : 4), __LINE__, ## __VA_ARGS__); \ 40 #define MU_MESSAGE_IF(lev, cond, src, msg, ...) do { \ 41 if (cond) { MU_MESSAGE(lev, src, msg, ## __VA_ARGS__); } \ 54 #define MU_MESSAGE_RTN(lev, rtn, cond, src, msg, ...) do { \ 56 MU_MESSAGE(lev, src, msg, ## __VA_ARGS__); \ 68 #define MU_DEBUG(src, msg, ...) \ 69 MU_MESSAGE(mutils::Log::DEBUG, src, msg, ## __VA_ARGS__) 78 #define MU_DEBUG_IF(cond, src, msg, ...) \ 79 MU_MESSAGE_IF(mutils::Log::DEBUG, cond, src, msg, ## __VA_ARGS__) 90 #define MU_DEBUG_RTN(rtn, cond, src, msg, ...) \ 91 MU_MESSAGE_RTN(mutils::Log::DEBUG, rtn, cond, src, msg, ## __VA_ARGS__) 100 #define MU_INFO(src, msg, ...) \ 101 MU_MESSAGE(mutils::Log::INFO, src, msg, ## __VA_ARGS__) 110 #define MU_INFO_IF(cond, src, msg, ...) \ 111 MU_MESSAGE_IF(mutils::Log::INFO, cond, src, msg, ## __VA_ARGS__) 122 #define MU_INFO_RTN(rtn, cond, src, msg, ...) \ 123 MU_MESSAGE_RTN(mutils::Log::INFO, rtn, cond, src, msg, ## __VA_ARGS__) 132 #define MU_WARN(src, msg, ...) \ 133 MU_MESSAGE(mutils::Log::WARN, src, msg, ## __VA_ARGS__) 142 #define MU_WARN_IF(cond, src, msg, ...) \ 143 MU_MESSAGE_IF(mutils::Log::WARN, cond, src, msg, ## __VA_ARGS__) 154 #define MU_WARN_RTN(rtn, cond, src, msg, ...) \ 155 MU_MESSAGE_RTN(mutils::Log::WARN, rtn, cond, src, msg, ## __VA_ARGS__) 164 #define MU_ERROR(src, msg, ...) \ 165 MU_MESSAGE(mutils::Log::ERROR, src, msg, ## __VA_ARGS__) 174 #define MU_ERROR_IF(cond, src, msg, ...) \ 175 MU_MESSAGE_IF(mutils::Log::ERROR, cond, src, msg, ## __VA_ARGS__) 186 #define MU_ERROR_RTN(rtn, cond, src, msg, ...) \ 187 MU_MESSAGE_RTN(mutils::Log::ERROR, rtn, cond, src, msg, ## __VA_ARGS__) 198 #define MU_ERRNO_IF(cond, src, msg, ...) \ 199 MU_MESSAGE_IF(mutils::Log::ERROR, cond, src, msg ": %s", \ 200 ## __VA_ARGS__, strerror(errno)) 213 #define MU_ERRNO_RTN(rtn, cond, src, msg, ...) \ 214 MU_MESSAGE_RTN(mutils::Log::ERROR, rtn, cond, src, msg ": %s", \ 215 ## __VA_ARGS__, strerror(errno)) 225 template<
typename T>
inline T *
Cform(T *p) {
return p; }
228 inline double Cform(
double i) {
return i; }
231 inline unsigned long Cform(
unsigned long long i) {
return i; }
234 inline unsigned long Cform(
unsigned long i) {
return i; }
237 inline unsigned long Cform(
unsigned i) {
return i; }
240 inline long Cform(
long long i) {
return i; }
243 inline long Cform(
long i) {
return i; }
246 inline long Cform(
int i) {
return i; }
249 inline int Cform(
unsigned char i) {
return i; }
252 inline int Cform(
char i) {
return i; }
272 template<
typename... Args>
283 template<
typename... Args>
285 {
return fprintf(f,
Cform(args)...); }
296 template<
typename... Args>
298 {
return snprintf(buf, len,
Cform(args)...); }
313 return (file ==
"-" ? (*mode ==
'r' ? stdin : stdout) :
314 file ==
"!" ? stderr : fopen(file.
c_str(), mode));
326 {
return (fp == stdin || fp == stdout || fp == stderr ? 0 : fclose(fp)); }
356 if (lev <=
ERROR) {
return "ERROR"; }
358 case WARN:
return "WARN";
359 case INFO:
return "INFO";
382 FILE *f =
cxxfopen(fname, append ?
"ab" :
"wb");
401 template <
typename... Args>
407 template <
typename... Args>
413 template <
typename... Args>
414 static int warn(Args&&... args)
419 template <
typename... Args>
420 static int info(Args&&... args)
425 template <
typename... Args>
441 #endif // MUTILS_LOG_H int cxxfclose(FILE *fp)
Standardized fclose().
static std::string file
Message log file name.
static FILE * stream
Message log file stream.
int cxxprintf(Args &&... args)
C printf() with type conversion (not safety).
static constexpr int WARN
Warning condition.
static const char * name(int lev=mutils::Log::level)
Standard logging level name string.
static int error(Args &&... args)
Logs a message at level ERROR.
const char * Cform(const std::string &s)
Converts input to well-defined type for stdio.
static int warn(Args &&... args)
Logs a message at level WARN.
static constexpr int INFO
Informational message.
int cxxsnprintf(char *buf, size_t len, Args &&... args)
C snprintf() with type conversion (not safety).
static int level
Message logging level for output to stream.
static int setStream(const std::string &fname, bool append=true)
Sets the logging stream.
static constexpr int DEBUG
Verbose information.
static int message(int lev, Args &&... args)
Logs a message.
int cxxfprintf(FILE *f, Args &&... args)
C fprintf() with type conversion (not safety).
static constexpr int ERROR
Error condition.
static void setLevel(const std::string &str)
Sets logging level from name string.
static int info(Args &&... args)
Logs a message at level INFO.
static int debug(Args &&... args)
Logs a message at level DEBUG.
FILE * cxxfopen(const std::string &file, const char *mode)
Standardized fopen().