diff --git a/GCDWebServer/Core/GCDWebServer.h b/GCDWebServer/Core/GCDWebServer.h index 473e21f..70cb70c 100644 --- a/GCDWebServer/Core/GCDWebServer.h +++ b/GCDWebServer/Core/GCDWebServer.h @@ -69,6 +69,13 @@ 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 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)(int level, NSString* _Nonnull message); + /** * The port used by the GCDWebServer (NSNumber / NSUInteger). * @@ -573,6 +580,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 e64c71e..57b6f33 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(level, message); + } else { + fprintf(stderr, "[%s] %s\n", levelNames[level], [message UTF8String]); + } } } @@ -1071,6 +1077,14 @@ static inline NSString* _EncodeBase64(NSString* string) { #endif } ++ (void)setBuiltInLogger:(GCDWebServerBuiltInLoggerBlock)block { +#if defined(__GCDWEBSERVER_LOGGING_FACILITY_BUILTIN__) + _builtInLoggerBlock = block; +#else + GWS_DNOT_REACHED(); // Built-in logger must be enabled in order to override +#endif +} + - (void)logVerbose:(NSString*)format, ... { va_list arguments; va_start(arguments, format);