1 #include <mbgl/util/logging.hpp>
2 #include <mbgl/util/enum.hpp>
3 #include <mbgl/util/platform.hpp>
4
5 #include <cstdio>
6 #include <cstdarg>
7 #include <sstream>
8
9 namespace mbgl {
10
11 namespace {
12
13 static std::unique_ptr<Log::Observer> currentObserver;
14
15 } // namespace
16
setObserver(std::unique_ptr<Observer> observer)17 void Log::setObserver(std::unique_ptr<Observer> observer) {
18 currentObserver = std::move(observer);
19 }
20
removeObserver()21 std::unique_ptr<Log::Observer> Log::removeObserver() {
22 std::unique_ptr<Observer> observer;
23 std::swap(observer, currentObserver);
24 return observer;
25 }
26
record(EventSeverity severity,Event event,const std::string & msg)27 void Log::record(EventSeverity severity, Event event, const std::string &msg) {
28 record(severity, event, -1, msg);
29 }
30
record(EventSeverity severity,Event event,const char * format,...)31 void Log::record(EventSeverity severity, Event event, const char* format, ...) {
32 va_list args;
33 va_start(args, format);
34 char msg[4096];
35 vsnprintf(msg, sizeof(msg), format, args);
36 va_end(args);
37
38 record(severity, event, -1, msg);
39 }
40
record(EventSeverity severity,Event event,int64_t code,const char * format,...)41 void Log::record(EventSeverity severity, Event event, int64_t code, const char* format, ...) {
42 va_list args;
43 va_start(args, format);
44 char msg[4096];
45 vsnprintf(msg, sizeof(msg), format, args);
46 va_end(args);
47
48 record(severity, event, code, std::string{ msg });
49 }
50
record(EventSeverity severity,Event event,int64_t code,const std::string & msg)51 void Log::record(EventSeverity severity, Event event, int64_t code, const std::string &msg) {
52 if (currentObserver && severity != EventSeverity::Debug &&
53 currentObserver->onRecord(severity, event, code, msg)) {
54 return;
55 }
56
57 std::stringstream logStream;
58
59 logStream << "{" << platform::getCurrentThreadName() << "}";
60 logStream << "[" << Enum<Event>::toString(event) << "]";
61
62 if (code >= 0) {
63 logStream << "(" << code << ")";
64 }
65
66 if (!msg.empty()) {
67 logStream << ": " << msg;
68 }
69
70 platformRecord(severity, logStream.str());
71 }
72
73 } // namespace mbgl
74