9#include "../log/detail/tagged_log_sink_base.hpp"
10#include "../log/sink.hpp"
15#if MICROFMT_HAS_ANDROID_LOG
16#include <android/log.h>
36RELOCO_BEGIN_UNSAFE_BUFFER_USAGE
39RELOCO_BEGIN_UNSAFE_CODE
43 std::fprintf(stdout,
"[%d] %s: ", prio, tag);
44 std::vfprintf(stdout,
fmt, args);
45 std::fprintf(stdout,
"\n");
50RELOCO_END_UNSAFE_BUFFER_USAGE
55template <std::
size_t MessageCapacity, std::
size_t TagCapacity>
class android_log_sink;
60template <std::
size_t MessageCapacity = 512, std::
size_t TagCapacity = 64>
63 static_assert(MessageCapacity > 0,
"Message capacity must be at least 1 byte");
68 using write_fn_t = void (*)(
int priority, microfmt::string_view tag, microfmt::string_view message)
noexcept;
71 :
tag_base(tag), write_fn_(write_fn) {}
83 const auto out = buffer.
as_sink();
86 char scratch[TagCapacity];
87 const auto tag = this->
resolve_tag(msg.logger_name, scratch);
88 write_fn_(priority_for(msg.lvl), tag, buffer.
view());
93 RELOCO_BEGIN_UNSAFE_CODE
94 static void write_to_logcat(
int priority, microfmt::string_view tag, microfmt::string_view message)
noexcept {
95 RELOCO_BEGIN_UNSAFE_BUFFER_USAGE;
96 char tag_buf[64] = {};
97 size_t tag_len = std::min(tag.size(),
sizeof(tag_buf) - 1);
98 std::memcpy(tag_buf, tag.data(), tag_len);
99 tag_buf[tag_len] =
'\0';
102 RELOCO_END_UNSAFE_BUFFER_USAGE;
106 static int priority_for(
level lvl)
noexcept {
134android_log_sink(microfmt::string_view,
void (*)(
int, microfmt::string_view, microfmt::string_view)
noexcept)
137template <std::
size_t MessageCapacity, std::
size_t TagCapacity>
141 static void log(value_ref<context_type> ctx,
const log_msg &msg)
noexcept { ctx->log_impl(msg); }
RELOCO_BEGIN_UNSAFE_BUFFER_USAGE RELOCO_BEGIN_UNSAFE_CODE int __android_log_print(int prio, const char *tag, const char *fmt,...)
Definition android_log_sink.hpp:40
android_LogPriority
Definition android_log_sink.hpp:24
@ ANDROID_LOG_VERBOSE
Definition android_log_sink.hpp:27
@ ANDROID_LOG_WARN
Definition android_log_sink.hpp:30
@ ANDROID_LOG_FATAL
Definition android_log_sink.hpp:32
@ ANDROID_LOG_DEBUG
Definition android_log_sink.hpp:28
@ ANDROID_LOG_UNKNOWN
Definition android_log_sink.hpp:25
@ ANDROID_LOG_DEFAULT
Definition android_log_sink.hpp:26
@ ANDROID_LOG_SILENT
Definition android_log_sink.hpp:33
@ ANDROID_LOG_INFO
Definition android_log_sink.hpp:29
@ ANDROID_LOG_ERROR
Definition android_log_sink.hpp:31
Output sink that stores formatted characters in an internal fixed-size stack/inline buffer.
Definition microfmt.hpp:185
constexpr microfmt::string_view view() const &noexcept RELOCO_LIFETIMEBOUND
Returns a string view over the characters written so far.
Definition microfmt.hpp:245
RELOCO_END_UNSAFE_BUFFER_USAGE RELOCO_CONSTEXPR20 sink as_sink() &noexcept RELOCO_LIFETIMEBOUND
Creates a type-erased sink adapter pointing to this instance.
Definition microfmt.hpp:236
Adapter that writes structured records to Android logcat.
Definition android_log_sink.hpp:62
void(*)(int priority, microfmt::string_view tag, microfmt::string_view message) noexcept write_fn_t
Definition android_log_sink.hpp:68
log_sink as_sink() &noexcept RELOCO_LIFETIMEBOUND
Definition android_log_sink.hpp:73
void log_impl(const log_msg &msg) noexcept
Definition android_log_sink.hpp:77
android_log_sink(microfmt::string_view tag="microfmt", write_fn_t write_fn=write_to_logcat) noexcept
Definition android_log_sink.hpp:70
CRTP-free base providing fixed-capacity tag storage and truncating tag resolution,...
Definition tagged_log_sink_base.hpp:36
microfmt::string_view resolve_tag(microfmt::string_view logger_name, char(&scratch)[TagCapacity]) const &noexcept RELOCO_LIFETIMEBOUND
Resolves the tag to use for a record whose originating logger is named logger_name: that name (trunca...
Definition tagged_log_sink_base.hpp:65
Type-erased, two-word handle to a log sink backend, plus the severity threshold below which records a...
Definition sink.hpp:73
Definition default_log_sink.template.hpp:51
level
Shared log severity levels in ascending order.
Definition log_msg.hpp:22
android_log_sink() -> android_log_sink<>
RELOCO_CONSTEXPR20 void format_to(const sink &out, microfmt::string_view fmt, const Args &...args) noexcept
Definition microfmt.hpp:1766
RELOCO_END_UNSAFE_CODE
Definition remote_object.hpp:132
Tag selecting android_log_sink<MessageCapacity, TagCapacity> as a log_sink backend.
Definition android_log_sink.hpp:58
Structured log record forwarded by a logger to each sink.
Definition log_msg.hpp:69
static void log(value_ref< context_type > ctx, const log_msg &msg) noexcept
Definition android_log_sink.hpp:141
Static customization point describing a log sink backend.
Definition sink.hpp:46