blob: 042a09b6edf3a11051141ecb3bfca27821f776ba [file] [log] [blame]
John Park33858a32018-09-28 23:05:48 -07001#include "aos/logging/implementations.h"
Brian Silvermanf665d692013-02-17 22:11:39 -08002
Austin Schuhf2a50ba2016-12-24 16:16:26 -08003#include <chrono>
Tyler Chatowbf0609c2021-07-31 16:13:27 -07004#include <cstdarg>
Brian Silvermancb5da1f2015-12-05 22:19:58 -05005
John Park33858a32018-09-28 23:05:48 -07006#include "aos/logging/printf_formats.h"
John Park33858a32018-09-28 23:05:48 -07007#include "aos/time/time.h"
Brian Silvermanf665d692013-02-17 22:11:39 -08008
Stephan Pleinesf63bde82024-01-13 15:59:33 -08009namespace aos::logging {
Austin Schuh56196432020-10-24 20:15:21 -070010namespace internal {
Brian Silvermanf665d692013-02-17 22:11:39 -080011namespace {
12
Austin Schuhf2a50ba2016-12-24 16:16:26 -080013namespace chrono = ::std::chrono;
14
Austin Schuhad9e5eb2021-11-19 20:33:55 -080015void FillInMessageBase(log_level level, std::string_view name,
Austin Schuh82c0c822019-05-27 19:55:20 -070016 monotonic_clock::time_point monotonic_now,
17 LogMessage *message) {
Brian Silvermanf665d692013-02-17 22:11:39 -080018 Context *context = Context::Get();
19
Brian Silvermanf665d692013-02-17 22:11:39 -080020 message->level = level;
21 message->source = context->source;
Austin Schuhad9e5eb2021-11-19 20:33:55 -080022 memcpy(message->name, name.data(), name.size());
23 message->name_length = name.size();
Brian Silvermanf665d692013-02-17 22:11:39 -080024
Austin Schuhf2a50ba2016-12-24 16:16:26 -080025 message->seconds =
26 chrono::duration_cast<chrono::seconds>(monotonic_now.time_since_epoch())
27 .count();
28 message->nseconds =
29 chrono::duration_cast<chrono::nanoseconds>(
30 monotonic_now.time_since_epoch() - chrono::seconds(message->seconds))
31 .count();
Brian Silvermanf665d692013-02-17 22:11:39 -080032
33 message->sequence = context->sequence++;
34}
35
Brian Silverman88471dc2014-02-15 22:35:42 -080036} // namespace
37
Austin Schuhad9e5eb2021-11-19 20:33:55 -080038void FillInMessage(log_level level, std::string_view name,
39 monotonic_clock::time_point monotonic_now,
Austin Schuh82c0c822019-05-27 19:55:20 -070040 const char *format, va_list ap, LogMessage *message) {
Austin Schuhad9e5eb2021-11-19 20:33:55 -080041 FillInMessageBase(level, name, monotonic_now, message);
Brian Silverman88471dc2014-02-15 22:35:42 -080042
43 message->message_length =
44 ExecuteFormat(message->message, sizeof(message->message), format, ap);
Brian Silverman88471dc2014-02-15 22:35:42 -080045}
46
Brian Silvermanf665d692013-02-17 22:11:39 -080047void PrintMessage(FILE *output, const LogMessage &message) {
Austin Schuh56196432020-10-24 20:15:21 -070048 fprintf(output, AOS_LOGGING_BASE_FORMAT "%.*s",
49 AOS_LOGGING_BASE_ARGS(message.name_length, message.name,
50 static_cast<int32_t>(message.source),
51 message.sequence, message.level,
52 message.seconds, message.nseconds),
53 static_cast<int>(message.message_length), message.message);
Brian Silvermanf665d692013-02-17 22:11:39 -080054}
55
56} // namespace internal
57
Brian Silvermanbe858a12014-04-30 17:37:28 -070058void HandleMessageLogImplementation::DoLog(log_level level, const char *format,
59 va_list ap) {
60 LogMessage message;
Austin Schuhad9e5eb2021-11-19 20:33:55 -080061 internal::FillInMessage(level, MyName(), monotonic_now(), format, ap,
62 &message);
Brian Silvermanbe858a12014-04-30 17:37:28 -070063 HandleMessage(message);
64}
65
Brian Silverman1e8ddfe2013-12-19 16:20:53 -080066StreamLogImplementation::StreamLogImplementation(FILE *stream)
67 : stream_(stream) {}
68
Brian Silvermanbe858a12014-04-30 17:37:28 -070069void StreamLogImplementation::HandleMessage(const LogMessage &message) {
Brian Silverman1e8ddfe2013-12-19 16:20:53 -080070 internal::PrintMessage(stream_, message);
71}
72
Austin Schuha0c41ba2020-09-10 22:59:14 -070073void SetImplementation(std::shared_ptr<LogImplementation> implementation) {
Austin Schuh56196432020-10-24 20:15:21 -070074 internal::Context *context = internal::Context::Get();
75 context->implementation = std::move(implementation);
Tyler Chatow4b471e12020-01-05 20:19:36 -080076}
77
Austin Schuha0c41ba2020-09-10 22:59:14 -070078std::shared_ptr<LogImplementation> GetImplementation() {
Austin Schuh56196432020-10-24 20:15:21 -070079 internal::Context *context = internal::Context::Get();
80 return context->implementation;
Tyler Chatow5febd8f2020-01-05 18:25:31 -080081}
82
Stephan Pleinesf63bde82024-01-13 15:59:33 -080083} // namespace aos::logging