blob: be54eec132829318734f5e7221eeb48cbc0e5b1e [file] [log] [blame]
John Park33858a32018-09-28 23:05:48 -07001#include "aos/logging/implementations.h"
Brian Silvermanf665d692013-02-17 22:11:39 -08002
Brian4a424a22014-04-02 11:52:45 -07003#include <inttypes.h>
Tyler Chatow5febd8f2020-01-05 18:25:31 -08004#include <stdarg.h>
Austin Schuh044e18b2015-10-21 20:17:09 -07005
Brian Silvermancb5da1f2015-12-05 22:19:58 -05006#include <algorithm>
Austin Schuhf2a50ba2016-12-24 16:16:26 -08007#include <chrono>
Brian Silvermancb5da1f2015-12-05 22:19:58 -05008
John Park33858a32018-09-28 23:05:48 -07009#include "aos/logging/printf_formats.h"
John Park33858a32018-09-28 23:05:48 -070010#include "aos/time/time.h"
Brian Silvermanf665d692013-02-17 22:11:39 -080011
12namespace aos {
13namespace logging {
Austin Schuh56196432020-10-24 20:15:21 -070014namespace internal {
Brian Silvermanf665d692013-02-17 22:11:39 -080015namespace {
16
Austin Schuhf2a50ba2016-12-24 16:16:26 -080017namespace chrono = ::std::chrono;
18
Austin Schuh82c0c822019-05-27 19:55:20 -070019void FillInMessageBase(log_level level,
20 monotonic_clock::time_point monotonic_now,
21 LogMessage *message) {
Brian Silvermanf665d692013-02-17 22:11:39 -080022 Context *context = Context::Get();
23
Brian Silvermanf665d692013-02-17 22:11:39 -080024 message->level = level;
25 message->source = context->source;
Austin Schuhaebbc342015-01-25 02:25:13 -080026 memcpy(message->name, context->name, context->name_size);
27 message->name_length = context->name_size;
Brian Silvermanf665d692013-02-17 22:11:39 -080028
Austin Schuhf2a50ba2016-12-24 16:16:26 -080029 message->seconds =
30 chrono::duration_cast<chrono::seconds>(monotonic_now.time_since_epoch())
31 .count();
32 message->nseconds =
33 chrono::duration_cast<chrono::nanoseconds>(
34 monotonic_now.time_since_epoch() - chrono::seconds(message->seconds))
35 .count();
Brian Silvermanf665d692013-02-17 22:11:39 -080036
37 message->sequence = context->sequence++;
38}
39
Brian Silverman88471dc2014-02-15 22:35:42 -080040} // namespace
41
Austin Schuh82c0c822019-05-27 19:55:20 -070042void FillInMessage(log_level level, monotonic_clock::time_point monotonic_now,
43 const char *format, va_list ap, LogMessage *message) {
44 FillInMessageBase(level, 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 Schuh82c0c822019-05-27 19:55:20 -070064 internal::FillInMessage(level, monotonic_now(), format, ap, &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
Brian Silvermanf665d692013-02-17 22:11:39 -080085} // namespace logging
86} // namespace aos