From 9d511b2afc65fa1260acafd960700e10e42f7d8d Mon Sep 17 00:00:00 2001 From: Steven Hack Date: Fri, 5 May 2017 14:07:47 +0200 Subject: [PATCH 1/3] Removed http logging. --- .../ConfigureHttpLoggingExtension.cs | 86 ------ .../UseIdentityServerExtension.cs | 254 +++++++++--------- source/Core/Configuration/LoggingOptions.cs | 81 +++--- source/Core/Core.csproj | 1 - 4 files changed, 162 insertions(+), 260 deletions(-) delete mode 100644 source/Core/Configuration/AppBuilderExtensions/ConfigureHttpLoggingExtension.cs diff --git a/source/Core/Configuration/AppBuilderExtensions/ConfigureHttpLoggingExtension.cs b/source/Core/Configuration/AppBuilderExtensions/ConfigureHttpLoggingExtension.cs deleted file mode 100644 index 351fd959a..000000000 --- a/source/Core/Configuration/AppBuilderExtensions/ConfigureHttpLoggingExtension.cs +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright 2014, 2015 Dominick Baier, Brock Allen - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -using IdentityServer3.Core.Configuration; -using IdentityServer3.Core.Extensions; -using IdentityServer3.Core.Logging; -using Microsoft.Owin; -using System; -using System.IO; -using System.Threading.Tasks; - -namespace Owin -{ - static class ConfigureHttpLoggingExtension - { - static readonly ILog Logger = LogProvider.GetLogger("HTTP Logging"); - - public static IAppBuilder ConfigureHttpLogging(this IAppBuilder app, LoggingOptions options) - { - if (options.EnableHttpLogging) - { - app.Use(async (ctx, next) => - { - await LogRequest(ctx.Request); - - var oldStream = ctx.Response.Body; - var ms = ctx.Response.Body = new MemoryStream(); - - try - { - await next(); - await LogResponse(ctx.Response); - - ctx.Response.Body = oldStream; - await ms.CopyToAsync(oldStream); - } - catch(Exception ex) - { - Logger.DebugException("HTTP Response Exception", ex); - throw; - } - }); - } - - return app; - } - - private static async Task LogRequest(IOwinRequest request) - { - var reqLog = new - { - Method = request.Method, - Url = request.Uri.AbsoluteUri, - Headers = request.Headers, - Body = await request.ReadBodyAsStringAsync() - }; - - Logger.Debug("HTTP Request" + Environment.NewLine + LogSerializer.Serialize(reqLog)); - } - - private static async Task LogResponse(IOwinResponse response) - { - var respLog = new - { - StatusCode = response.StatusCode, - Headers = response.Headers, - Body = await response.ReadBodyAsStringAsync() - }; - - Logger.Debug("HTTP Response" + Environment.NewLine + LogSerializer.Serialize(respLog)); - } - } -} diff --git a/source/Core/Configuration/AppBuilderExtensions/UseIdentityServerExtension.cs b/source/Core/Configuration/AppBuilderExtensions/UseIdentityServerExtension.cs index 9a48b9e46..34ac1ffd0 100644 --- a/source/Core/Configuration/AppBuilderExtensions/UseIdentityServerExtension.cs +++ b/source/Core/Configuration/AppBuilderExtensions/UseIdentityServerExtension.cs @@ -30,132 +30,130 @@ namespace Owin { - /// - /// Configuration extensions for identity server - /// - public static class UseIdentityServerExtension - { - private static readonly ILog Logger = LogProvider.GetLogger("Startup"); - - /// - /// Extension method to configure IdentityServer in the hosting application. - /// - /// The application. - /// The . - /// - /// - /// app - /// or - /// options - /// - public static IAppBuilder UseIdentityServer(this IAppBuilder app, IdentityServerOptions options) - { - if (app == null) throw new ArgumentNullException("app"); - if (options == null) throw new ArgumentNullException("options"); - - options.Validate(); - - // turn off weird claim mappings for JWTs - JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary(); - JwtSecurityTokenHandler.OutboundClaimTypeMap = new Dictionary(); - - if (options.RequireSsl) - { - app.Use(); - } - - if (options.LoggingOptions.EnableKatanaLogging) - { - app.SetLoggerFactory(new LibLogKatanaLoggerFactory()); - } - - app.UseEmbeddedFileServer(); - - app.ConfigureRequestId(); - app.ConfigureDataProtectionProvider(options); - app.ConfigureIdentityServerBaseUrl(options.PublicOrigin); - app.ConfigureIdentityServerIssuer(options); - - app.ConfigureRequestBodyBuffer(); - - // this needs to be earlier than the autofac middleware so anything is disposed and re-initialized - // if we send the request back into the pipeline to render the logged out page - app.ConfigureRenderLoggedOutPage(); - - var container = AutofacConfig.Configure(options); - app.UseAutofacMiddleware(container); - - app.UseCors(); - app.ConfigureCookieAuthentication(options.AuthenticationOptions.CookieOptions, options.DataProtector); - - // this needs to be before external middleware - app.ConfigureSignOutMessageCookie(); - - - if (options.PluginConfiguration != null) - { - options.PluginConfiguration(app, options); - } - - if (options.AuthenticationOptions.IdentityProviders != null) - { - options.AuthenticationOptions.IdentityProviders(app, Constants.ExternalAuthenticationType); - } - - app.ConfigureHttpLogging(options.LoggingOptions); - - SignatureConversions.AddConversions(app); - - var httpConfig = WebApiConfig.Configure(options, container); - app.UseAutofacWebApi(httpConfig); - app.UseWebApi(httpConfig); - - using (var child = container.CreateScopeWithEmptyOwinContext()) - { - var eventSvc = child.Resolve(); - // TODO -- perhaps use AsyncHelper instead? - DoStartupDiagnosticsAsync(options, eventSvc).Wait(); - } - - return app; - } - - private static async Task DoStartupDiagnosticsAsync(IdentityServerOptions options, IEventService eventSvc) - { - var cert = options.SigningCertificate; - - if (cert == null) - { - Logger.Warn("No signing certificate configured."); - await eventSvc.RaiseNoCertificateConfiguredEventAsync(); - - return; - } - if (!cert.HasPrivateKey || !cert.IsPrivateAccessAllowed()) - { - Logger.Error("Signing certificate has no private key or the private key is not accessible. Make sure the account running your application has access to the private key"); - await eventSvc.RaiseCertificatePrivateKeyNotAccessibleEventAsync(cert); - - return; - } - if (cert.PublicKey.Key.KeySize < 2048) - { - Logger.Error("Signing certificate key length is less than 2048 bits."); - await eventSvc.RaiseCertificateKeyLengthTooShortEventAsync(cert); - - return; - } - - var timeSpanToExpire = cert.NotAfter - DateTimeHelper.UtcNow; - if (timeSpanToExpire < TimeSpan.FromDays(30)) - { - Logger.Warn("The signing certificate will expire in the next 30 days: " + cert.NotAfter.ToString()); - await eventSvc.RaiseCertificateExpiringSoonEventAsync(cert); - - return; - } - - await eventSvc.RaiseCertificateValidatedEventAsync(cert); - } - } + /// + /// Configuration extensions for identity server + /// + public static class UseIdentityServerExtension + { + private static readonly ILog Logger = LogProvider.GetLogger("Startup"); + + /// + /// Extension method to configure IdentityServer in the hosting application. + /// + /// The application. + /// The . + /// + /// + /// app + /// or + /// options + /// + public static IAppBuilder UseIdentityServer(this IAppBuilder app, IdentityServerOptions options) + { + if (app == null) throw new ArgumentNullException("app"); + if (options == null) throw new ArgumentNullException("options"); + + options.Validate(); + + // turn off weird claim mappings for JWTs + JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary(); + JwtSecurityTokenHandler.OutboundClaimTypeMap = new Dictionary(); + + if (options.RequireSsl) + { + app.Use(); + } + + if (options.LoggingOptions.EnableKatanaLogging) + { + app.SetLoggerFactory(new LibLogKatanaLoggerFactory()); + } + + app.UseEmbeddedFileServer(); + + app.ConfigureRequestId(); + app.ConfigureDataProtectionProvider(options); + app.ConfigureIdentityServerBaseUrl(options.PublicOrigin); + app.ConfigureIdentityServerIssuer(options); + + app.ConfigureRequestBodyBuffer(); + + // this needs to be earlier than the autofac middleware so anything is disposed and re-initialized + // if we send the request back into the pipeline to render the logged out page + app.ConfigureRenderLoggedOutPage(); + + var container = AutofacConfig.Configure(options); + app.UseAutofacMiddleware(container); + + app.UseCors(); + app.ConfigureCookieAuthentication(options.AuthenticationOptions.CookieOptions, options.DataProtector); + + // this needs to be before external middleware + app.ConfigureSignOutMessageCookie(); + + + if (options.PluginConfiguration != null) + { + options.PluginConfiguration(app, options); + } + + if (options.AuthenticationOptions.IdentityProviders != null) + { + options.AuthenticationOptions.IdentityProviders(app, Constants.ExternalAuthenticationType); + } + + SignatureConversions.AddConversions(app); + + var httpConfig = WebApiConfig.Configure(options, container); + app.UseAutofacWebApi(httpConfig); + app.UseWebApi(httpConfig); + + using (var child = container.CreateScopeWithEmptyOwinContext()) + { + var eventSvc = child.Resolve(); + // TODO -- perhaps use AsyncHelper instead? + DoStartupDiagnosticsAsync(options, eventSvc).Wait(); + } + + return app; + } + + private static async Task DoStartupDiagnosticsAsync(IdentityServerOptions options, IEventService eventSvc) + { + var cert = options.SigningCertificate; + + if (cert == null) + { + Logger.Warn("No signing certificate configured."); + await eventSvc.RaiseNoCertificateConfiguredEventAsync(); + + return; + } + if (!cert.HasPrivateKey || !cert.IsPrivateAccessAllowed()) + { + Logger.Error("Signing certificate has no private key or the private key is not accessible. Make sure the account running your application has access to the private key"); + await eventSvc.RaiseCertificatePrivateKeyNotAccessibleEventAsync(cert); + + return; + } + if (cert.PublicKey.Key.KeySize < 2048) + { + Logger.Error("Signing certificate key length is less than 2048 bits."); + await eventSvc.RaiseCertificateKeyLengthTooShortEventAsync(cert); + + return; + } + + var timeSpanToExpire = cert.NotAfter - DateTimeHelper.UtcNow; + if (timeSpanToExpire < TimeSpan.FromDays(30)) + { + Logger.Warn("The signing certificate will expire in the next 30 days: " + cert.NotAfter.ToString()); + await eventSvc.RaiseCertificateExpiringSoonEventAsync(cert); + + return; + } + + await eventSvc.RaiseCertificateValidatedEventAsync(cert); + } + } } diff --git a/source/Core/Configuration/LoggingOptions.cs b/source/Core/Configuration/LoggingOptions.cs index 976c90f5f..b91cd20ba 100644 --- a/source/Core/Configuration/LoggingOptions.cs +++ b/source/Core/Configuration/LoggingOptions.cs @@ -16,52 +16,43 @@ namespace IdentityServer3.Core.Configuration { - /// - /// Configures logging within IdentityServer. - /// - public class LoggingOptions - { - /// - /// Initializes a new instance of the class. - /// - public LoggingOptions() - { - EnableWebApiDiagnostics = false; - WebApiDiagnosticsIsVerbose = false; - EnableHttpLogging = false; - EnableKatanaLogging = false; - } + /// + /// Configures logging within IdentityServer. + /// + public class LoggingOptions + { + /// + /// Initializes a new instance of the class. + /// + public LoggingOptions() + { + EnableWebApiDiagnostics = false; + WebApiDiagnosticsIsVerbose = false; + EnableKatanaLogging = false; + } - /// - /// Gets or sets a value indicating whether web API diagnostics should be enabled. - /// - /// - /// true if web API diagnostics should be enabled; otherwise, false. - /// - public bool EnableWebApiDiagnostics { get; set; } + /// + /// Gets or sets a value indicating whether web API diagnostics should be enabled. + /// + /// + /// true if web API diagnostics should be enabled; otherwise, false. + /// + public bool EnableWebApiDiagnostics { get; set; } - /// - /// Gets or sets a value indicating whether web API diagnostics logging should be set to verbose. - /// - /// - /// true if web API diagnostics logging should be verbose; otherwise, false. - /// - public bool WebApiDiagnosticsIsVerbose { get; set; } + /// + /// Gets or sets a value indicating whether web API diagnostics logging should be set to verbose. + /// + /// + /// true if web API diagnostics logging should be verbose; otherwise, false. + /// + public bool WebApiDiagnosticsIsVerbose { get; set; } - /// - /// Gets or sets a value indicating whether HTTP request/response logging is enabled - /// - /// - /// true if HTTP logging is enabled; otherwise, false. - /// - public bool EnableHttpLogging { get; set; } - - /// - /// Gets or sets a value indicating whether Katana logging should be forwarded to the standard logging output. - /// - /// - /// true if Katana log forwarding is enabled; otherwise, false. - /// - public bool EnableKatanaLogging { get; set; } - } + /// + /// Gets or sets a value indicating whether Katana logging should be forwarded to the standard logging output. + /// + /// + /// true if Katana log forwarding is enabled; otherwise, false. + /// + public bool EnableKatanaLogging { get; set; } + } } diff --git a/source/Core/Core.csproj b/source/Core/Core.csproj index e20f24881..b7a4b3be4 100644 --- a/source/Core/Core.csproj +++ b/source/Core/Core.csproj @@ -133,7 +133,6 @@ - From 118a9892c321a8a14cf3400479b9ae75c01d5f2a Mon Sep 17 00:00:00 2001 From: Steven Hack Date: Fri, 5 May 2017 14:23:44 +0200 Subject: [PATCH 2/3] Reverted tabs to spaces --- .../UseIdentityServerExtension.cs | 248 +++++++++--------- 1 file changed, 124 insertions(+), 124 deletions(-) diff --git a/source/Core/Configuration/AppBuilderExtensions/UseIdentityServerExtension.cs b/source/Core/Configuration/AppBuilderExtensions/UseIdentityServerExtension.cs index 34ac1ffd0..9a492c125 100644 --- a/source/Core/Configuration/AppBuilderExtensions/UseIdentityServerExtension.cs +++ b/source/Core/Configuration/AppBuilderExtensions/UseIdentityServerExtension.cs @@ -30,130 +30,130 @@ namespace Owin { - /// - /// Configuration extensions for identity server - /// - public static class UseIdentityServerExtension - { - private static readonly ILog Logger = LogProvider.GetLogger("Startup"); - - /// - /// Extension method to configure IdentityServer in the hosting application. - /// - /// The application. - /// The . - /// - /// - /// app - /// or - /// options - /// - public static IAppBuilder UseIdentityServer(this IAppBuilder app, IdentityServerOptions options) - { - if (app == null) throw new ArgumentNullException("app"); - if (options == null) throw new ArgumentNullException("options"); - - options.Validate(); - - // turn off weird claim mappings for JWTs - JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary(); - JwtSecurityTokenHandler.OutboundClaimTypeMap = new Dictionary(); - - if (options.RequireSsl) - { - app.Use(); - } - - if (options.LoggingOptions.EnableKatanaLogging) - { - app.SetLoggerFactory(new LibLogKatanaLoggerFactory()); - } - - app.UseEmbeddedFileServer(); - - app.ConfigureRequestId(); - app.ConfigureDataProtectionProvider(options); - app.ConfigureIdentityServerBaseUrl(options.PublicOrigin); - app.ConfigureIdentityServerIssuer(options); - - app.ConfigureRequestBodyBuffer(); - - // this needs to be earlier than the autofac middleware so anything is disposed and re-initialized - // if we send the request back into the pipeline to render the logged out page - app.ConfigureRenderLoggedOutPage(); - - var container = AutofacConfig.Configure(options); - app.UseAutofacMiddleware(container); - - app.UseCors(); - app.ConfigureCookieAuthentication(options.AuthenticationOptions.CookieOptions, options.DataProtector); - - // this needs to be before external middleware - app.ConfigureSignOutMessageCookie(); - - - if (options.PluginConfiguration != null) - { - options.PluginConfiguration(app, options); - } - - if (options.AuthenticationOptions.IdentityProviders != null) - { - options.AuthenticationOptions.IdentityProviders(app, Constants.ExternalAuthenticationType); - } - - SignatureConversions.AddConversions(app); - - var httpConfig = WebApiConfig.Configure(options, container); - app.UseAutofacWebApi(httpConfig); - app.UseWebApi(httpConfig); - - using (var child = container.CreateScopeWithEmptyOwinContext()) - { - var eventSvc = child.Resolve(); - // TODO -- perhaps use AsyncHelper instead? - DoStartupDiagnosticsAsync(options, eventSvc).Wait(); - } - - return app; - } - - private static async Task DoStartupDiagnosticsAsync(IdentityServerOptions options, IEventService eventSvc) - { - var cert = options.SigningCertificate; - - if (cert == null) - { - Logger.Warn("No signing certificate configured."); - await eventSvc.RaiseNoCertificateConfiguredEventAsync(); - - return; - } - if (!cert.HasPrivateKey || !cert.IsPrivateAccessAllowed()) - { - Logger.Error("Signing certificate has no private key or the private key is not accessible. Make sure the account running your application has access to the private key"); - await eventSvc.RaiseCertificatePrivateKeyNotAccessibleEventAsync(cert); - - return; - } - if (cert.PublicKey.Key.KeySize < 2048) - { - Logger.Error("Signing certificate key length is less than 2048 bits."); - await eventSvc.RaiseCertificateKeyLengthTooShortEventAsync(cert); - - return; - } - - var timeSpanToExpire = cert.NotAfter - DateTimeHelper.UtcNow; - if (timeSpanToExpire < TimeSpan.FromDays(30)) - { - Logger.Warn("The signing certificate will expire in the next 30 days: " + cert.NotAfter.ToString()); - await eventSvc.RaiseCertificateExpiringSoonEventAsync(cert); + /// + /// Configuration extensions for identity server + /// + public static class UseIdentityServerExtension + { + private static readonly ILog Logger = LogProvider.GetLogger("Startup"); + + /// + /// Extension method to configure IdentityServer in the hosting application. + /// + /// The application. + /// The . + /// + /// + /// app + /// or + /// options + /// + public static IAppBuilder UseIdentityServer(this IAppBuilder app, IdentityServerOptions options) + { + if (app == null) throw new ArgumentNullException("app"); + if (options == null) throw new ArgumentNullException("options"); + + options.Validate(); + + // turn off weird claim mappings for JWTs + JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary(); + JwtSecurityTokenHandler.OutboundClaimTypeMap = new Dictionary(); + + if (options.RequireSsl) + { + app.Use(); + } + + if (options.LoggingOptions.EnableKatanaLogging) + { + app.SetLoggerFactory(new LibLogKatanaLoggerFactory()); + } + + app.UseEmbeddedFileServer(); + + app.ConfigureRequestId(); + app.ConfigureDataProtectionProvider(options); + app.ConfigureIdentityServerBaseUrl(options.PublicOrigin); + app.ConfigureIdentityServerIssuer(options); + + app.ConfigureRequestBodyBuffer(); + + // this needs to be earlier than the autofac middleware so anything is disposed and re-initialized + // if we send the request back into the pipeline to render the logged out page + app.ConfigureRenderLoggedOutPage(); + + var container = AutofacConfig.Configure(options); + app.UseAutofacMiddleware(container); + + app.UseCors(); + app.ConfigureCookieAuthentication(options.AuthenticationOptions.CookieOptions, options.DataProtector); + + // this needs to be before external middleware + app.ConfigureSignOutMessageCookie(); + + + if (options.PluginConfiguration != null) + { + options.PluginConfiguration(app, options); + } + + if (options.AuthenticationOptions.IdentityProviders != null) + { + options.AuthenticationOptions.IdentityProviders(app, Constants.ExternalAuthenticationType); + } + + SignatureConversions.AddConversions(app); + + var httpConfig = WebApiConfig.Configure(options, container); + app.UseAutofacWebApi(httpConfig); + app.UseWebApi(httpConfig); + + using (var child = container.CreateScopeWithEmptyOwinContext()) + { + var eventSvc = child.Resolve(); + // TODO -- perhaps use AsyncHelper instead? + DoStartupDiagnosticsAsync(options, eventSvc).Wait(); + } + + return app; + } + + private static async Task DoStartupDiagnosticsAsync(IdentityServerOptions options, IEventService eventSvc) + { + var cert = options.SigningCertificate; + + if (cert == null) + { + Logger.Warn("No signing certificate configured."); + await eventSvc.RaiseNoCertificateConfiguredEventAsync(); + + return; + } + if (!cert.HasPrivateKey || !cert.IsPrivateAccessAllowed()) + { + Logger.Error("Signing certificate has no private key or the private key is not accessible. Make sure the account running your application has access to the private key"); + await eventSvc.RaiseCertificatePrivateKeyNotAccessibleEventAsync(cert); + + return; + } + if (cert.PublicKey.Key.KeySize < 2048) + { + Logger.Error("Signing certificate key length is less than 2048 bits."); + await eventSvc.RaiseCertificateKeyLengthTooShortEventAsync(cert); + + return; + } + + var timeSpanToExpire = cert.NotAfter - DateTimeHelper.UtcNow; + if (timeSpanToExpire < TimeSpan.FromDays(30)) + { + Logger.Warn("The signing certificate will expire in the next 30 days: " + cert.NotAfter.ToString()); + await eventSvc.RaiseCertificateExpiringSoonEventAsync(cert); - return; - } + return; + } - await eventSvc.RaiseCertificateValidatedEventAsync(cert); - } - } + await eventSvc.RaiseCertificateValidatedEventAsync(cert); + } + } } From 6d20230488896c131158d362d09752a631ff5c43 Mon Sep 17 00:00:00 2001 From: Steven Hack Date: Fri, 5 May 2017 14:25:35 +0200 Subject: [PATCH 3/3] Reverted tabs to spaces --- source/Core/Configuration/LoggingOptions.cs | 72 ++++++++++----------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/source/Core/Configuration/LoggingOptions.cs b/source/Core/Configuration/LoggingOptions.cs index b91cd20ba..89a68badc 100644 --- a/source/Core/Configuration/LoggingOptions.cs +++ b/source/Core/Configuration/LoggingOptions.cs @@ -16,43 +16,43 @@ namespace IdentityServer3.Core.Configuration { - /// - /// Configures logging within IdentityServer. - /// - public class LoggingOptions - { - /// - /// Initializes a new instance of the class. - /// - public LoggingOptions() - { - EnableWebApiDiagnostics = false; - WebApiDiagnosticsIsVerbose = false; - EnableKatanaLogging = false; - } + /// + /// Configures logging within IdentityServer. + /// + public class LoggingOptions + { + /// + /// Initializes a new instance of the class. + /// + public LoggingOptions() + { + EnableWebApiDiagnostics = false; + WebApiDiagnosticsIsVerbose = false; + EnableKatanaLogging = false; + } - /// - /// Gets or sets a value indicating whether web API diagnostics should be enabled. - /// - /// - /// true if web API diagnostics should be enabled; otherwise, false. - /// - public bool EnableWebApiDiagnostics { get; set; } + /// + /// Gets or sets a value indicating whether web API diagnostics should be enabled. + /// + /// + /// true if web API diagnostics should be enabled; otherwise, false. + /// + public bool EnableWebApiDiagnostics { get; set; } - /// - /// Gets or sets a value indicating whether web API diagnostics logging should be set to verbose. - /// - /// - /// true if web API diagnostics logging should be verbose; otherwise, false. - /// - public bool WebApiDiagnosticsIsVerbose { get; set; } + /// + /// Gets or sets a value indicating whether web API diagnostics logging should be set to verbose. + /// + /// + /// true if web API diagnostics logging should be verbose; otherwise, false. + /// + public bool WebApiDiagnosticsIsVerbose { get; set; } - /// - /// Gets or sets a value indicating whether Katana logging should be forwarded to the standard logging output. - /// - /// - /// true if Katana log forwarding is enabled; otherwise, false. - /// - public bool EnableKatanaLogging { get; set; } - } + /// + /// Gets or sets a value indicating whether Katana logging should be forwarded to the standard logging output. + /// + /// + /// true if Katana log forwarding is enabled; otherwise, false. + /// + public bool EnableKatanaLogging { get; set; } + } }