blob: 96d00f9b056711755270f84b293c55c82edb2532 [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
11namespace aos {
12namespace logging {
Austin Schuh56196432020-10-24 20:15:21 -070013namespace internal {
Brian Silvermanf665d692013-02-17 22:11:39 -080014namespace {
15
Austin Schuhf2a50ba2016-12-24 16:16:26 -080016namespace chrono = ::std::chrono;
17
Austin Schuh82c0c822019-05-27 19:55:20 -070018void FillInMessageBase(log_level level,
19 monotonic_clock::time_point monotonic_now,
20 LogMessage *message) {
Brian Silvermanf665d692013-02-17 22:11:39 -080021 Context *context = Context::Get();
22
Brian Silvermanf665d692013-02-17 22:11:39 -080023 message->level = level;
24 message->source = context->source;
Austin Schuhaebbc342015-01-25 02:25:13 -080025 memcpy(message->name, context->name, context->name_size);
26 message->name_length = context->name_size;
Brian Silvermanf665d692013-02-17 22:11:39 -080027
Austin Schuhf2a50ba2016-12-24 16:16:26 -080028 message->seconds =
29 chrono::duration_cast<chrono::seconds>(monotonic_now.time_since_epoch())
30 .count();
31 message->nseconds =
32 chrono::duration_cast<chrono::nanoseconds>(
33 monotonic_now.time_since_epoch() - chrono::seconds(message->seconds))
34 .count();
Brian Silvermanf665d692013-02-17 22:11:39 -080035
36 message->sequence = context->sequence++;
37}
38
Brian Silverman88471dc2014-02-15 22:35:42 -080039} // namespace
40
Austin Schuh82c0c822019-05-27 19:55:20 -070041void FillInMessage(log_level level, monotonic_clock::time_point monotonic_now,
42 const char *format, va_list ap, LogMessage *message) {
43 FillInMessageBase(level, 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 Schuh82c0c822019-05-27 19:55:20 -070063 internal::FillInMessage(level, monotonic_now(), format, ap, &message);
Brian Silvermanbe858a12014-04-30 17:37:28 -070064 HandleMessage(message);
65}
66
Brian Silverman1e8ddfe2013-12-19 16:20:53 -080067StreamLogImplementation::StreamLogImplementation(FILE *stream)
68 : stream_(stream) {}
69
Brian Silvermanbe858a12014-04-30 17:37:28 -070070void StreamLogImplementation::HandleMessage(const LogMessage &message) {
Brian Silverman1e8ddfe2013-12-19 16:20:53 -080071 internal::PrintMessage(stream_, message);
72}
73
Austin Schuha0c41ba2020-09-10 22:59:14 -070074void SetImplementation(std::shared_ptr<LogImplementation> implementation) {
Austin Schuh56196432020-10-24 20:15:21 -070075 internal::Context *context = internal::Context::Get();
76 context->implementation = std::move(implementation);
Tyler Chatow4b471e12020-01-05 20:19:36 -080077}
78
Austin Schuha0c41ba2020-09-10 22:59:14 -070079std::shared_ptr<LogImplementation> GetImplementation() {
Austin Schuh56196432020-10-24 20:15:21 -070080 internal::Context *context = internal::Context::Get();
81 return context->implementation;
Tyler Chatow5febd8f2020-01-05 18:25:31 -080082}
83
Brian Silvermanf665d692013-02-17 22:11:39 -080084} // namespace logging
85} // namespace aos