blob: da9e72b724f90447d73266e14710340134f042fb [file] [log] [blame]
#include "aos/logging/implementations.h"
#include <algorithm>
#include <chrono>
#include <cinttypes>
#include <cstdarg>
#include "aos/logging/printf_formats.h"
#include "aos/time/time.h"
namespace aos::logging {
namespace internal {
namespace {
namespace chrono = ::std::chrono;
void FillInMessageBase(log_level level, std::string_view name,
monotonic_clock::time_point monotonic_now,
LogMessage *message) {
Context *context = Context::Get();
message->level = level;
message->source = context->source;
memcpy(message->name, name.data(), name.size());
message->name_length = name.size();
message->seconds =
chrono::duration_cast<chrono::seconds>(monotonic_now.time_since_epoch())
.count();
message->nseconds =
chrono::duration_cast<chrono::nanoseconds>(
monotonic_now.time_since_epoch() - chrono::seconds(message->seconds))
.count();
message->sequence = context->sequence++;
}
} // namespace
void FillInMessage(log_level level, std::string_view name,
monotonic_clock::time_point monotonic_now,
const char *format, va_list ap, LogMessage *message) {
FillInMessageBase(level, name, monotonic_now, message);
message->message_length =
ExecuteFormat(message->message, sizeof(message->message), format, ap);
}
void PrintMessage(FILE *output, const LogMessage &message) {
fprintf(output, AOS_LOGGING_BASE_FORMAT "%.*s",
AOS_LOGGING_BASE_ARGS(message.name_length, message.name,
static_cast<int32_t>(message.source),
message.sequence, message.level,
message.seconds, message.nseconds),
static_cast<int>(message.message_length), message.message);
}
} // namespace internal
void HandleMessageLogImplementation::DoLog(log_level level, const char *format,
va_list ap) {
LogMessage message;
internal::FillInMessage(level, MyName(), monotonic_now(), format, ap,
&message);
HandleMessage(message);
}
StreamLogImplementation::StreamLogImplementation(FILE *stream)
: stream_(stream) {}
void StreamLogImplementation::HandleMessage(const LogMessage &message) {
internal::PrintMessage(stream_, message);
}
void SetImplementation(std::shared_ptr<LogImplementation> implementation) {
internal::Context *context = internal::Context::Get();
context->implementation = std::move(implementation);
}
std::shared_ptr<LogImplementation> GetImplementation() {
internal::Context *context = internal::Context::Get();
return context->implementation;
}
} // namespace aos::logging