diff --git a/internal/platform/implementation/apple/BUILD b/internal/platform/implementation/apple/BUILD index 317790ee..6627e5aa 100644 --- a/internal/platform/implementation/apple/BUILD +++ b/internal/platform/implementation/apple/BUILD @@ -52,14 +52,25 @@ objc_library( deps = [ ":Platform_cc", ":Shared", + "//internal/platform:base", + "//internal/platform:cancellation_flag", + "//internal/platform/implementation:comm", "//internal/platform/implementation:platform", "//internal/platform/implementation:types", "//internal/platform/implementation/apple/Mediums", "//internal/platform/implementation/shared:file", "//third_party/apple_frameworks:CoreBluetooth", - "//third_party/apple_frameworks:CoreFoundation", "//third_party/apple_frameworks:Foundation", "//third_party/objective_c/google_toolbox_for_mac:GTM_Logger", + "@com_google_absl//absl/base:core_headers", + "@com_google_absl//absl/container:common", + "@com_google_absl//absl/container:flat_hash_map", + "@com_google_absl//absl/memory", + "@com_google_absl//absl/strings", + "@com_google_absl//absl/strings:str_format", + "@com_google_absl//absl/synchronization", + "@com_google_absl//absl/time", + "@com_google_absl//absl/types:optional", ], ) diff --git a/internal/platform/implementation/apple/log_message.h b/internal/platform/implementation/apple/log_message.h index 56533463..3cc117fb 100644 --- a/internal/platform/implementation/apple/log_message.h +++ b/internal/platform/implementation/apple/log_message.h @@ -15,16 +15,31 @@ #ifndef PLATFORM_IMPL_APPLE_LOG_MESSAGE_H_ #define PLATFORM_IMPL_APPLE_LOG_MESSAGE_H_ -#ifdef NEARBY_SWIFTPM +#include #include -#else -#include "glog/logging.h" -#endif +#include + +#include "absl/strings/string_view.h" #include "internal/platform/implementation/log_message.h" +#include "GoogleToolboxForMac/GTMLogger.h" namespace nearby { namespace apple { +class LogStreamer final { + public: + explicit LogStreamer(GTMLoggerLevel severity, absl::string_view func); + + ~LogStreamer(); + + std::ostream& stream() { return stream_; } + + private: + GTMLoggerLevel severity_; + std::string func_; + std::ostringstream stream_; +}; + // Concrete LogMessage implementation class LogMessage : public api::LogMessage { public: @@ -39,12 +54,9 @@ class LogMessage : public api::LogMessage { std::ostream& Stream() override; private: -#ifdef NEARBY_SWIFTPM - std::stringstream log_streamer_; -#else - google::LogMessage log_streamer_; -#endif - api::LogMessage::Severity severity_; + LogStreamer log_streamer_; + GTMLoggerLevel severity_; + std::string func_; }; } // namespace apple diff --git a/internal/platform/implementation/apple/log_message.mm b/internal/platform/implementation/apple/log_message.mm index a7af76b2..07b738a8 100644 --- a/internal/platform/implementation/apple/log_message.mm +++ b/internal/platform/implementation/apple/log_message.mm @@ -14,11 +14,10 @@ #include "internal/platform/implementation/apple/log_message.h" -#ifndef NEARBY_SWIFTPM -#include "glog/logging.h" -#endif +#include +#include + #include "internal/platform/implementation/log_message.h" -#include "GoogleToolboxForMac/GTMLogger.h" namespace nearby { namespace apple { @@ -40,42 +39,66 @@ GTMLoggerLevel ConvertSeverity(api::LogMessage::Severity severity) { } } +// GTMLogger expects a function name, but we only have file and line. So format the info as +// {basename(file)}:{line} and use that as the function name. +std::string ConvertFileAndLine(absl::string_view filepath, int line) { + size_t path = filepath.find_last_of('/'); + if (path != filepath.npos) filepath.remove_prefix(path + 1); + return std::string(filepath) + ":" + std::to_string(line); +} + +LogStreamer::LogStreamer(GTMLoggerLevel severity, absl::string_view func) + : severity_(severity), func_(func) {} + +LogStreamer::~LogStreamer() { + switch (severity_) { + case kGTMLoggerLevelDebug: + [[GTMLogger sharedLogger] logFuncDebug:func_.c_str() msg:@"%@", @(stream_.str().c_str())]; + break; + case kGTMLoggerLevelInfo: + [[GTMLogger sharedLogger] logFuncInfo:func_.c_str() msg:@"%@", @(stream_.str().c_str())]; + break; + case kGTMLoggerLevelError: + [[GTMLogger sharedLogger] logFuncError:func_.c_str() msg:@"%@", @(stream_.str().c_str())]; + break; + case kGTMLoggerLevelAssert: + [[GTMLogger sharedLogger] logFuncAssert:func_.c_str() msg:@"%@", @(stream_.str().c_str())]; + break; + case kGTMLoggerLevelUnknown: + // no-op + break; + } +} + LogMessage::LogMessage(const char* file, int line, Severity severity) -#ifdef NEARBY_SWIFTPM - : log_streamer_() {} -#else - : log_streamer_(ConvertSeverity(severity), file, line), severity_(severity) {} -#endif + : log_streamer_(ConvertSeverity(severity), ConvertFileAndLine(file, line)), + severity_(ConvertSeverity(severity)), + func_(ConvertFileAndLine(file, line)) {} void LogMessage::Print(const char* format, ...) { va_list ap; va_start(ap, format); - switch (ConvertSeverity(severity_)) { + switch (severity_) { case kGTMLoggerLevelDebug: - [[GTMLogger sharedLogger] logDebug:[NSString stringWithUTF8String:format], ap]; + [[GTMLogger sharedLogger] logFuncDebug:func_.c_str() msg:@(format), ap]; break; case kGTMLoggerLevelInfo: - [[GTMLogger sharedLogger] logInfo:[NSString stringWithUTF8String:format], ap]; + [[GTMLogger sharedLogger] logFuncInfo:func_.c_str() msg:@(format), ap]; break; case kGTMLoggerLevelError: - [[GTMLogger sharedLogger] logError:[NSString stringWithUTF8String:format], ap]; + [[GTMLogger sharedLogger] logFuncError:func_.c_str() msg:@(format), ap]; break; case kGTMLoggerLevelAssert: - [[GTMLogger sharedLogger] logAssert:[NSString stringWithUTF8String:format], ap]; + [[GTMLogger sharedLogger] logFuncAssert:func_.c_str() msg:@(format), ap]; break; case kGTMLoggerLevelUnknown: - // no-op - break; + // no-op + break; } + va_end(ap); } -// TODO(b/169292092): GTMLogger doesn't support stream. Temporarily use absl LogStreamer to make -// build pass. -#ifdef NEARBY_SWIFTPM -std::ostream& LogMessage::Stream() { return log_streamer_; } -#else std::ostream& LogMessage::Stream() { return log_streamer_.stream(); } -#endif } // namespace apple @@ -86,9 +109,7 @@ void LogMessage::SetMinLogSeverity(Severity severity) { apple::gMinLogSeverity = // static bool LogMessage::ShouldCreateLogMessage(Severity severity) { - // TODO(b/169292092): GTMLogger doesn't support stream which cause crash. Temporarily turn off - // LogMessage. - return false; + return severity >= apple::gMinLogSeverity; } } // namespace api