Files | |
file | qoflog.h |
QOF error logging and tracing facility. | |
Defines | |
#define | QOF_MOD_ENGINE "qof-engine" |
#define | LOG_LEVEL_LIST(_) |
#define | FUNK qof_log_prettify(__FUNCTION__) |
#define | FATAL(format, args...) |
#define | PERR(format, args...) |
#define | PWARN(format, args...) |
#define | PINFO(format, args...) |
#define | DEBUG(format, args...) |
#define | ENTER(format, args...) |
#define | LEAVE(format, args...) |
#define | TRACE(format, args...) |
#define | DEBUGCMD(x) |
Typedefs | |
typedef void(* | QofLogCB )(QofLogModule log_module, QofLogLevel *log_level, gpointer user_data) |
Functions | |
void | qof_log_add_indent (void) |
gint | qof_log_get_indent (void) |
void | qof_log_drop_indent (void) |
void | qof_log_init (void) |
void | qof_log_set_level (QofLogModule module, QofLogLevel level) |
void | qof_log_set_level_registered (QofLogLevel level) |
void | qof_log_set_file (FILE *outfile) |
void | qof_log_init_filename (const gchar *logfilename) |
void | qof_log_shutdown (void) |
const gchar * | qof_log_prettify (const gchar *name) |
gboolean | qof_log_check (QofLogModule log_module, QofLogLevel log_level) |
void | qof_log_set_default (QofLogLevel log_level) |
void | qof_log_module_foreach (QofLogCB cb, gpointer data) |
gint | qof_log_module_count (void) |
#define DEBUG | ( | format, | |||
args... | ) |
do { \ if (qof_log_check (log_module, QOF_LOG_DEBUG)) { \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ "Debug: %s(): " format, \ FUNK , ## args); \ } \ } while (0)
Print a debugging message
#define DEBUGCMD | ( | x | ) |
do { \ if (qof_log_check (log_module, QOF_LOG_DEBUG)) { \ (x); \ } \ } while (0)
#define ENTER | ( | format, | |||
args... | ) |
do { \ if (qof_log_check (log_module, QOF_LOG_DEBUG)) { \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ "Enter in %s: %s()" format, __FILE__, \ FUNK , ## args); \ qof_log_add_indent(); \ } \ } while (0)
Print a function entry debugging message
#define FATAL | ( | format, | |||
args... | ) |
do { \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_ERROR, \ "Fatal Error: %s(): " format, FUNK , ## args); \ } while (0)
Log error/warning/info messages to stderr or to a file. This logging infrastructure is meant for validating the correctness of the execution of the code. 'Info' level messages help trace program flow. 'Error' messages are meant to indicate internal data inconsistencies.
Messages can be logged to stdout, stderr, or to any desired file. Log a fatal error
#define LEAVE | ( | format, | |||
args... | ) |
do { \ if (qof_log_check (log_module, QOF_LOG_DEBUG)) { \ qof_log_drop_indent(); \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ "Leave: %s()" format, \ FUNK , ## args); \ } \ } while (0)
Print a function exit debugging message
#define LOG_LEVEL_LIST | ( | _ | ) |
#define PERR | ( | format, | |||
args... | ) |
do { \ if (qof_log_check (log_module, QOF_LOG_ERROR)) { \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL, \ "Error: %s(): " format, FUNK , ## args); \ } \ } while (0)
Log a serious error
#define PINFO | ( | format, | |||
args... | ) |
do { \ if (qof_log_check (log_module, QOF_LOG_INFO)) { \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_INFO, \ "Info: %s(): " format, \ FUNK , ## args); \ } \ } while (0)
Print an informational note
#define PWARN | ( | format, | |||
args... | ) |
do { \ if (qof_log_check (log_module, QOF_LOG_WARNING)) { \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING, \ "Warning: %s(): " format, FUNK , ## args); \ } \ } while (0)
Log a warning
#define TRACE | ( | format, | |||
args... | ) |
do { \ if (qof_log_check (log_module, QOF_LOG_TRACE)) { \ g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, \ "Trace: %s(): " format, FUNK , ## args); \ } \ } while (0)
Print a function trace debugging message
void qof_log_add_indent | ( | void | ) |
Convert QofLogLevel to a string.
The macro correlates the enum value and an exact copy as a string, removing the need to keep two separate lists in sync. Convert a QofLogLevel to the log_string
Only for use as a partner to QofLogLevelfromString Convert the log_string to a QofLogLevel
Only for use as a partner to QofLogLevelasString indents once for each ENTER macro
gboolean qof_log_check | ( | QofLogModule | log_module, | |
QofLogLevel | log_level | |||
) |
Do not log log_modules that have not been enabled.
Definition at line 207 of file qoflog.c.
00208 { 00209 gchar *log_string; 00210 /* Any positive log_level less than this will be logged. */ 00211 QofLogLevel maximum; 00212 00213 log_string = NULL; 00214 if (log_level > QOF_LOG_TRACE) 00215 log_level = QOF_LOG_TRACE; 00216 if (!log_table || log_module == NULL) 00217 { 00218 return FALSE; 00219 } 00220 log_string = (gchar *) g_hash_table_lookup (log_table, log_module); 00221 /* if log_module not found, do not log. */ 00222 if (!log_string) 00223 { 00224 return FALSE; 00225 } 00226 maximum = QofLogLevelfromString (log_string); 00227 if (log_level <= maximum) 00228 { 00229 return TRUE; 00230 } 00231 return FALSE; 00232 }
void qof_log_drop_indent | ( | void | ) |
gint qof_log_get_indent | ( | void | ) |
void qof_log_init | ( | void | ) |
Initialize the error logging subsystem
Instead, use qof_log_init_filename which sets the filename and initialises the logging subsystem in one operation.
Definition at line 77 of file qoflog.c.
00078 { 00079 if (!fout) /* allow qof_log_set_file */ 00080 { 00081 fout = fopen ("/tmp/qof.trace", "w"); 00082 } 00083 00084 if (!fout && (filename = (gchar *) g_malloc (MAX_TRACE_FILENAME))) 00085 { 00086 snprintf (filename, MAX_TRACE_FILENAME - 1, "/tmp/qof.trace.%d", 00087 getpid ()); 00088 fout = fopen (filename, "w"); 00089 g_free (filename); 00090 } 00091 00092 if (!fout) 00093 fout = stderr; 00094 00095 g_log_set_handler (G_LOG_DOMAIN, G_LOG_LEVEL_MASK, fh_printer, fout); 00096 }
void qof_log_init_filename | ( | const gchar * | logfilename | ) |
Specify a filename for log output.
Calls qof_log_init() for you.
Definition at line 147 of file qoflog.c.
00148 { 00149 if (!logfilename) 00150 { 00151 fout = stderr; 00152 } 00153 else 00154 { 00155 filename = g_strdup (logfilename); 00156 fout = fopen (filename, "w"); 00157 } 00158 qof_log_init (); 00159 }
gint qof_log_module_count | ( | void | ) |
void qof_log_module_foreach | ( | QofLogCB | cb, | |
gpointer | data | |||
) |
Iterate over each known log_module
Only log_modules with log_levels set will be available.
const gchar* qof_log_prettify | ( | const gchar * | name | ) |
qof_log_prettify() cleans up subroutine names. AIX/xlC has the habit of printing signatures not names; clean this up. On other operating systems, truncate name to QOF_LOG_MAX_CHARS chars.
Definition at line 180 of file qoflog.c.
00181 { 00182 gchar *p, *buffer; 00183 gint length; 00184 00185 if (!name) 00186 { 00187 return ""; 00188 } 00189 buffer = g_strndup (name, QOF_LOG_MAX_CHARS - 1); 00190 length = strlen (buffer); 00191 p = g_strstr_len (buffer, length, "("); 00192 if (p) 00193 { 00194 *(p + 1) = ')'; 00195 *(p + 2) = 0x0; 00196 } 00197 else 00198 { 00199 strcpy (&buffer[QOF_LOG_MAX_CHARS - 4], "...()"); 00200 } 00201 function_buffer = g_strdup (buffer); 00202 g_free (buffer); 00203 return function_buffer; 00204 }
void qof_log_set_default | ( | QofLogLevel | log_level | ) |
Set the default QOF log_modules to the log level.
Definition at line 235 of file qoflog.c.
00236 { 00237 qof_log_set_level (QOF_MOD_BACKEND, log_level); 00238 qof_log_set_level (QOF_MOD_CLASS, log_level); 00239 qof_log_set_level (QOF_MOD_ENGINE, log_level); 00240 qof_log_set_level (QOF_MOD_OBJECT, log_level); 00241 qof_log_set_level (QOF_MOD_KVP, log_level); 00242 qof_log_set_level (QOF_MOD_MERGE, log_level); 00243 qof_log_set_level (QOF_MOD_QUERY, log_level); 00244 qof_log_set_level (QOF_MOD_SESSION, log_level); 00245 qof_log_set_level (QOF_MOD_CHOICE, log_level); 00246 qof_log_set_level (QOF_MOD_UTIL, log_level); 00247 qof_log_set_level (QOF_MOD_TIME, log_level); 00248 qof_log_set_level (QOF_MOD_DATE, log_level); 00249 qof_log_set_level (QOF_MOD_UNDO, log_level); 00250 qof_log_set_level (QOF_MOD_ERROR, log_level); 00251 qof_log_set_level (QOF_MOD_QSF, log_level); 00252 qof_log_set_level (QOF_MOD_SQLITE, log_level); 00253 qof_log_set_level (QOF_MOD_GDA, log_level); 00254 }
void qof_log_set_file | ( | FILE * | outfile | ) |
Specify an alternate log output, to pipe or file. By default, all logging goes to /tmp/qof.trace
Needs to be called before qof_log_init()
void qof_log_set_level | ( | QofLogModule | module, | |
QofLogLevel | level | |||
) |
Set the logging level of the given log_module.
Registers the log_module with the qof_log hashtable and sets an initial value for the loglevel for that log_module.
Definition at line 99 of file qoflog.c.
00100 { 00101 gchar *level_string; 00102 00103 if (!log_module || level == 0) 00104 { 00105 return; 00106 } 00107 level_string = g_strdup (QofLogLevelasString (level)); 00108 if (!log_table) 00109 { 00110 log_table = g_hash_table_new (g_str_hash, g_str_equal); 00111 } 00112 g_hash_table_insert (log_table, (gpointer) log_module, level_string); 00113 }
void qof_log_set_level_registered | ( | QofLogLevel | level | ) |
Set the logging level for all registered log_modules.
"silent" log_modules are supported by the qof_log_set_level_registered function which only moderates log_levels for those modules actually registered. The advantage is that a developer can omit existing log_modules from the init code and cut down the amount of unwanted logging.
e.g. if you are working in one section of the code and do not want the extra log information created by allowing the default modules to log as well. This makes the log itself easier to use when working in a small area of the codebase. Silent log_modules can also be useful where no default currently exists - again to isolate certain sections of the default log output - and using qof_log_set_level_registered allows these silent log_modules to be retained in the code without being logged by other developers etc.
void qof_log_shutdown | ( | void | ) |
Be nice, close the logfile if possible.