If level is higher (less urgent) than the program's verbosity (see options.h) no message will be printed
* @param funct - String indicating the function name from which this function was called.
If this is NULL, Log will show the unspecified_funct string instead
+ * @param file - Source file containing the function
+ * @param line - Line in the source file at which Log is called
* @param fmt - A format string
* @param ... - Arguments to be printed according to the format string
*/
-void LogEx(int level, const char * funct, ...)
+void LogEx(int level, const char * funct, const char * file, int line, ...)
{
//Todo: consider setlogmask(3) to filter messages
const char *fmt;
if (level > g_options.verbosity)
return;
- va_start(va, funct);
+ va_start(va, line);
fmt = va_arg(va, const char*);
if (fmt == NULL) // sanity check
break;
}
- syslog(level, "%s: %s - %s", severity, funct, buffer);
+ syslog(level, "%s: %s (%s:%d) - %s", severity, funct, file, line, buffer);
}
/**
* Handle a Fatal error in the program by printing a message and exiting the program
* CALLING THIS FUNCTION WILL CAUSE THE PROGAM TO EXIT
* @param funct - Name of the calling function
+ * @param file - Name of the source file containing the calling function
+ * @param line - Line in the source file at which Fatal is called
* @param fmt - A format string
* @param ... - Arguments to be printed according to the format string
*/
-void FatalEx(const char * funct, ...)
+void FatalEx(const char * funct, const char * file, int line, ...)
{
const char *fmt;
char buffer[BUFSIZ];
va_list va;
- va_start(va, funct);
+ va_start(va, line);
fmt = va_arg(va, const char*);
if (fmt == NULL)
if (funct == NULL)
funct = unspecified_funct;
- syslog(LOG_CRIT, "FATAL: %s - %s", funct, buffer);
+ syslog(LOG_CRIT, "FATAL: %s (%s:%d) - %s", funct, file, line, buffer);
exit(EXIT_FAILURE);
}
#define _LOG_H
//To get around a 'pedantic' C99 rule that you must have at least 1 variadic arg, combine fmt into that.
-#define Log(level, ...) LogEx(level, __func__, __VA_ARGS__)
-#define Fatal(...) FatalEx(__func__, __VA_ARGS__)
+#define Log(level, ...) LogEx(level, __func__, __FILE__, __LINE__, __VA_ARGS__)
+#define Fatal(...) FatalEx(__func__, __FILE__, __LINE__, __VA_ARGS__)
// An enum to make the severity of log messages human readable in code
enum {LOGERR=0, LOGWARN=1, LOGNOTE=2, LOGINFO=3,LOGDEBUG=4};
-extern void LogEx(int level, const char * funct, ...); // General function for printing log messages to stderr
-extern void FatalEx(const char * funct, ...); // Function that deals with a fatal error (prints a message, then exits the program).
+extern void LogEx(int level, const char * funct, const char * file, int line, ...); // General function for printing log messages to stderr
+extern void FatalEx(const char * funct, const char * file, int line, ...); // Function that deals with a fatal error (prints a message, then exits the program).
#endif //_LOG_H