blob: 3b4f90564e1662c3a5b76619cddbda3a9d45a034 [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 Schuhad9e5eb2021-11-19 20:33:55 -080018void FillInMessageBase(log_level level, std::string_view name,
Austin Schuh82c0c822019-05-27 19:55:20 -070019 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 Schuhad9e5eb2021-11-19 20:33:55 -080025 memcpy(message->name, name.data(), name.size());
26 message->name_length = 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 Schuhad9e5eb2021-11-19 20:33:55 -080041void FillInMessage(log_level level, std::string_view name,
42 monotonic_clock::time_point monotonic_now,
Austin Schuh82c0c822019-05-27 19:55:20 -070043 const char *format, va_list ap, LogMessage *message) {
Austin Schuhad9e5eb2021-11-19 20:33:55 -080044 FillInMessageBase(level, name, monotonic_now, message);
Brian Silverman88471dc2014-02-15 22:35:42 -080045
46 message->message_length =
47 ExecuteFormat(message->message, sizeof(message->message), format, ap);
Brian Silverman88471dc2014-02-15 22:35:42 -080048}
49
Brian Silvermanf665d692013-02-17 22:11:39 -080050void PrintMessage(FILE *output, const LogMessage &message) {
Austin Schuh56196432020-10-24 20:15:21 -070051 fprintf(output, AOS_LOGGING_BASE_FORMAT "%.*s",
52 AOS_LOGGING_BASE_ARGS(message.name_length, message.name,
53 static_cast<int32_t>(message.source),
54 message.sequence, message.level,
55 message.seconds, message.nseconds),
56 static_cast<int>(message.message_length), message.message);
Brian Silvermanf665d692013-02-17 22:11:39 -080057}
58
59} // namespace internal
60
Brian Silvermanbe858a12014-04-30 17:37:28 -070061void HandleMessageLogImplementation::DoLog(log_level level, const char *format,
62 va_list ap) {
63 LogMessage message;
Austin Schuhad9e5eb2021-11-19 20:33:55 -080064 internal::FillInMessage(level, MyName(), monotonic_now(), format, ap,
65 &message);
Brian Silvermanbe858a12014-04-30 17:37:28 -070066 HandleMessage(message);
67}
68
Brian Silverman1e8ddfe2013-12-19 16:20:53 -080069StreamLogImplementation::StreamLogImplementation(FILE *stream)
70 : stream_(stream) {}
71
Brian Silvermanbe858a12014-04-30 17:37:28 -070072void StreamLogImplementation::HandleMessage(const LogMessage &message) {
Brian Silverman1e8ddfe2013-12-19 16:20:53 -080073 internal::PrintMessage(stream_, message);
74}
75
Austin Schuha0c41ba2020-09-10 22:59:14 -070076void SetImplementation(std::shared_ptr<LogImplementation> implementation) {
Austin Schuh56196432020-10-24 20:15:21 -070077 internal::Context *context = internal::Context::Get();
78 context->implementation = std::move(implementation);
Tyler Chatow4b471e12020-01-05 20:19:36 -080079}
80
Austin Schuha0c41ba2020-09-10 22:59:14 -070081std::shared_ptr<LogImplementation> GetImplementation() {
Austin Schuh56196432020-10-24 20:15:21 -070082 internal::Context *context = internal::Context::Get();
83 return context->implementation;
Tyler Chatow5febd8f2020-01-05 18:25:31 -080084}
85
Brian Silvermanf665d692013-02-17 22:11:39 -080086} // namespace logging
87} // namespace aos