Blame libglusterfs/src/glusterfs/logging.h

Packit Service e080da
/*
Packit Service e080da
  Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com>
Packit Service e080da
  This file is part of GlusterFS.
Packit Service e080da
Packit Service e080da
  This file is licensed to you under your choice of the GNU Lesser
Packit Service e080da
  General Public License, version 3 or any later version (LGPLv3 or
Packit Service e080da
  later), or the GNU General Public License, version 2 (GPLv2), in all
Packit Service e080da
  cases as published by the Free Software Foundation.
Packit Service e080da
*/
Packit Service e080da
Packit Service e080da
#ifndef __LOGGING_H__
Packit Service e080da
#define __LOGGING_H__
Packit Service e080da
Packit Service e080da
#include <sys/time.h>
Packit Service e080da
#include <stdint.h>
Packit Service e080da
#include <stdio.h>
Packit Service e080da
#include <stdarg.h>
Packit Service e080da
#include <pthread.h>
Packit Service e080da
#include "glusterfs/list.h"
Packit Service e080da
Packit Service e080da
#ifdef GF_DARWIN_HOST_OS
Packit Service e080da
#define GF_PRI_FSBLK "u"
Packit Service e080da
#define GF_PRI_DEV PRId32
Packit Service e080da
#define GF_PRI_INODE PRIu64
Packit Service e080da
#define GF_PRI_NLINK PRIu32
Packit Service e080da
#define GF_PRI_SECOND "ld"
Packit Service e080da
#define GF_PRI_SUSECONDS "06d"
Packit Service e080da
#define GF_PRI_SNSECONDS "09ld"
Packit Service e080da
#define GF_PRI_USEC "d"
Packit Service e080da
#else
Packit Service e080da
#define GF_PRI_FSBLK PRIu64
Packit Service e080da
#define GF_PRI_DEV PRIu64
Packit Service e080da
#define GF_PRI_INODE PRIu64
Packit Service e080da
#define GF_PRI_NLINK PRIu32
Packit Service e080da
#define GF_PRI_SECOND "lu"
Packit Service e080da
#define GF_PRI_SUSECONDS "06ld"
Packit Service e080da
#define GF_PRI_SNSECONDS "09ld"
Packit Service e080da
#define GF_PRI_USEC "ld"
Packit Service e080da
#endif
Packit Service e080da
#define GF_PRI_BLKSIZE PRId32
Packit Service e080da
#define GF_PRI_SIZET "zu"
Packit Service e080da
#define GF_PRI_ATOMIC PRIu64
Packit Service e080da
Packit Service e080da
#ifdef GF_DARWIN_HOST_OS
Packit Service e080da
#define GF_PRI_TIME "ld"
Packit Service e080da
#else
Packit Service e080da
#define GF_PRI_TIME PRIu64
Packit Service e080da
#endif
Packit Service e080da
Packit Service e080da
#if 0
Packit Service e080da
/* Syslog definitions :-) */
Packit Service e080da
#define LOG_EMERG 0   /* system is unusable */
Packit Service e080da
#define LOG_ALERT 1   /* action must be taken immediately */
Packit Service e080da
#define LOG_CRIT 2    /* critical conditions */
Packit Service e080da
#define LOG_ERR 3     /* error conditions */
Packit Service e080da
#define LOG_WARNING 4 /* warning conditions */
Packit Service e080da
#define LOG_NOTICE 5  /* normal but significant condition */
Packit Service e080da
#define LOG_INFO 6    /* informational */
Packit Service e080da
#define LOG_DEBUG 7   /* debug-level messages */
Packit Service e080da
#endif
Packit Service e080da
Packit Service e080da
#define GF_LOG_FORMAT_NO_MSG_ID "no-msg-id"
Packit Service e080da
#define GF_LOG_FORMAT_WITH_MSG_ID "with-msg-id"
Packit Service e080da
Packit Service e080da
#define GF_LOGGER_GLUSTER_LOG "gluster-log"
Packit Service e080da
#define GF_LOGGER_SYSLOG "syslog"
Packit Service e080da
Packit Service e080da
typedef enum {
Packit Service e080da
    GF_LOG_NONE,
Packit Service e080da
    GF_LOG_EMERG,
Packit Service e080da
    GF_LOG_ALERT,
Packit Service e080da
    GF_LOG_CRITICAL, /* fatal errors */
Packit Service e080da
    GF_LOG_ERROR,    /* major failures (not necessarily fatal) */
Packit Service e080da
    GF_LOG_WARNING,  /* info about normal operation */
Packit Service e080da
    GF_LOG_NOTICE,
Packit Service e080da
    GF_LOG_INFO,  /* Normal information */
Packit Service e080da
    GF_LOG_DEBUG, /* internal errors */
Packit Service e080da
    GF_LOG_TRACE, /* full trace of operation */
Packit Service e080da
} gf_loglevel_t;
Packit Service e080da
Packit Service e080da
/* format for the logs */
Packit Service e080da
typedef enum {
Packit Service e080da
    gf_logformat_traditional = 0, /* Format as in gluster 3.5 */
Packit Service e080da
    gf_logformat_withmsgid, /* Format enhanced with MsgID, ident, errstr */
Packit Service e080da
    gf_logformat_cee        /* log enhanced format in cee */
Packit Service e080da
} gf_log_format_t;
Packit Service e080da
Packit Service e080da
/* log infrastructure to log to */
Packit Service e080da
typedef enum {
Packit Service e080da
    gf_logger_glusterlog = 0, /* locations and files as in gluster 3.5 */
Packit Service e080da
    gf_logger_syslog          /* log to (r)syslog, based on (r)syslog conf */
Packit Service e080da
    /* NOTE: In the future journald, lumberjack, next new thing here */
Packit Service e080da
} gf_log_logger_t;
Packit Service e080da
Packit Service e080da
#define DEFAULT_LOG_FILE_DIRECTORY DATADIR "/log/glusterfs"
Packit Service e080da
#define DEFAULT_QUOTA_CRAWL_LOG_DIRECTORY DATADIR "/log/glusterfs/quota_crawl"
Packit Service e080da
#define DEFAULT_LOG_LEVEL GF_LOG_INFO
Packit Service e080da
Packit Service e080da
typedef struct gf_log_handle_ {
Packit Service e080da
    pthread_mutex_t logfile_mutex;
Packit Service e080da
    uint8_t logrotate;
Packit Service e080da
    uint8_t cmd_history_logrotate;
Packit Service e080da
    gf_loglevel_t loglevel;
Packit Service e080da
    int gf_log_syslog;
Packit Service e080da
    gf_loglevel_t sys_log_level;
Packit Service e080da
    char *filename;
Packit Service e080da
    FILE *logfile;
Packit Service e080da
    FILE *gf_log_logfile;
Packit Service e080da
    char *cmd_log_filename;
Packit Service e080da
    FILE *cmdlogfile;
Packit Service e080da
    gf_log_logger_t logger;
Packit Service e080da
    gf_log_format_t logformat;
Packit Service e080da
    char *ident;
Packit Service e080da
    int log_control_file_found;
Packit Service e080da
    struct list_head lru_queue;
Packit Service e080da
    uint32_t lru_size;
Packit Service e080da
    uint32_t lru_cur_size;
Packit Service e080da
    uint32_t timeout;
Packit Service e080da
    pthread_mutex_t log_buf_lock;
Packit Service e080da
    struct _gf_timer *log_flush_timer;
Packit Service e080da
    int localtime;
Packit Service e080da
} gf_log_handle_t;
Packit Service e080da
Packit Service e080da
typedef struct log_buf_ {
Packit Service e080da
    char *msg;
Packit Service e080da
    uint64_t msg_id;
Packit Service e080da
    int errnum;
Packit Service e080da
    struct timeval oldest;
Packit Service e080da
    struct timeval latest;
Packit Service e080da
    char *domain;
Packit Service e080da
    char *file;
Packit Service e080da
    char *function;
Packit Service e080da
    int32_t line;
Packit Service e080da
    gf_loglevel_t level;
Packit Service e080da
    int refcount;
Packit Service e080da
    int graph_id;
Packit Service e080da
    struct list_head msg_list;
Packit Service e080da
} log_buf_t;
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_globals_init(void *ctx, gf_loglevel_t level);
Packit Service e080da
int
Packit Service e080da
gf_log_init(void *data, const char *filename, const char *ident);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_logrotate(int signum);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_cleanup(void);
Packit Service e080da
Packit Service e080da
/* Internal interfaces to log messages with message IDs */
Packit Service e080da
int
Packit Service e080da
_gf_msg(const char *domain, const char *file, const char *function,
Packit Service e080da
        int32_t line, gf_loglevel_t level, int errnum, int trace,
Packit Service e080da
        uint64_t msgid, const char *fmt, ...)
Packit Service e080da
    __attribute__((__format__(__printf__, 9, 10)));
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
_gf_msg_backtrace_nomem(gf_loglevel_t level, int stacksize);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
_gf_msg_plain(gf_loglevel_t level, const char *fmt, ...)
Packit Service e080da
    __attribute__((__format__(__printf__, 2, 3)));
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
_gf_msg_plain_nomem(gf_loglevel_t level, const char *msg);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
_gf_msg_vplain(gf_loglevel_t level, const char *fmt, va_list ap);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
_gf_msg_nomem(const char *domain, const char *file, const char *function,
Packit Service e080da
              int line, gf_loglevel_t level, size_t size);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
_gf_log(const char *domain, const char *file, const char *function,
Packit Service e080da
        int32_t line, gf_loglevel_t level, const char *fmt, ...)
Packit Service e080da
    __attribute__((__format__(__printf__, 6, 7)));
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
_gf_log_callingfn(const char *domain, const char *file, const char *function,
Packit Service e080da
                  int32_t line, gf_loglevel_t level, const char *fmt, ...)
Packit Service e080da
    __attribute__((__format__(__printf__, 6, 7)));
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
_gf_log_eh(const char *function, const char *fmt, ...)
Packit Service e080da
    __attribute__((__format__(__printf__, 2, 3)));
Packit Service e080da
Packit Service e080da
/* treat GF_LOG_TRACE and GF_LOG_NONE as LOG_DEBUG and
Packit Service e080da
 * other level as is */
Packit Service e080da
#define SET_LOG_PRIO(level, priority)                                          \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        if (GF_LOG_TRACE == (level) || GF_LOG_NONE == (level)) {               \
Packit Service e080da
            priority = LOG_DEBUG;                                              \
Packit Service e080da
        } else {                                                               \
Packit Service e080da
            priority = (level)-1;                                              \
Packit Service e080da
        }                                                                      \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
/* extract just the file name from the path */
Packit Service e080da
#define GET_FILE_NAME_TO_LOG(file, basename)                                   \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        basename = strrchr((file), '/');                                       \
Packit Service e080da
        if (basename)                                                          \
Packit Service e080da
            basename++;                                                        \
Packit Service e080da
        else                                                                   \
Packit Service e080da
            basename = (file);                                                 \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define PRINT_SIZE_CHECK(ret, label, strsize)                                  \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        if (ret < 0)                                                           \
Packit Service e080da
            goto label;                                                        \
Packit Service e080da
        if ((strsize - ret) > 0) {                                             \
Packit Service e080da
            strsize -= ret;                                                    \
Packit Service e080da
        } else {                                                               \
Packit Service e080da
            ret = 0;                                                           \
Packit Service e080da
            goto label;                                                        \
Packit Service e080da
        }                                                                      \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define FMT_WARN(fmt...)                                                       \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        if (0)                                                                 \
Packit Service e080da
            printf(fmt);                                                       \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
/* Interface to log messages with message IDs */
Packit Service e080da
#define gf_msg(dom, level, errnum, msgid, fmt...)                              \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_msg(dom, __FILE__, __FUNCTION__, __LINE__, level, errnum, 0,       \
Packit Service e080da
                msgid, ##fmt);                                                 \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
/* no frills, no thrills, just a vanilla message, used to print the graph */
Packit Service e080da
#define gf_msg_plain(level, fmt...)                                            \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_msg_plain(level, ##fmt);                                           \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define gf_msg_plain_nomem(level, msg)                                         \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_msg_plain_nomem(level, msg);                                       \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define gf_msg_vplain(level, fmt, va)                                          \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_msg_vplain(level, fmt, va);                                        \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define gf_msg_backtrace_nomem(level, stacksize)                               \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_msg_backtrace_nomem(level, stacksize);                             \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define gf_msg_callingfn(dom, level, errnum, msgid, fmt...)                    \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_msg(dom, __FILE__, __FUNCTION__, __LINE__, level, errnum, 1,       \
Packit Service e080da
                msgid, ##fmt);                                                 \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
/* No malloc or calloc should be called in this function */
Packit Service e080da
#define gf_msg_nomem(dom, level, size)                                         \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_msg_nomem(dom, __FILE__, __FUNCTION__, __LINE__, level, size);     \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
/* Debug or trace messages do not need message IDs as these are more developer
Packit Service e080da
 * related. Hence, the following abstractions are provided for the same */
Packit Service e080da
#define gf_msg_debug(dom, errnum, fmt...)                                      \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_msg(dom, __FILE__, __FUNCTION__, __LINE__, GF_LOG_DEBUG, errnum,   \
Packit Service e080da
                0, 0, ##fmt);                                                  \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define gf_msg_trace(dom, errnum, fmt...)                                      \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_msg(dom, __FILE__, __FUNCTION__, __LINE__, GF_LOG_TRACE, errnum,   \
Packit Service e080da
                0, 0, ##fmt);                                                  \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define gf_log(dom, level, fmt...)                                             \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        FMT_WARN(fmt);                                                         \
Packit Service e080da
        _gf_log(dom, __FILE__, __FUNCTION__, __LINE__, level, ##fmt);          \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define gf_log_eh(fmt...)                                                      \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        FMT_WARN(fmt);                                                         \
Packit Service e080da
        _gf_log_eh(__FUNCTION__, ##fmt);                                       \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define gf_log_callingfn(dom, level, fmt...)                                   \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        FMT_WARN(fmt);                                                         \
Packit Service e080da
        _gf_log_callingfn(dom, __FILE__, __FUNCTION__, __LINE__, level,        \
Packit Service e080da
                          ##fmt);                                              \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
/* Log once in GF_UNIVERSAL_ANSWER times */
Packit Service e080da
#define GF_LOG_OCCASIONALLY(var, args...)                                      \
Packit Service 173fb3
    if (var++ == 0 || !((var - 1) % GF_UNIVERSAL_ANSWER)) {                    \
Packit Service e080da
        gf_log(args);                                                          \
Packit Service e080da
    }
Packit Service e080da
Packit Service e080da
struct _glusterfs_ctx;
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_disable_syslog(void);
Packit Service e080da
void
Packit Service e080da
gf_log_enable_syslog(void);
Packit Service e080da
gf_loglevel_t
Packit Service e080da
gf_log_get_loglevel(void);
Packit Service e080da
void
Packit Service e080da
gf_log_set_loglevel(struct _glusterfs_ctx *ctx, gf_loglevel_t level);
Packit Service e080da
int
Packit Service e080da
gf_log_get_localtime(void);
Packit Service e080da
void
Packit Service e080da
gf_log_set_localtime(int);
Packit Service e080da
void
Packit Service e080da
gf_log_flush(void);
Packit Service e080da
gf_loglevel_t
Packit Service e080da
gf_log_get_xl_loglevel(void *xl);
Packit Service e080da
void
Packit Service e080da
gf_log_set_xl_loglevel(void *xl, gf_loglevel_t level);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
gf_cmd_log(const char *domain, const char *fmt, ...)
Packit Service e080da
    __attribute__((__format__(__printf__, 2, 3)));
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
gf_cmd_log_init(const char *filename);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
set_sys_log_level(gf_loglevel_t level);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
gf_log_fini(void *data);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_set_logger(gf_log_logger_t logger);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_set_logformat(gf_log_format_t format);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_set_log_buf_size(uint32_t buf_size);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_set_log_flush_timeout(uint32_t timeout);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_flush_msgs(struct _glusterfs_ctx *ctx);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
gf_log_inject_timer_event(struct _glusterfs_ctx *ctx);
Packit Service e080da
Packit Service e080da
void
Packit Service e080da
gf_log_disable_suppression_before_exit(struct _glusterfs_ctx *ctx);
Packit Service e080da
Packit Service e080da
#define GF_DEBUG(xl, format, args...)                                          \
Packit Service e080da
    gf_log((xl)->name, GF_LOG_DEBUG, format, ##args)
Packit Service e080da
#define GF_INFO(xl, format, args...)                                           \
Packit Service e080da
    gf_log((xl)->name, GF_LOG_INFO, format, ##args)
Packit Service e080da
#define GF_WARNING(xl, format, args...)                                        \
Packit Service e080da
    gf_log((xl)->name, GF_LOG_WARNING, format, ##args)
Packit Service e080da
#define GF_ERROR(xl, format, args...)                                          \
Packit Service e080da
    gf_log((xl)->name, GF_LOG_ERROR, format, ##args)
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
_gf_slog(const char *domain, const char *file, const char *function, int line,
Packit Service e080da
         gf_loglevel_t level, const char *event, ...);
Packit Service e080da
Packit Service e080da
int
Packit Service e080da
_gf_smsg(const char *domain, const char *file, const char *function,
Packit Service e080da
         int32_t line, gf_loglevel_t level, int errnum, int trace,
Packit Service e080da
         uint64_t msgid, const char *event, ...);
Packit Service e080da
Packit Service e080da
/* Interface to log messages with message IDs */
Packit Service e080da
#define gf_smsg(dom, level, errnum, msgid, event...)                           \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_smsg(dom, __FILE__, __FUNCTION__, __LINE__, level, errnum, 0,      \
Packit Service e080da
                 msgid, ##event);                                              \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#define gf_slog(dom, level, event...)                                          \
Packit Service e080da
    do {                                                                       \
Packit Service e080da
        _gf_slog(dom, __FILE__, __FUNCTION__, __LINE__, level, ##event);       \
Packit Service e080da
    } while (0)
Packit Service e080da
Packit Service e080da
#endif /* __LOGGING_H__ */