Spdk/include/spdk/log.h
Jim Harris 488570ebd4 Replace most BSD 3-clause license text with SPDX identifier.
Many open source projects have moved to using SPDX identifiers
to specify license information, reducing the amount of
boilerplate code in every source file.  This patch replaces
the bulk of SPDK .c, .cpp and Makefiles with the BSD-3-Clause
identifier.

Almost all of these files share the exact same license text,
and this patch only modifies the files that contain the
most common license text.  There can be slight variations
because the third clause contains company names - most say
"Intel Corporation", but there are instances for Nvidia,
Samsung, Eideticom and even "the copyright holder".

Used a bash script to automate replacement of the license text
with SPDX identifier which is checked into scripts/spdx.sh.

Signed-off-by: Jim Harris <james.r.harris@intel.com>
Change-Id: Iaa88ab5e92ea471691dc298cfe41ebfb5d169780
Reviewed-on: https://review.spdk.io/gerrit/c/spdk/spdk/+/12904
Community-CI: Broadcom CI <spdk-ci.pdl@broadcom.com>
Community-CI: Mellanox Build Bot
Tested-by: SPDK CI Jenkins <sys_sgci@intel.com>
Reviewed-by: Aleksey Marchuk <alexeymar@nvidia.com>
Reviewed-by: Changpeng Liu <changpeng.liu@intel.com>
Reviewed-by: Dong Yi <dongx.yi@intel.com>
Reviewed-by: Konrad Sztyber <konrad.sztyber@intel.com>
Reviewed-by: Paul Luse <paul.e.luse@intel.com>
Reviewed-by: <qun.wan@intel.com>
2022-06-09 07:35:12 +00:00

260 lines
6.6 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) Intel Corporation.
* All rights reserved.
*/
/**
* \file
* Logging interfaces
*/
#ifndef SPDK_LOG_H
#define SPDK_LOG_H
#include "spdk/stdinc.h"
#include "spdk/queue.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* for passing user-provided log call
*
* \param level Log level threshold.
* \param file Name of the current source file.
* \param line Current source file line.
* \param func Current source function name.
* \param format Format string to the message.
* \param args Additional arguments for format string.
*/
typedef void logfunc(int level, const char *file, const int line,
const char *func, const char *format, va_list args);
/**
* Initialize the logging module. Messages prior
* to this call will be dropped.
*/
void spdk_log_open(logfunc *logf);
/**
* Close the currently active log. Messages after this call
* will be dropped.
*/
void spdk_log_close(void);
/**
* Enable or disable timestamps
*/
void spdk_log_enable_timestamps(bool value);
enum spdk_log_level {
/** All messages will be suppressed. */
SPDK_LOG_DISABLED = -1,
SPDK_LOG_ERROR,
SPDK_LOG_WARN,
SPDK_LOG_NOTICE,
SPDK_LOG_INFO,
SPDK_LOG_DEBUG,
};
/**
* Set the log level threshold to log messages. Messages with a higher
* level than this are ignored.
*
* \param level Log level threshold to set to log messages.
*/
void spdk_log_set_level(enum spdk_log_level level);
/**
* Get the current log level threshold.
*
* \return the current log level threshold.
*/
enum spdk_log_level spdk_log_get_level(void);
/**
* Get syslog level based on SPDK current log level threshold.
*
* \param level Log level threshold
* \return -1 for disable log print, otherwise is syslog level.
*/
int spdk_log_to_syslog_level(enum spdk_log_level level);
/**
* Set the current log level threshold for printing to stderr.
* Messages with a level less than or equal to this level
* are also printed to stderr. You can use \c SPDK_LOG_DISABLED to completely
* suppress log printing.
*
* \param level Log level threshold for printing to stderr.
*/
void spdk_log_set_print_level(enum spdk_log_level level);
/**
* Get the current log level print threshold.
*
* \return the current log level print threshold.
*/
enum spdk_log_level spdk_log_get_print_level(void);
#ifdef DEBUG
#define SPDK_DEBUGLOG_FLAG_ENABLED(name) spdk_log_get_flag(name)
#else
#define SPDK_DEBUGLOG_FLAG_ENABLED(name) false
#endif
#define SPDK_NOTICELOG(...) \
spdk_log(SPDK_LOG_NOTICE, __FILE__, __LINE__, __func__, __VA_ARGS__)
#define SPDK_WARNLOG(...) \
spdk_log(SPDK_LOG_WARN, __FILE__, __LINE__, __func__, __VA_ARGS__)
#define SPDK_ERRLOG(...) \
spdk_log(SPDK_LOG_ERROR, __FILE__, __LINE__, __func__, __VA_ARGS__)
#define SPDK_PRINTF(...) \
spdk_log(SPDK_LOG_NOTICE, NULL, -1, NULL, __VA_ARGS__)
#define SPDK_INFOLOG(FLAG, ...) \
do { \
extern struct spdk_log_flag SPDK_LOG_##FLAG; \
if (SPDK_LOG_##FLAG.enabled) { \
spdk_log(SPDK_LOG_INFO, __FILE__, __LINE__, __func__, __VA_ARGS__); \
} \
} while (0)
#ifdef DEBUG
#define SPDK_DEBUGLOG(FLAG, ...) \
do { \
extern struct spdk_log_flag SPDK_LOG_##FLAG; \
if (SPDK_LOG_##FLAG.enabled) { \
spdk_log(SPDK_LOG_DEBUG, __FILE__, __LINE__, __func__, __VA_ARGS__); \
} \
} while (0)
#define SPDK_LOGDUMP(FLAG, LABEL, BUF, LEN) \
do { \
extern struct spdk_log_flag SPDK_LOG_##FLAG; \
if (SPDK_LOG_##FLAG.enabled) { \
spdk_log_dump(stderr, (LABEL), (BUF), (LEN)); \
} \
} while (0)
#else
#define SPDK_DEBUGLOG(...) do { } while (0)
#define SPDK_LOGDUMP(...) do { } while (0)
#endif
/**
* Write messages to the log file. If \c level is set to \c SPDK_LOG_DISABLED,
* this log message won't be written.
*
* \param level Log level threshold.
* \param file Name of the current source file.
* \param line Current source line number.
* \param func Current source function name.
* \param format Format string to the message.
*/
void spdk_log(enum spdk_log_level level, const char *file, const int line, const char *func,
const char *format, ...) __attribute__((__format__(__printf__, 5, 6)));
/**
* Same as spdk_log except that instead of being called with variable number of
* arguments it is called with an argument list as defined in stdarg.h
*
* \param level Log level threshold.
* \param file Name of the current source file.
* \param line Current source line number.
* \param func Current source function name.
* \param format Format string to the message.
* \param ap printf arguments
*/
void spdk_vlog(enum spdk_log_level level, const char *file, const int line, const char *func,
const char *format, va_list ap);
/**
* Log the contents of a raw buffer to a file.
*
* \param fp File to hold the log.
* \param label Label to print to the file.
* \param buf Buffer that holds the log information.
* \param len Length of buffer to dump.
*/
void spdk_log_dump(FILE *fp, const char *label, const void *buf, size_t len);
struct spdk_log_flag {
TAILQ_ENTRY(spdk_log_flag) tailq;
const char *name;
bool enabled;
};
/**
* Register a log flag.
*
* \param name Name of the log flag.
* \param flag Log flag to be added.
*/
void spdk_log_register_flag(const char *name, struct spdk_log_flag *flag);
#define SPDK_LOG_REGISTER_COMPONENT(FLAG) \
struct spdk_log_flag SPDK_LOG_##FLAG = { \
.name = #FLAG, \
.enabled = false, \
}; \
__attribute__((constructor)) static void register_flag_##FLAG(void) \
{ \
spdk_log_register_flag(#FLAG, &SPDK_LOG_##FLAG); \
}
/**
* Get the first registered log flag.
*
* \return The first registered log flag.
*/
struct spdk_log_flag *spdk_log_get_first_flag(void);
/**
* Get the next registered log flag.
*
* \param flag The current log flag.
*
* \return The next registered log flag.
*/
struct spdk_log_flag *spdk_log_get_next_flag(struct spdk_log_flag *flag);
/**
* Check whether the log flag exists and is enabled.
*
* \return true if enabled, or false otherwise.
*/
bool spdk_log_get_flag(const char *flag);
/**
* Enable the log flag.
*
* \param flag Log flag to be enabled.
*
* \return 0 on success, -1 on failure.
*/
int spdk_log_set_flag(const char *flag);
/**
* Clear a log flag.
*
* \param flag Log flag to clear.
*
* \return 0 on success, -1 on failure.
*/
int spdk_log_clear_flag(const char *flag);
/**
* Show all the log flags and their usage.
*
* \param f File to hold all the flags' information.
* \param log_arg Command line option to set/enable the log flag.
*/
void spdk_log_usage(FILE *f, const char *log_arg);
#ifdef __cplusplus
}
#endif
#endif /* SPDK_LOG_H */