Simple utilities sink - stuff that doesn't fit anywhere else / objects in plain C Snapshot
|
Defines | |
#define | MLOG_ERROR(...) do { if (m_current_log_level >= MLOG_LEVEL_ERROR) { MLOG_printf( MLOG_LEVEL_ERROR, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
#define | MLOG_WARN(...) do { if (m_current_log_level >= MLOG_LEVEL_WARN) { MLOG_printf( MLOG_LEVEL_WARN, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
#define | MLOG_INFO(...) do { if (m_current_log_level >= MLOG_LEVEL_INFO) { MLOG_printf( MLOG_LEVEL_INFO, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
#define | MLOG_DEBUG(...) do { if (m_current_log_level >= MLOG_LEVEL_DEBUG) { MLOG_printf( MLOG_LEVEL_DEBUG, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
#define | MLOG_TRACE(...) do { if (m_current_log_level >= MLOG_LEVEL_TRACE) { MLOG_printf( MLOG_LEVEL_TRACE, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
Enumerations | |
enum | MLOG_LEVEL { MLOG_LEVEL_TURN_OFF_LOGGING, MLOG_LEVEL_ERROR, MLOG_LEVEL_WARN, MLOG_LEVEL_INFO, MLOG_LEVEL_DEBUG, MLOG_LEVEL_TRACE } |
defined logging levels More... | |
enum | MLOG_ACTION { MLOG_ACTION_TO_FILE = 0x1, MLOG_ACTION_SYSLOG_TRACE = 0x2, MLOG_ACTION_CONSOLE = 0x4 } |
actions for logging stuff More... | |
enum | MLOG_PREFIX { MLOG_PREFIX_LOG_LEVEL = 0x1, MLOG_PREFIX_SOURCE_FILE = 0x2, MLOG_PREFIX_TIME = 0x4 } |
features to include in logging prefix More... | |
enum | MLOG_ALLOC { MLOG_ALLOC_STACK, MLOG_ALLOC_HEAP, MLOG_ALLOC_TLS_HEAP } |
how to allocation the scrach pad buffer for logging More... | |
Functions | |
int | MLOG_init (MLOG_LEVEL current, MLOG_ACTION action, void *arg) |
explicitly initialises logging. | |
void | MLOG_set_prefix_features (int prefix) |
sets level of detail added to prefix of log entry (A bitmask of MLOG_PREFIX values) | |
int | MLOG_alloc_option (MLOG_ALLOC option, size_t size) |
determines memory allocation stragegy used here | |
void | MLOG_dump_stack_level (MLOG_LEVEL stack_dump_level) |
set log level for which the current stack is dumped. By default this would happen for LOG_LEVEL_ERROR | |
int | MLOG_printf (MLOG_LEVEL current, const char *file, int line, const char *format,...) |
create a log entry, do not use this function directly, use MLOG_<LOG_LEVEL_NAME> macros instead | |
Variables | |
MLOG_LEVEL | m_current_log_level |
Not so simple logging subsystem - one logging category is supported (one global log level). Otherwise this is a very versatile logging subsystem.
#define MLOG_DEBUG | ( | ... | ) | do { if (m_current_log_level >= MLOG_LEVEL_DEBUG) { MLOG_printf( MLOG_LEVEL_DEBUG, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
#define MLOG_ERROR | ( | ... | ) | do { if (m_current_log_level >= MLOG_LEVEL_ERROR) { MLOG_printf( MLOG_LEVEL_ERROR, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
#define MLOG_INFO | ( | ... | ) | do { if (m_current_log_level >= MLOG_LEVEL_INFO) { MLOG_printf( MLOG_LEVEL_INFO, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
#define MLOG_TRACE | ( | ... | ) | do { if (m_current_log_level >= MLOG_LEVEL_TRACE) { MLOG_printf( MLOG_LEVEL_TRACE, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
#define MLOG_WARN | ( | ... | ) | do { if (m_current_log_level >= MLOG_LEVEL_WARN) { MLOG_printf( MLOG_LEVEL_WARN, __FILE__, __LINE__, __VA_ARGS__ ); } } while(0); |
enum MLOG_ACTION |
actions for logging stuff
MLOG_ACTION_TO_FILE | |
MLOG_ACTION_SYSLOG_TRACE |
log entries are dumped to file |
MLOG_ACTION_CONSOLE |
log entries are dumped to one syslog level |
Definition at line 31 of file logg.h.
{ MLOG_ACTION_TO_FILE = 0x1, /** log entries are dumped to file */ MLOG_ACTION_SYSLOG_TRACE = 0x2, /** log entries are dumped to one syslog level */ MLOG_ACTION_CONSOLE = 0x4, /** log entries are dumped to console */ } MLOG_ACTION;
enum MLOG_ALLOC |
how to allocation the scrach pad buffer for logging
MLOG_ALLOC_STACK | |
MLOG_ALLOC_HEAP |
buffer for logging allocated on stack (alloca) |
MLOG_ALLOC_TLS_HEAP |
buffer for logging allocated on heap (pre log request) |
Definition at line 53 of file logg.h.
{ MLOG_ALLOC_STACK, /** buffer for logging allocated on stack (alloca) */ MLOG_ALLOC_HEAP, /** buffer for logging allocated on heap (pre log request) */ MLOG_ALLOC_TLS_HEAP, /** buffer for logging allocated on heap once for each operating system thread, stored in thread local storage */ } MLOG_ALLOC;
enum MLOG_LEVEL |
defined logging levels
Definition at line 18 of file logg.h.
{ MLOG_LEVEL_TURN_OFF_LOGGING, /** setting this level as currrent level will turn off logging */ MLOG_LEVEL_ERROR, /** logging level for errors */ MLOG_LEVEL_WARN, /** logging level for warnings */ MLOG_LEVEL_INFO, /** logging level for info messages */ MLOG_LEVEL_DEBUG, /** logging level for debug messages */ MLOG_LEVEL_TRACE, /** logging level for trace messages */ } MLOG_LEVEL;
enum MLOG_PREFIX |
features to include in logging prefix
MLOG_PREFIX_LOG_LEVEL | |
MLOG_PREFIX_SOURCE_FILE |
add log level to entry |
MLOG_PREFIX_TIME |
add source file / line number of log statement to entry |
Definition at line 42 of file logg.h.
{ MLOG_PREFIX_LOG_LEVEL = 0x1, /** add log level to entry */ MLOG_PREFIX_SOURCE_FILE = 0x2, /** add source file / line number of log statement to entry */ MLOG_PREFIX_TIME = 0x4, /** add HOUR:MINUTE:SECOND:MICROSECOND to log entry */ } MLOG_PREFIX;
int MLOG_alloc_option | ( | MLOG_ALLOC | option, |
size_t | size | ||
) |
determines memory allocation stragegy used here
option | - how to allocate buffer for logging. options are: use stack (MLOG_ALLOC_STACK), heap (MLOG_ALLOC_HEAP), heap and store in tls (MLOG_ALLOC_TLS_HEAP) |
size | - maximum length of a log entry allowed here. |
Definition at line 57 of file logg.c.
{ alloc_strategy = option; alloc_size = size; if (alloc_strategy == MLOG_ALLOC_TLS_HEAP) { if (log_tls_entry == 0) { if (pthread_key_create( &log_tls_entry, tls_free )) { return -1; } pthread_setspecific( log_tls_entry, 0 ); } } return 0; }
void MLOG_dump_stack_level | ( | MLOG_LEVEL | stack_dump_level | ) |
set log level for which the current stack is dumped. By default this would happen for LOG_LEVEL_ERROR
Definition at line 74 of file logg.c.
{ stack_dump_level = level; }
int MLOG_init | ( | MLOG_LEVEL | current, |
MLOG_ACTION | action, | ||
void * | arg | ||
) |
explicitly initialises logging.
Definition at line 43 of file logg.c.
{ m_current_log_level = current; log_action |= action; if (action & MLOG_ACTION_TO_FILE) { log_fd = open( (const char *) arg , O_CREAT | O_RDWR, S_IWUSR | S_IRUSR ); return log_fd == -1; } return 0; }
int MLOG_printf | ( | MLOG_LEVEL | current, |
const char * | file, | ||
int | line, | ||
const char * | format, | ||
... | |||
) |
create a log entry, do not use this function directly, use MLOG_<LOG_LEVEL_NAME> macros instead
Definition at line 80 of file logg.c.
{ char *sbuf,*pos; size_t buf_size, msg_len; va_list vlist; struct timeval now_time_val; struct tm now_time; int rt; switch(alloc_strategy) { case MLOG_ALLOC_STACK: sbuf = alloca( alloc_size ); break; case MLOG_ALLOC_HEAP: sbuf = (char *) malloc( alloc_size ); if (!sbuf) { return -1; } break; case MLOG_ALLOC_TLS_HEAP: sbuf = pthread_getspecific( log_tls_entry ); if (!sbuf) { sbuf = malloc( alloc_size ); if (!sbuf) { return -1; } pthread_setspecific( log_tls_entry, sbuf ); } break; } buf_size = alloc_size - 2; pos = sbuf; if (log_prefix_level & MLOG_PREFIX_LOG_LEVEL && buf_size > 0) { rt = snprintf( pos, buf_size, "%s : ", log_level_names[ current ] ); if (rt < 0) { return -1; } pos += rt; buf_size -= rt; } if (log_prefix_level & MLOG_PREFIX_SOURCE_FILE && buf_size > 0) { rt = snprintf( pos, buf_size, "[%s:%d] ", file, line ); if (rt < 0) { return -1; } pos += rt; buf_size -= rt; } if (log_prefix_level & MLOG_PREFIX_TIME && buf_size > 0) { gettimeofday( &now_time_val, 0 ); localtime_r( &now_time_val.tv_sec, &now_time); rt = snprintf( pos, buf_size, "%02d:%02d:%02d:%06ld ", (int) now_time.tm_hour, (int) now_time.tm_min, (int) now_time.tm_sec, now_time_val.tv_usec ); if (rt < 0) { return -1; } pos += rt; buf_size -= rt; } if (buf_size > 0) { va_start( vlist, format ); rt = vsnprintf( pos, buf_size, format, vlist ); va_end( vlist ); if (rt < 0) { return -1; } pos += rt; buf_size -= rt; } strcpy( pos, "\n"); msg_len = alloc_size - buf_size - 1; if (log_action & MLOG_ACTION_CONSOLE) { write( 2, sbuf, msg_len ); } if (log_action & MLOG_ACTION_TO_FILE) { write( log_fd, sbuf, msg_len ); } if (log_action & MLOG_ACTION_SYSLOG_TRACE) { syslog( LOG_USER, "%s", sbuf ); } if (current <= stack_dump_level) { if (!errorp_is_file_open()) { errorp_open_file( "err.log" ); } error_dump_string( sbuf, sbuf, alloc_size ); } switch(alloc_strategy) { case MLOG_ALLOC_TLS_HEAP: case MLOG_ALLOC_STACK: break; case MLOG_ALLOC_HEAP: free(sbuf); break; } return 0; }
void MLOG_set_prefix_features | ( | int | prefix | ) |
sets level of detail added to prefix of log entry (A bitmask of MLOG_PREFIX values)