blob: 13973e33ed61cc062cc7483c84d3ea82c6b3d56b [file] [log] [blame]
// 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_WRITER_H_
#define LIB_LOG_LOG_WRITER_H_
#include <stdarg.h>
#include <zircon/types.h>
#ifdef __cplusplus
extern "C" {
#endif
// Log entry level.
// Used for coarse filtering of log messages
typedef int log_level_t;
#define LOG_LEVEL_VERBOSE(x) ((log_level_t) - (x))
#define LOG_LEVEL_INFO (0)
#define LOG_LEVEL_WARNING (1)
#define LOG_LEVEL_ERROR (2)
#define LOG_LEVEL_FATAL (3)
// Writer interface for emitting logs.
// There may be multiple implementations of this interface.
typedef struct log_writer log_writer_t;
typedef uint32_t log_ops_version_t;
#define LOG_WRITER_OPS_V1 ((log_ops_version_t)1)
// log_message exists to encode messages between the frontends and the backends
// (aka implementations of log_writer_t). After a message has been processed
// (e.g. printf formatting, streamed into a buffer, etc.), this struct is filled
// out and a pointer to it is then handed to the backend for dispatching.
typedef struct log_message {
// The level of this message.
log_level_t level;
// List of tags that was provided when the logging frontend was initialized
const char** static_tags;
// The number of static tags
const size_t num_static_tags;
// List of tags that was provided for this log message in particular
const char** dynamic_tags;
// The number of dynamic tags
const size_t num_dynamic_tags;
// The body of this log message
const char* text;
// The length of the log message body
// (NOT including the terminating null byte)
const size_t text_len;
} log_message_t;
typedef struct log_writer_ops {
// The interface version number, e.g. |LOG_OPS_V1|.
log_ops_version_t version;
// Reserved for future expansion, set to zero.
uint32_t reserved;
// Operations supported by |LOG_OPS_V1|.
struct v1 {
void (*write)(log_writer_t* writer, const log_message_t* message);
} v1;
} log_writer_ops_t;
struct log_writer {
const log_writer_ops_t* ops;
};
#ifdef __cplusplus
}
#endif
#endif // LIB_LOG_LOG_WRITER_H_