blob: 59a8cb4b3405f41771cf6ec194eb81ff28c9f34d [file] [log] [blame]
/*
* definition des codes d'error
*
*
* Copyright CEA/DAM/DIF (2008)
* contributeur : Philippe DENIEL philippe.deniel@cea.fr
* Thomas LEIBOVICI thomas.leibovici@cea.fr
*
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* ---------------------------------------
*
*
*/
#ifndef _LOGS_H
#define _LOGS_H
#include <stdio.h>
#include <stdarg.h>
#include <sys/types.h>
#include <sys/param.h>
#include <syslog.h>
#include <inttypes.h>
#ifndef LIBLOG_NO_THREAD
#include <errno.h>
#include <pthread.h>
#endif
#include "gsh_intrinsic.h"
#include "config_parsing.h"
#include "display.h"
/* The maximum size of a log buffer */
#define LOG_BUFF_LEN 2048
/*
* Log message severity constants
*/
typedef enum log_levels {
NIV_NULL,
NIV_FATAL,
NIV_MAJ,
NIV_CRIT,
NIV_WARN,
NIV_EVENT,
NIV_INFO,
NIV_DEBUG,
NIV_MID_DEBUG,
NIV_FULL_DEBUG,
NB_LOG_LEVEL
} log_levels_t;
/*
* Log components used throughout the code.
*/
typedef enum log_components {
COMPONENT_ALL = 0, /* Used for changing logging for all
* components */
COMPONENT_LOG, /* Keep this first, some code depends on it
* being the first component */
COMPONENT_MEM_ALLOC,
COMPONENT_MEMLEAKS,
COMPONENT_FSAL,
COMPONENT_NFSPROTO,
COMPONENT_NFS_V4,
COMPONENT_EXPORT,
COMPONENT_FILEHANDLE,
COMPONENT_DISPATCH,
COMPONENT_CACHE_INODE,
COMPONENT_CACHE_INODE_LRU,
COMPONENT_HASHTABLE,
COMPONENT_HASHTABLE_CACHE,
COMPONENT_DUPREQ,
COMPONENT_INIT,
COMPONENT_MAIN,
COMPONENT_IDMAPPER,
COMPONENT_NFS_READDIR,
COMPONENT_NFS_V4_LOCK,
COMPONENT_CONFIG,
COMPONENT_CLIENTID,
COMPONENT_SESSIONS,
COMPONENT_PNFS,
COMPONENT_RW_LOCK,
COMPONENT_NLM,
COMPONENT_RPC,
COMPONENT_TIRPC,
COMPONENT_NFS_CB,
COMPONENT_THREAD,
COMPONENT_NFS_V4_ACL,
COMPONENT_STATE,
COMPONENT_9P,
COMPONENT_9P_DISPATCH,
COMPONENT_FSAL_UP,
COMPONENT_DBUS,
COMPONENT_NFS_MSK,
COMPONENT_COUNT
} log_components_t;
/* previously at log_macros.h */
typedef void (*cleanup_function) (void);
typedef struct cleanup_list_element {
struct cleanup_list_element *next;
cleanup_function clean;
} cleanup_list_element;
/* Allocates buffer containing debug info to be printed.
* Returned buffer needs to be freed. Returns number of
* characters in size if size != NULL.
*/
char *get_debug_info(int *size);
/* Function prototypes */
void SetNamePgm(const char *nom);
void SetNameHost(const char *nom);
void SetNameFunction(const char *nom); /* thread safe */
void SetClientIP(char *ip_str);
void init_logging(const char *log_path, const int debug_level);
int ReturnLevelAscii(const char *LevelInAscii);
char *ReturnLevelInt(int level);
/* previously at log_macros.h */
void RegisterCleanup(cleanup_list_element *clean);
void Cleanup(void);
void Fatal(void);
/* This function is primarily for setting log level from config, it will
* not override log level set from environment.
*/
void SetComponentLogLevel(log_components_t component, int level_to_set);
void DisplayLogComponentLevel(log_components_t component, const char *file,
int line, const char *function, log_levels_t level,
const char *format, ...)
__attribute__ ((format(printf, 6, 7)));
/* 6=format 7=params */
void LogMallocFailure(const char *file, int line, const char *function,
const char *allocator);
int read_log_config(config_file_t in_config,
struct config_error_type *err_type);
/* These functions display a timeval or timespec into the display buffer
* in the same format used for logging timestamp.
*/
int display_timeval(struct display_buffer *dspbuf, struct timeval *tv);
int display_timespec(struct display_buffer *dspbuf, struct timespec *ts);
typedef enum log_type {
SYSLOG = 0,
FILELOG,
STDERRLOG,
STDOUTLOG,
TESTLOG
} log_type_t;
typedef enum log_header_t {
LH_NONE,
LH_COMPONENT,
LH_ALL,
NB_LH_TYPES
} log_header_t;
/**
* @brief Prototype for special log facility logging functions
*/
typedef int (lf_function_t) (log_header_t headers, void *priv,
log_levels_t level,
struct display_buffer *buffer, char *compstr,
char *message);
int create_log_facility(const char *name, lf_function_t *log_func,
log_levels_t max_level, log_header_t header,
void *private_data);
void release_log_facility(const char *name);
int enable_log_facility(const char *name);
int disable_log_facility(const char *name);
int set_log_destination(const char *name, char *dest);
int set_log_level(const char *name, log_levels_t max_level);
void set_const_log_str(void);
struct log_component_info {
const char *comp_name; /* component name */
const char *comp_str; /* shorter, more useful name */
bool comp_env_set; /* level was set by env(), now RO */
};
extern log_levels_t *component_log_level;
extern struct log_component_info LogComponents[COMPONENT_COUNT];
#define LogAlways(component, format, args...) \
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_NULL, format, ## args); \
#define LogTest(format, args...) \
DisplayLogComponentLevel(COMPONENT_ALL, __FILE__, \
__LINE__, __func__, \
NIV_NULL, format, ## args)
#define LogFatal(component, format, args...) \
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_FATAL, format, ## args)
#define LogMajor(component, format, args...) \
do { \
if (likely(component_log_level[component] \
>= NIV_MAJ)) \
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_MAJ, format, ## args); \
} while (0)
#define LogCrit(component, format, args...) \
do { \
if (likely(component_log_level[component] \
>= NIV_CRIT)) \
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_CRIT, format, ## args); \
} while (0)
#define LogWarn(component, format, args...) \
do { \
if (likely(component_log_level[component] \
>= NIV_WARN)) \
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_WARN, format, ## args); \
} while (0)
#define LogWarnOnce(component, format, args...) \
do { \
static bool warned; \
if (unlikely(!warned) && likely(component_log_level[component] \
>= NIV_WARN)) { \
warned = true; \
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_WARN, format, ## args); \
} \
} while (0)
#define LogEvent(component, format, args...) \
do { \
if (likely(component_log_level[component] \
>= NIV_EVENT)) \
DisplayLogComponentLevel(component, __FILE__,\
__LINE__, \
__func__, \
NIV_EVENT, format, ## args); \
} while (0)
#define LogInfo(component, format, args...) \
do { \
if (unlikely(component_log_level[component] \
>= NIV_INFO)) \
DisplayLogComponentLevel(component, __FILE__,\
__LINE__, \
__func__, \
NIV_INFO, format, ## args); \
} while (0)
#define LogDebug(component, format, args...) \
do { \
if (unlikely(component_log_level[component] \
>= NIV_DEBUG)) \
DisplayLogComponentLevel(component, __FILE__,\
__LINE__, \
__func__, \
NIV_DEBUG, format, ## args); \
} while (0)
#define LogMidDebug(component, format, args...) \
do { \
if (unlikely(component_log_level[component] \
>= NIV_MID_DEBUG)) \
DisplayLogComponentLevel(component, __FILE__,\
__LINE__, \
__func__, \
NIV_MID_DEBUG, \
format, ## args); \
} while (0)
#define LogFullDebug(component, format, args...) \
do { \
if (unlikely(component_log_level[component] \
>= NIV_FULL_DEBUG)) \
DisplayLogComponentLevel(component, __FILE__,\
__LINE__, \
__func__, \
NIV_FULL_DEBUG, \
format, ## args); \
} while (0)
#define \
LogFullDebugOpaque(component, format, buf_size, value, length, args...) \
do { \
if (unlikely(component_log_level[component] \
>= NIV_FULL_DEBUG)) { \
char buf[buf_size]; \
struct display_buffer dspbuf = {buf_size, buf, buf}; \
\
(void) display_opaque_value(&dspbuf, value, length); \
\
DisplayLogComponentLevel(component, __FILE__,\
__LINE__, \
__func__, \
NIV_FULL_DEBUG, \
format, buf, ## args); \
} \
} while (0)
#define LogFullDebugBytes(component, format, buf_size, value, length, args...) \
do { \
if (unlikely(component_log_level[component] \
>= NIV_FULL_DEBUG)) { \
char buf[buf_size]; \
struct display_buffer dspbuf = {buf_size, buf, buf}; \
\
(void) display_opaque_bytes(&dspbuf, value, length); \
\
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_FULL_DEBUG, \
format, buf, ## args); \
} \
} while (0)
#define LogAtLevel(component, level, format, args...) \
do { \
if (unlikely(component_log_level[component] \
>= level)) \
DisplayLogComponentLevel(component, __FILE__,\
__LINE__, \
__func__, \
level, format, ## args); \
} while (0)
#define isLevel(component, level) \
(unlikely(component_log_level[component] >= level))
#define isInfo(component) \
(unlikely(component_log_level[component] >= NIV_INFO))
#define isDebug(component) \
(unlikely(component_log_level[component] >= NIV_DEBUG))
#define isMidDebug(component) \
(unlikely(component_log_level[component] >= NIV_MID_DEBUG))
#define isFullDebug(component) \
(unlikely(component_log_level[component] >= NIV_FULL_DEBUG))
/* Use either the first component, or if it is not at least at level,
* use the second component.
*/
#define LogInfoAlt(comp1, comp2, format, args...) \
do { \
if (unlikely(component_log_level[comp1] \
>= NIV_INFO) || \
unlikely(component_log_level[comp2] \
>= NIV_INFO)) { \
log_components_t component = \
component_log_level[comp1] \
>= NIV_INFO ? comp1 : comp2; \
\
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_INFO, \
"%s: INFO: " format, \
LogComponents[component] \
.comp_str, ## args); \
} \
} while (0)
#define LogDebugAlt(comp1, comp2, format, args...) \
do { \
if (unlikely(component_log_level[comp1] \
>= NIV_DEBUG) || \
unlikely(component_log_level[comp2] \
>= NIV_DEBUG)) { \
log_components_t component = \
component_log_level[comp1] \
>= NIV_DEBUG ? comp1 : comp2; \
\
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_DEBUG, \
"%s: DEBUG: " format, \
LogComponents[component] \
.comp_str, ## args); \
} \
} while (0)
#define LogMidDebugAlt(comp1, comp2, format, args...) \
do { \
if (unlikely(component_log_level[comp1] \
>= NIV_MID_DEBUG) || \
unlikely(component_log_level[comp2] \
>= NIV_MID_DEBUG)) { \
log_components_t component = \
component_log_level[comp1] \
>= NIV_MID_DEBUG ? comp1 : comp2; \
\
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_MID_DEBUG, \
"%s: MID DEBUG: " format, \
LogComponents[component] \
.comp_str, ## args); \
} \
} while (0)
#define LogFullDebugAlt(comp1, comp2, format, args...) \
do { \
if (unlikely(component_log_level[comp1] \
>= NIV_FULL_DEBUG) || \
unlikely(component_log_level[comp2] \
>= NIV_FULL_DEBUG)) { \
log_components_t component = \
component_log_level[comp1] \
>= NIV_FULL_DEBUG ? comp1 : comp2; \
\
DisplayLogComponentLevel(component, __FILE__, \
__LINE__, \
__func__, \
NIV_FULL_DEBUG, \
"%s: FULLDEBUG: " format, \
LogComponents[component] \
.comp_str, ## args); \
} \
} while (0)
/*
* Re-export component logging to TI-RPC internal logging
*/
void rpc_warnx(/* const */ char *fmt, ...);
#ifdef USE_DBUS
extern struct gsh_dbus_interface log_interface;
#endif
#endif