Add logging support for Apple platform

PiperOrigin-RevId: 509833510
This commit is contained in:
Nick Bourdakos
2023-02-15 07:59:28 -08:00
committed by Copybara-Service
parent d0750694ff
commit cee10e8d44
3 changed files with 80 additions and 36 deletions
+12 -1
View File
@@ -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",
],
)
@@ -15,16 +15,31 @@
#ifndef PLATFORM_IMPL_APPLE_LOG_MESSAGE_H_
#define PLATFORM_IMPL_APPLE_LOG_MESSAGE_H_
#ifdef NEARBY_SWIFTPM
#include <ostream>
#include <sstream>
#else
#include "glog/logging.h"
#endif
#include <string>
#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
@@ -14,11 +14,10 @@
#include "internal/platform/implementation/apple/log_message.h"
#ifndef NEARBY_SWIFTPM
#include "glog/logging.h"
#endif
#include <ostream>
#include <string>
#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