From 24d9d25395e159db8f2e0b1936e9bb74b4068ce2 Mon Sep 17 00:00:00 2001 From: Chris Bracken Date: Thu, 16 Mar 2017 18:50:33 -0700 Subject: [PATCH] Perform all iOS logging through ASL (#3481) * Perform all iOS logging through ASL As of iOS 10, ASL is deprecated and replaced with os_log. ASL calls continue to result in logging but as of iOS 10.3, only ASL_LOG_NOTICE level and above are logged. This change partially reverts 2937f06a15cecf5e9398334617ca156316dae52b, adding back stdout and stderr redirection, which resulted in loss of some direct writes to stdout that were necessary for debugging. This change replaces the direct use of syslog with ASL on iOS, which Apple has stated will continue to log on iOS >= 10. This eliminates the need for the previous fwd-declaration of syslog. --- lib/ui/dart_runtime_hooks.cc | 7 ++----- shell/common/switches.h | 5 +++++ shell/platform/darwin/common/platform_mac.mm | 16 ++++++++++++++++ 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/lib/ui/dart_runtime_hooks.cc b/lib/ui/dart_runtime_hooks.cc index aa028ddb3..1b43c88aa 100644 --- a/lib/ui/dart_runtime_hooks.cc +++ b/lib/ui/dart_runtime_hooks.cc @@ -28,10 +28,7 @@ #endif #if __APPLE__ -extern "C" { -// Cannot import the syslog.h header directly because of macro collision -extern void syslog(int, const char*, ...); -} +#include #endif using tonic::LogIfError; @@ -157,7 +154,7 @@ void Logger_PrintString(Dart_NativeArguments args) { __android_log_print(ANDROID_LOG_INFO, tag, "%.*s", (int)length, chars); #elif __APPLE__ - syslog(1 /* LOG_ALERT */, "%.*s", (int)length, chars); + asl_log_message(ASL_LEVEL_NOTICE, "%.*s", (int)length, chars); #endif } if (dart::bin::ShouldCaptureStdout()) { diff --git a/shell/common/switches.h b/shell/common/switches.h index 8913dbb54..4ced30821 100644 --- a/shell/common/switches.h +++ b/shell/common/switches.h @@ -62,6 +62,11 @@ DEF_SWITCH(NonInteractive, "non-interactive", "Make the shell non-interactive. By default, the shell attempts " "to setup a window and create an OpenGL context.") +DEF_SWITCH(NoRedirectToSyslog, + "no-redirect-to-syslog", + "On iOS: Don't redirect stdout and stderr to syslog by default. " + "This is used by the tools to read device logs. However, this can " + "cause logs to not show up when launched from Xcode.") DEF_SWITCH(Packages, "packages", "Specify the path to the packages.") DEF_SWITCH(StartPaused, "start-paused", diff --git a/shell/platform/darwin/common/platform_mac.mm b/shell/platform/darwin/common/platform_mac.mm index ce4420a78..ddd188d5b 100644 --- a/shell/platform/darwin/common/platform_mac.mm +++ b/shell/platform/darwin/common/platform_mac.mm @@ -36,6 +36,20 @@ static void InitializeLogging() { false); // Tick count } +static void RedirectIOConnectionsToSyslog() { +#if TARGET_OS_IPHONE + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + FlagForSwitch(Switch::NoRedirectToSyslog))) { + return; + } + + asl_log_descriptor(NULL, NULL, ASL_LEVEL_NOTICE, STDOUT_FILENO, + ASL_LOG_DESCRIPTOR_WRITE); + asl_log_descriptor(NULL, NULL, ASL_LEVEL_WARNING, STDERR_FILENO, + ASL_LOG_DESCRIPTOR_WRITE); +#endif +} + static void InitializeCommandLine() { base::mac::ScopedNSAutoreleasePool pool; base::CommandLine::StringVector vector; @@ -63,6 +77,8 @@ class EmbedderState { InitializeCommandLine(); + RedirectIOConnectionsToSyslog(); + InitializeLogging(); base::CommandLine& command_line = *base::CommandLine::ForCurrentProcess(); -- GitLab