blob: 750eacf328217025dd70a35ee9844f23dfc57700 [file] [log] [blame] [edit]
// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef LIB_LOG_LOG_H_
#define LIB_LOG_LOG_H_
#include <lib/log/log_writer.h>
#ifdef __cplusplus
extern "C" {
#endif
// The values following constants must match the values defined in
// //zircon/system/fidl/fuchsia-logger/logger.fidl
// Max number of tags that can be attached to a message.
#define LOG_MAX_TAGS (5)
// Max individual tag length including terminating character.
#define LOG_MAX_TAG_LEN (63)
// Max individual message length including terminating character
#define LOG_MAX_MESSAGE_SIZE (2032)
// Returns true if writing messages with the given level is enabled in the
// global logger.
// |level| is one of VERBOSE(N), INFO, WARNING, ERROR, or FATAL.
#define LOG_LEVEL_IS_ENABLED(level) log_level_is_enabled(LOG_LEVEL_##level)
// Sets the minimum level for global logger. Log messages with a lower severity
// (or higher verbosity) than the given value will not be emitted. |level| is
// one of VERBOSE(N), INFO, WARNING, ERROR, or FATAL.
#define LOG_SET_MIN_LEVEL(level) log_set_min_level(LOG_LEVEL_##level)
// Initializes the logging system. Can be called multiple times.
//
// Arguments:
// |min_level| - one of VERBOSE(int), INFO, WARNING, ERROR, FATAL
// |log_writer| - a log_writer_t* to use when writing logs
// |...| - tags to be attached to all messages
//
// Example usage:
// LOG_INITIALIZE(INFO, log_writer, "program_name");
#define LOG_INITIALIZE(min_level, log_writer, ...) \
do { \
const char* tags[] = {__VA_ARGS__}; \
size_t num_tags = sizeof(tags) / sizeof(tags[0]); \
log_initialize(LOG_LEVEL_##min_level, log_writer, num_tags, tags); \
} while (0)
// Frees and resets the global logging state. Should be called at program end to
// clean up memory taken up by this logging framework. If messages are logged
// after log_shutdown has been called the messages are silently dropped.
void log_shutdown(void);
// Log a formatted message at the given level with the given tags.
// Takes two sets of arguments.
//
// First set of arguments:
// |...| - tags to be attached to the message
// Second set of arguments:
// |level| - one of VERBOSE(int), INFO, WARNING, ERROR, FATAL
// |format_string| - the format string for the message
// |...| - arguments to be filled in to the format string
//
// Example usage:
// LOGF(ERROR, "tag1", "tag2")("sorry that didn't work: %s", msg);
#define LOGF(level, ...) \
do { \
const char* tags[] = {__VA_ARGS__}; \
size_t num_tags = sizeof(tags) / sizeof(tags[0]); \
log_level_t lvl = LOG_LEVEL_##level; \
LOGF_INNER
// Log a message at the given level with the given tags.
// Takes two sets of arguments.
//
// First set of arguments:
// |...| - tags to be attached to the message
// Second set of arguments:
// |level| - one of VERBOSE(int), INFO, WARNING, ERROR, FATAL
// |message| - the message to log
//
// Example usage:
// LOG(ERROR, "tag1", "tag2")("internal error encountered");
#define LOG(level, ...) \
do { \
const char* tags[] = {__VA_ARGS__}; \
size_t num_tags = sizeof(tags) / sizeof(tags[0]); \
log_level_t lvl = LOG_LEVEL_##level; \
LOG_INNER
// The following are helper functions and macros used in the above macros, and
// should not be called directly outside of macro usage.
#define LOGF_INNER(message, ...) \
if (log_level_is_enabled(lvl)) { \
log_write_message_printf(lvl, num_tags, tags, message, __VA_ARGS__); \
} \
} \
while (0)
#define LOG_INNER(message) \
if (log_level_is_enabled(lvl)) { \
log_write_message(lvl, num_tags, tags, message); \
} \
} \
while (0)
bool log_level_is_enabled(log_level_t level);
void log_set_min_level(log_level_t min_level);
void log_initialize(log_level_t min_level, log_writer_t* log_writer, const size_t num_tags,
const char** tags);
void log_write_message(log_level_t level, size_t num_tags, const char** tags_ptr,
const char* message);
void log_write_message_printf(log_level_t level, size_t num_tags, const char** tags_ptr,
const char* message, ...);
#ifdef __cplusplus
}
#endif
#endif // LIB_LOG_LOG_H_