blob: da9e72b724f90447d73266e14710340134f042fb [file] [log] [blame]
John Park33858a32018-09-28 23:05:48 -07001#include "aos/logging/implementations.h"
Brian Silvermanf665d692013-02-17 22:11:39 -08002
Brian Silvermancb5da1f2015-12-05 22:19:58 -05003#include <algorithm>
Austin Schuhf2a50ba2016-12-24 16:16:26 -08004#include <chrono>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07005#include <cinttypes>
6#include <cstdarg>
Brian Silvermancb5da1f2015-12-05 22:19:58 -05007
John Park33858a32018-09-28 23:05:48 -07008#include "aos/logging/printf_formats.h"
John Park33858a32018-09-28 23:05:48 -07009#include "aos/time/time.h"
Brian Silvermanf665d692013-02-17 22:11:39 -080010
Stephan Pleinesf63bde82024-01-13 15:59:33 -080011namespace aos::logging {
Austin Schuh56196432020-10-24 20:15:21 -070012namespace internal {
Brian Silvermanf665d692013-02-17 22:11:39 -080013namespace {
14
Austin Schuhf2a50ba2016-12-24 16:16:26 -080015namespace chrono = ::std::chrono;
16
Austin Schuhad9e5eb2021-11-19 20:33:55 -080017void FillInMessageBase(log_level level, std::string_view name,
Austin Schuh82c0c822019-05-27 19:55:20 -070018 monotonic_clock::time_point monotonic_now,
19 LogMessage *message) {
Brian Silvermanf665d692013-02-17 22:11:39 -080020 Context *context = Context::Get();
21
Brian Silvermanf665d692013-02-17 22:11:39 -080022 message->level = level;
23 message->source = context->source;
Austin Schuhad9e5eb2021-11-19 20:33:55 -080024 memcpy(message->name, name.data(), name.size());
25 message->name_length = name.size();
Brian Silvermanf665d692013-02-17 22:11:39 -080026
Austin Schuhf2a50ba2016-12-24 16:16:26 -080027 message->seconds =
28 chrono::duration_cast<chrono::seconds>(monotonic_now.time_since_epoch())
29 .count();
30 message->nseconds =
31 chrono::duration_cast<chrono::nanoseconds>(
32 monotonic_now.time_since_epoch() - chrono::seconds(message->seconds))
33 .count();
Brian Silvermanf665d692013-02-17 22:11:39 -080034
35 message->sequence = context->sequence++;
36}
37
Brian Silverman88471dc2014-02-15 22:35:42 -080038} // namespace
39
Austin Schuhad9e5eb2021-11-19 20:33:55 -080040void FillInMessage(log_level level, std::string_view name,
41 monotonic_clock::time_point monotonic_now,
Austin Schuh82c0c822019-05-27 19:55:20 -070042 const char *format, va_list ap, LogMessage *message) {
Austin Schuhad9e5eb2021-11-19 20:33:55 -080043 FillInMessageBase(level, name, monotonic_now, message);
Brian Silverman88471dc2014-02-15 22:35:42 -080044
45 message->message_length =
46 ExecuteFormat(message->message, sizeof(message->message), format, ap);
Brian Silverman88471dc2014-02-15 22:35:42 -080047}
48
Brian Silvermanf665d692013-02-17 22:11:39 -080049void PrintMessage(FILE *output, const LogMessage &message) {
Austin Schuh56196432020-10-24 20:15:21 -070050 fprintf(output, AOS_LOGGING_BASE_FORMAT "%.*s",
51 AOS_LOGGING_BASE_ARGS(message.name_length, message.name,
52 static_cast<int32_t>(message.source),
53 message.sequence, message.level,
54 message.seconds, message.nseconds),
55 static_cast<int>(message.message_length), message.message);
Brian Silvermanf665d692013-02-17 22:11:39 -080056}
57
58} // namespace internal
59
Brian Silvermanbe858a12014-04-30 17:37:28 -070060void HandleMessageLogImplementation::DoLog(log_level level, const char *format,
61 va_list ap) {
62 LogMessage message;
Austin Schuhad9e5eb2021-11-19 20:33:55 -080063 internal::FillInMessage(level, MyName(), monotonic_now(), format, ap,
64 &message);
Brian Silvermanbe858a12014-04-30 17:37:28 -070065 HandleMessage(message);
66}
67
Brian Silverman1e8ddfe2013-12-19 16:20:53 -080068StreamLogImplementation::StreamLogImplementation(FILE *stream)
69 : stream_(stream) {}
70
Brian Silvermanbe858a12014-04-30 17:37:28 -070071void StreamLogImplementation::HandleMessage(const LogMessage &message) {
Brian Silverman1e8ddfe2013-12-19 16:20:53 -080072 internal::PrintMessage(stream_, message);
73}
74
Austin Schuha0c41ba2020-09-10 22:59:14 -070075void SetImplementation(std::shared_ptr<LogImplementation> implementation) {
Austin Schuh56196432020-10-24 20:15:21 -070076 internal::Context *context = internal::Context::Get();
77 context->implementation = std::move(implementation);
Tyler Chatow4b471e12020-01-05 20:19:36 -080078}
79
Austin Schuha0c41ba2020-09-10 22:59:14 -070080std::shared_ptr<LogImplementation> GetImplementation() {
Austin Schuh56196432020-10-24 20:15:21 -070081 internal::Context *context = internal::Context::Get();
82 return context->implementation;
Tyler Chatow5febd8f2020-01-05 18:25:31 -080083}
84
Stephan Pleinesf63bde82024-01-13 15:59:33 -080085} // namespace aos::logging