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