From 9f345c685802504464dce42e07e2e9725ab5b0c0 Mon Sep 17 00:00:00 2001 From: Duncan Cunningham Date: Tue, 29 May 2018 10:17:36 +0200 Subject: [PATCH 1/2] Added support to override built-in logger at runtime --- GCDWebServer/Core/GCDWebServer.h | 14 ++++++++++++++ GCDWebServer/Core/GCDWebServer.m | 18 ++++++++++++++++-- 2 files changed, 30 insertions(+), 2 deletions(-) diff --git a/GCDWebServer/Core/GCDWebServer.h b/GCDWebServer/Core/GCDWebServer.h index 59572ba..674091e 100644 --- a/GCDWebServer/Core/GCDWebServer.h +++ b/GCDWebServer/Core/GCDWebServer.h @@ -69,6 +69,12 @@ typedef GCDWebServerResponse* _Nullable (^GCDWebServerProcessBlock)(__kindof GCD typedef void (^GCDWebServerCompletionBlock)(GCDWebServerResponse* _Nullable response); typedef void (^GCDWebServerAsyncProcessBlock)(__kindof GCDWebServerRequest* request, GCDWebServerCompletionBlock completionBlock); +/** + * The GCDWebServerBuiltInLoggerBlock is used to override the built-in logger at runtime. + * The message parameter is the formatted log message with the logging level. + */ +typedef void (^GCDWebServerBuiltInLoggerBlock)(NSString* _Nonnull message); + /** * The port used by the GCDWebServer (NSNumber / NSUInteger). * @@ -573,6 +579,14 @@ extern NSString* const GCDWebServerAuthenticationMethod_DigestAccess; */ + (void)setLogLevel:(int)level; +/** + * Set a logger to be used instead of the built-in logger which logs to stderr. + * + * IMPORTANT: In order for this override to work, you should not be specifying + * a custom logger at compile time with "__GCDWEBSERVER_LOGGING_HEADER__". + */ ++ (void)setBuiltInLogger:(GCDWebServerBuiltInLoggerBlock)block; + /** * Logs a message to the logging facility at the VERBOSE level. */ diff --git a/GCDWebServer/Core/GCDWebServer.m b/GCDWebServer/Core/GCDWebServer.m index e52ccd4..344dfe2 100644 --- a/GCDWebServer/Core/GCDWebServer.m +++ b/GCDWebServer/Core/GCDWebServer.m @@ -85,18 +85,24 @@ static BOOL _run; #ifdef __GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__ +static GCDWebServerBuiltInLoggerBlock _builtInLoggerBlock; + void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* format, ...) { static const char* levelNames[] = {"DEBUG", "VERBOSE", "INFO", "WARNING", "ERROR"}; static int enableLogging = -1; if (enableLogging < 0) { enableLogging = (isatty(STDERR_FILENO) ? 1 : 0); } - if (enableLogging) { + if (_builtInLoggerBlock || enableLogging) { va_list arguments; va_start(arguments, format); NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments]; va_end(arguments); - fprintf(stderr, "[%s] %s\n", levelNames[level], [message UTF8String]); + if (_builtInLoggerBlock) { + _builtInLoggerBlock([NSString stringWithFormat:@"[%s] %s", levelNames[level], [message UTF8String]]); + } else { + fprintf(stderr, "[%s] %s\n", levelNames[level], [message UTF8String]); + } } } @@ -1091,6 +1097,14 @@ static inline NSString* _EncodeBase64(NSString* string) { #endif } ++ (void)setBuiltInLogger:(GCDWebServerBuiltInLoggerBlock)block { +#if defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__) + _builtInLoggerBlock = block; +#else + GWS_DCHECK(false) // Built-in logger must be enabled in order to override +#endif +} + - (void)logVerbose:(NSString*)format, ... { va_list arguments; va_start(arguments, format); From 11254331d168c44e9292175dfbec0edacb2016fa Mon Sep 17 00:00:00 2001 From: Duncan Cunningham Date: Fri, 13 Jul 2018 16:17:23 +0200 Subject: [PATCH 2/2] Make changes based on PR comments --- GCDWebServer/Core/GCDWebServer.h | 5 +++-- GCDWebServer/Core/GCDWebServer.m | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/GCDWebServer/Core/GCDWebServer.h b/GCDWebServer/Core/GCDWebServer.h index 674091e..727fb46 100644 --- a/GCDWebServer/Core/GCDWebServer.h +++ b/GCDWebServer/Core/GCDWebServer.h @@ -71,9 +71,10 @@ typedef void (^GCDWebServerAsyncProcessBlock)(__kindof GCDWebServerRequest* requ /** * The GCDWebServerBuiltInLoggerBlock is used to override the built-in logger at runtime. - * The message parameter is the formatted log message with the logging level. + * The block will be passed the log level and the log message, see setLogLevel for + * documentation of the log levels for the built-in logger. */ -typedef void (^GCDWebServerBuiltInLoggerBlock)(NSString* _Nonnull message); +typedef void (^GCDWebServerBuiltInLoggerBlock)(int level, NSString* _Nonnull message); /** * The port used by the GCDWebServer (NSNumber / NSUInteger). diff --git a/GCDWebServer/Core/GCDWebServer.m b/GCDWebServer/Core/GCDWebServer.m index 344dfe2..1f1b70b 100644 --- a/GCDWebServer/Core/GCDWebServer.m +++ b/GCDWebServer/Core/GCDWebServer.m @@ -99,7 +99,7 @@ void GCDWebServerLogMessage(GCDWebServerLoggingLevel level, NSString* format, .. NSString* message = [[NSString alloc] initWithFormat:format arguments:arguments]; va_end(arguments); if (_builtInLoggerBlock) { - _builtInLoggerBlock([NSString stringWithFormat:@"[%s] %s", levelNames[level], [message UTF8String]]); + _builtInLoggerBlock(level, message); } else { fprintf(stderr, "[%s] %s\n", levelNames[level], [message UTF8String]); } @@ -1101,7 +1101,7 @@ static inline NSString* _EncodeBase64(NSString* string) { #if defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__) _builtInLoggerBlock = block; #else - GWS_DCHECK(false) // Built-in logger must be enabled in order to override + GWS_DNOT_REACHED(); // Built-in logger must be enabled in order to override #endif }