blob: 1489e0de7ea46ea02b219ac653bd30e08f15d45e [file] [log] [blame]
/*
* Copyright (c) 2005, 2006 by KoanLogic s.r.l. - All rights reserved.
*/
#ifndef _U_LOG_H_
#define _U_LOG_H_
#include <stdlib.h>
#include <stdarg.h>
#include <stdio.h>
#include <u/os.h>
#include <u/logprv.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* \defgroup log Logging
* \{
* \par Logging levels
*
* \li LOG_ERR
* \li LOG_WARNING
* \li LOG_INFO
* \li LOG_DEBUG
*
* \par NOTE
* All functions that not contain the [facility] parameter
* reference a variable named "facility" that \b must be
* defined somewhere and must be in scope.
*
* \par Common parameters
*
* \li \c facility:
* logging facility (see syslog(3))
* \li \c ctx:
* if &gt; 0 include the filename, line number
* and function name in the logged message
* \li \c args:
* printf-style variable argument lists
* \li \c expr:
* C expression to evaluate
* \li \c err:
* function return code
* \li \c gt:
* goto label
* \li \c ecode:
* process exit code
*/
/* messages longer then U_MAX_LOG_LENGTH will be silently discarded */
enum { U_MAX_LOG_LENGTH = 1024 };
/** \brief per-process facility variable.
*
* all processes that use the libu must define a "facility" variable somewhere
* to satisfy this external linkage reference.
*
* Such variable will be used as the syslog(3) facility argument.
*
*/
extern int facility;
/** \brief log hook typedef */
typedef int (*u_log_hook_t)(void *arg, int level, const char *str);
/** \brief set a log hook to redirect log messages
*
* Force the log subsystem to use user-provided function to write log messages.
*
* The provided function will be called for each dbg_, warn_ or info_ calls.
*
* \param hook function that will be called to write log messages
* set this param to NULL to set the default syslog-logging
* \param arg an opaque argument that will be passed to the hook function
* \param old [out] will get the previously set hook or NULL if no hook
* has been set
* \param parg [out] will get the previously set hook argument
*
* \return
* 0 on success, not zero on error
*
*/
int u_log_set_hook(u_log_hook_t hook, void *arg, u_log_hook_t *old, void**parg);
/** \brief log an error message and die
*
* Write an error log message and die.
*
* \param ecode exit code
* \param facility facility
* \param ctx set to zero if you don't want context, 1 otherwise
* \param ... printf-style variable length arguments list
*/
#define u_log_err(ecode, facility, ctx, ...) \
do { \
u_log_write(facility, LOG_ERR, ctx, __VA_ARGS__); \
exit(ecode); \
} while(0)
/** \brief log a warning message
*
* Write a warning log message.
*
* \param facility facility
* \param ctx set to zero if you don't want context, 1 otherwise
* \param ... printf-style variable length arguments list
*/
#define u_log_warning(facility, ctx, ...) \
u_log_write(facility, LOG_WARNING, ctx, __VA_ARGS__)
/** \brief log an informational message
*
* Write an informational log message.
*
* \param facility facility
* \param ctx set to zero if you don't want context, 1 otherwise
* \param ... printf-style variable length arguments list
*/
#define u_log_info(facility, ctx, ...) \
u_log_write(facility, LOG_INFO, ctx, __VA_ARGS__)
/** \brief log a debug message
*
* Write a debug log message.
*
* \param facility facility
* \param ctx set to zero if you don't want context, 1 otherwise
* \param ... printf-style variable length arguments list
*/
#define u_log_debug(facility, ctx, ...) \
u_log_write(facility, LOG_DEBUG, ctx, __VA_ARGS__)
/** \brief same as u_log_err but using the \e facility global variable */
#define die(ecode, ...) u_log_err(ecode, facility, 1, __VA_ARGS__)
/** \brief calls die() if \e expr is true */
#define die_if(expr) if(expr) die(EXIT_FAILURE, #expr)
/** \brief same as u_log_warning but using the facility global variable */
#define warning(...) u_log_warning(facility, 1, __VA_ARGS__)
/** \brief same as u_log_info but using the facility global variable */
#define info(...) u_log_info(facility, 0, __VA_ARGS__)
/** \brief same as u_log_debug but using the facility global variable */
#define _debug(...) u_log_debug(facility, 1, __VA_ARGS__)
/** \brief write a log message to stderr */
#define console(...) \
(fprintf(stderr, __VA_ARGS__) && fprintf(stderr, "\n"))
/**
* \}
*/
#ifdef __cplusplus
}
#endif
#endif /* !_U_LOG_H_ */