<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html><head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <title>gmerlin: Logging</title> <link href="tabs.css" rel="stylesheet" type="text/css"> <link href="doxygen.css" rel="stylesheet" type="text/css"> </head><body> <!-- Generated by Doxygen 1.5.9 --> <div class="navigation" id="top"> <div class="tabs"> <ul> <li><a href="index.html"><span>Main Page</span></a></li> <li><a href="pages.html"><span>Related Pages</span></a></li> <li><a href="modules.html"><span>Modules</span></a></li> <li><a href="annotated.html"><span>Data Structures</span></a></li> <li><a href="files.html"><span>Files</span></a></li> <li><a href="dirs.html"><span>Directories</span></a></li> </ul> </div> </div> <div class="contents"> <h1>Logging</h1>Global logging facilities. <a href="#_details">More...</a> <p> <table border="0" cellpadding="0" cellspacing="0"> <tr><td></td></tr> <tr><td colspan="2"><br><h2>Defines</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">#define </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#g262b795751eb4bf4c1b81b72307d2ec1">bg_log</a>(level, domain,...) bg_log_translate(PACKAGE, level, domain, __VA_ARGS__)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Translate a message and send it to the logger. <a href="#g262b795751eb4bf4c1b81b72307d2ec1"></a><br></td></tr> <tr><td colspan="2"><br><h2>Enumerations</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">enum </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> { <br> <a class="el" href="group__log.html#gge67a17c4e8711604c0787e662b3c854ddeb7d197674e880f661e82b491aa7b15">BG_LOG_DEBUG</a> = 1<<0, <br> <a class="el" href="group__log.html#gge67a17c4e8711604c0787e662b3c854d60556643b21fecd47ea6ceb26a63e50b">BG_LOG_WARNING</a> = 1<<1, <br> <a class="el" href="group__log.html#gge67a17c4e8711604c0787e662b3c854d80448b61867f6824a0939da7e5d7630d">BG_LOG_ERROR</a> = 1<<2, <br> <a class="el" href="group__log.html#gge67a17c4e8711604c0787e662b3c854db0dfbf6e2385ed1547e47ed4103321a5">BG_LOG_INFO</a> = 1<<3 <br> }</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Log levels. <a href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">More...</a><br></td></tr> <tr><td colspan="2"><br><h2>Functions</h2></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#g01adf88f8b165f68db5679533213f865">bg_log_notranslate</a> (<a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> level, const char *domain, const char *format,...) __attribute__((format(printf</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Send a message to the logger without translating it. <a href="#g01adf88f8b165f68db5679533213f865"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">void void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#gefdc8a1e163211e33f67907108ec9738">bg_logs_notranslate</a> (<a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> level, const char *domain, const char *str)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Send a message (as complete string) to the logger without translating it. <a href="#gefdc8a1e163211e33f67907108ec9738"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#g852dcd30b29445fc89041cb127180f9b">bg_log_translate</a> (const char *translation_domain, <a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> level, const char *domain, const char *format,...) __attribute__((format(printf</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Translate a message and send it to the logger. <a href="#g852dcd30b29445fc89041cb127180f9b"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#ge444a158d998f37947db5841fd0818fa">bg_log_set_dest</a> (<a class="el" href="group__message__queues.html#g06c6bfc0f61ce4013b6d4117d299fa5a">bg_msg_queue_t</a> *q)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Set the log destination. <a href="#ge444a158d998f37947db5841fd0818fa"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">const char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#g7045e91c07106b1066356bba23243fc3">bg_log_level_to_string</a> (<a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> level)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Convert a log level to a human readable string. <a href="#g7045e91c07106b1066356bba23243fc3"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">void </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#gd02ccd392512ab079286a5c1110c8c72">bg_log_set_verbose</a> (int mask)</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Set verbosity mask. <a href="#gd02ccd392512ab079286a5c1110c8c72"></a><br></td></tr> <tr><td class="memItemLeft" nowrap align="right" valign="top">char * </td><td class="memItemRight" valign="bottom"><a class="el" href="group__log.html#g206f510eb8e179b2ef361a493803c016">bg_log_last_error</a> ()</td></tr> <tr><td class="mdescLeft"> </td><td class="mdescRight">Get last error message. <a href="#g206f510eb8e179b2ef361a493803c016"></a><br></td></tr> </table> <hr><a name="_details"></a><h2>Detailed Description</h2> Global logging facilities. <p> The logging mechanism is used for everything, which would be done with fprintf(stderr, ...) in simpler applications. It is the only mechanism, which used global variables, i.e. the functions <a class="el" href="group__log.html#ge444a158d998f37947db5841fd0818fa">bg_log_set_dest</a> and <a class="el" href="group__log.html#gd02ccd392512ab079286a5c1110c8c72">bg_log_set_verbose</a>. They should be called just once during application startup. The function <a class="el" href="group__log.html#g262b795751eb4bf4c1b81b72307d2ec1">bg_log</a> can, of course, be called from multiple threads simultaneously. <hr><h2>Define Documentation</h2> <a class="anchor" name="g262b795751eb4bf4c1b81b72307d2ec1"></a><!-- doxytag: member="log.h::bg_log" ref="g262b795751eb4bf4c1b81b72307d2ec1" args="(level, domain,...)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">#define bg_log </td> <td>(</td> <td class="paramtype">level, <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">domain, <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"> <em>...</em> </td> <td class="paramname"> </td> <td> ) </td> <td> bg_log_translate(PACKAGE, level, domain, __VA_ARGS__)</td> </tr> </table> </div> <div class="memdoc"> <p> Translate a message and send it to the logger. <p> </div> </div><p> <hr><h2>Enumeration Type Documentation</h2> <a class="anchor" name="ge67a17c4e8711604c0787e662b3c854d"></a><!-- doxytag: member="log.h::bg_log_level_t" ref="ge67a17c4e8711604c0787e662b3c854d" args="" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">enum <a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> </td> </tr> </table> </div> <div class="memdoc"> <p> Log levels. <p> These specify the type and severity of a message. They can also be ORed for a call to <a class="el" href="group__log.html#gd02ccd392512ab079286a5c1110c8c72">bg_log_set_verbose</a>. <dl compact><dt><b>Enumerator: </b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"><em><a class="anchor" name="gge67a17c4e8711604c0787e662b3c854ddeb7d197674e880f661e82b491aa7b15"></a><!-- doxytag: member="BG_LOG_DEBUG" ref="gge67a17c4e8711604c0787e662b3c854ddeb7d197674e880f661e82b491aa7b15" args="" -->BG_LOG_DEBUG</em> </td><td> Only for programmers, useless for users. </td></tr> <tr><td valign="top"><em><a class="anchor" name="gge67a17c4e8711604c0787e662b3c854d60556643b21fecd47ea6ceb26a63e50b"></a><!-- doxytag: member="BG_LOG_WARNING" ref="gge67a17c4e8711604c0787e662b3c854d60556643b21fecd47ea6ceb26a63e50b" args="" -->BG_LOG_WARNING</em> </td><td> Something went wrong, but is not fatal. </td></tr> <tr><td valign="top"><em><a class="anchor" name="gge67a17c4e8711604c0787e662b3c854d80448b61867f6824a0939da7e5d7630d"></a><!-- doxytag: member="BG_LOG_ERROR" ref="gge67a17c4e8711604c0787e662b3c854d80448b61867f6824a0939da7e5d7630d" args="" -->BG_LOG_ERROR</em> </td><td> Something went wrong, cannot continue. </td></tr> <tr><td valign="top"><em><a class="anchor" name="gge67a17c4e8711604c0787e662b3c854db0dfbf6e2385ed1547e47ed4103321a5"></a><!-- doxytag: member="BG_LOG_INFO" ref="gge67a17c4e8711604c0787e662b3c854db0dfbf6e2385ed1547e47ed4103321a5" args="" -->BG_LOG_INFO</em> </td><td> Something interesting the user might want to know. </td></tr> </table> </dl> </div> </div><p> <hr><h2>Function Documentation</h2> <a class="anchor" name="g01adf88f8b165f68db5679533213f865"></a><!-- doxytag: member="log.h::bg_log_notranslate" ref="g01adf88f8b165f68db5679533213f865" args="(bg_log_level_t level, const char *domain, const char *format,...) __attribute__((format(printf" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void bg_log_notranslate </td> <td>(</td> <td class="paramtype"><a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> </td> <td class="paramname"> <em>level</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">const char * </td> <td class="paramname"> <em>domain</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">const char * </td> <td class="paramname"> <em>format</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"> </td> <td class="paramname"> <em>...</em></td><td> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td><td></td> </tr> </table> </div> <div class="memdoc"> <p> Send a message to the logger without translating it. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>level</em> </td><td>Level </td></tr> <tr><td valign="top"></td><td valign="top"><em>domain</em> </td><td>The name of the volume </td></tr> <tr><td valign="top"></td><td valign="top"><em>format</em> </td><td>Format like for printf</td></tr> </table> </dl> All other arguments must match the format string.<p> This function either prints a message to stderr (if you didn't case <a class="el" href="group__log.html#ge444a158d998f37947db5841fd0818fa">bg_log_set_dest</a> and level is contained in the mask you passed to bg_log_set_verbose) or puts a message into the queue you passed to bg_log_set_dest. </div> </div><p> <a class="anchor" name="gefdc8a1e163211e33f67907108ec9738"></a><!-- doxytag: member="log.h::bg_logs_notranslate" ref="gefdc8a1e163211e33f67907108ec9738" args="(bg_log_level_t level, const char *domain, const char *str)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void void bg_logs_notranslate </td> <td>(</td> <td class="paramtype"><a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> </td> <td class="paramname"> <em>level</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">const char * </td> <td class="paramname"> <em>domain</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">const char * </td> <td class="paramname"> <em>str</em></td><td> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td><td></td> </tr> </table> </div> <div class="memdoc"> <p> Send a message (as complete string) to the logger without translating it. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>level</em> </td><td>Level </td></tr> <tr><td valign="top"></td><td valign="top"><em>domain</em> </td><td>The name of the volume </td></tr> <tr><td valign="top"></td><td valign="top"><em>str</em> </td><td>Message string</td></tr> </table> </dl> All other arguments must match the format string.<p> This function either prints a message to stderr (if you didn't case <a class="el" href="group__log.html#ge444a158d998f37947db5841fd0818fa">bg_log_set_dest</a> and level is contained in the mask you passed to bg_log_set_verbose) or puts a message into the queue you passed to bg_log_set_dest. </div> </div><p> <a class="anchor" name="g852dcd30b29445fc89041cb127180f9b"></a><!-- doxytag: member="log.h::bg_log_translate" ref="g852dcd30b29445fc89041cb127180f9b" args="(const char *translation_domain, bg_log_level_t level, const char *domain, const char *format,...) __attribute__((format(printf" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void bg_log_translate </td> <td>(</td> <td class="paramtype">const char * </td> <td class="paramname"> <em>translation_domain</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"><a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> </td> <td class="paramname"> <em>level</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">const char * </td> <td class="paramname"> <em>domain</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype">const char * </td> <td class="paramname"> <em>format</em>, </td> </tr> <tr> <td class="paramkey"></td> <td></td> <td class="paramtype"> </td> <td class="paramname"> <em>...</em></td><td> </td> </tr> <tr> <td></td> <td>)</td> <td></td><td></td><td></td> </tr> </table> </div> <div class="memdoc"> <p> Translate a message and send it to the logger. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>translation_domain</em> </td><td>Gettext domain (usually package name) </td></tr> <tr><td valign="top"></td><td valign="top"><em>level</em> </td><td>Level </td></tr> <tr><td valign="top"></td><td valign="top"><em>domain</em> </td><td>The name of the volume </td></tr> <tr><td valign="top"></td><td valign="top"><em>format</em> </td><td>Format like for printf</td></tr> </table> </dl> All other arguments must match the format string.<p> This function either prints a message to stderr (if you didn't case <a class="el" href="group__log.html#ge444a158d998f37947db5841fd0818fa">bg_log_set_dest</a> and level is contained in the mask you passed to bg_log_set_verbose) or puts a message into the queue you passed to bg_log_set_dest. </div> </div><p> <a class="anchor" name="ge444a158d998f37947db5841fd0818fa"></a><!-- doxytag: member="log.h::bg_log_set_dest" ref="ge444a158d998f37947db5841fd0818fa" args="(bg_msg_queue_t *q)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void bg_log_set_dest </td> <td>(</td> <td class="paramtype"><a class="el" href="group__message__queues.html#g06c6bfc0f61ce4013b6d4117d299fa5a">bg_msg_queue_t</a> * </td> <td class="paramname"> <em>q</em> </td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p> Set the log destination. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>q</em> </td><td>Message queue</td></tr> </table> </dl> This sets a global message queue to which log messages will be sent. The format of the logging messages is simple: The message id is equal to the log level (see <a class="el" href="group__messages.html#ge92b3b5d1d0d1ee5e126e294de930a4a">bg_msg_get_id</a>). The first two arguments are strings for the domain and the actual message respectively (see <a class="el" href="group__messages.html#g72c9af047298b6aff882a3df112fb81f">bg_msg_get_arg_string</a>).<p> Note, that logging will become asynchronous with this method. Also, single threaded applications always must remember to handle messages from the log queue after they did something critical. </div> </div><p> <a class="anchor" name="g7045e91c07106b1066356bba23243fc3"></a><!-- doxytag: member="log.h::bg_log_level_to_string" ref="g7045e91c07106b1066356bba23243fc3" args="(bg_log_level_t level)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">const char* bg_log_level_to_string </td> <td>(</td> <td class="paramtype"><a class="el" href="group__log.html#ge67a17c4e8711604c0787e662b3c854d">bg_log_level_t</a> </td> <td class="paramname"> <em>level</em> </td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p> Convert a log level to a human readable string. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>level</em> </td><td>Log level </td></tr> </table> </dl> <dl class="return" compact><dt><b>Returns:</b></dt><dd>A human readable string describing the log level </dd></dl> </div> </div><p> <a class="anchor" name="gd02ccd392512ab079286a5c1110c8c72"></a><!-- doxytag: member="log.h::bg_log_set_verbose" ref="gd02ccd392512ab079286a5c1110c8c72" args="(int mask)" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">void bg_log_set_verbose </td> <td>(</td> <td class="paramtype">int </td> <td class="paramname"> <em>mask</em> </td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p> Set verbosity mask. <p> <dl compact><dt><b>Parameters:</b></dt><dd> <table border="0" cellspacing="2" cellpadding="0"> <tr><td valign="top"></td><td valign="top"><em>mask</em> </td><td>ORed log levels, which should be printed</td></tr> </table> </dl> Note, that this function is not thread save and has no effect if logging is done with a message queue. </div> </div><p> <a class="anchor" name="g206f510eb8e179b2ef361a493803c016"></a><!-- doxytag: member="log.h::bg_log_last_error" ref="g206f510eb8e179b2ef361a493803c016" args="()" --> <div class="memitem"> <div class="memproto"> <table class="memname"> <tr> <td class="memname">char* bg_log_last_error </td> <td>(</td> <td class="paramname"> </td> <td> ) </td> <td></td> </tr> </table> </div> <div class="memdoc"> <p> Get last error message. <p> <dl class="return" compact><dt><b>Returns:</b></dt><dd>The last error message, must be freed</dd></dl> Use this only if you didn't set an log destination and you can make sure, that only your thread can trigger an error. </div> </div><p> </div> <hr size="1"><address style="text-align: right;"><small>Generated on Sat Aug 22 01:28:05 2009 for gmerlin by <a href="http://www.doxygen.org/index.html"> <img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.5.9 </small></address> </body> </html>