diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index 44c10964..00000000 Binary files a/.DS_Store and /dev/null differ diff --git a/.gitignore b/.gitignore index 282c8bf1..b51546d8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ ## ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +# OS-specific files +.DS_Store + # User-specific files *.suo *.user diff --git a/IPPDotNetDevKitCSV3/.DS_Store b/IPPDotNetDevKitCSV3/.DS_Store deleted file mode 100644 index 945ace22..00000000 Binary files a/IPPDotNetDevKitCSV3/.DS_Store and /dev/null differ diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/AdvancedLogger.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/AdvancedLogger.cs index 7e8aff7c..61e976a7 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/AdvancedLogger.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/AdvancedLogger.cs @@ -31,10 +31,13 @@ public class AdvancedLogger /// /// Gets or sets the Request logging mechanism. /// + [System.Obsolete("Use Logger with TraceLogger or a custom implementation.")] public RequestAdvancedLog RequestAdvancedLog { get; set; } - - + /// + /// Gets or sets the . + /// + public IAdvancedLogger Logger { get; set; } } } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/JsonFileConfigurationProvider.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/JsonFileConfigurationProvider.cs index f958adf5..0bfbe773 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/JsonFileConfigurationProvider.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/JsonFileConfigurationProvider.cs @@ -97,6 +97,7 @@ public IppConfiguration GetConfiguration() ippConfig.AdvancedLogger = new AdvancedLogger { +#pragma warning disable CS0618 // Type or member is obsolete RequestAdvancedLog = new RequestAdvancedLog() { EnableSerilogRequestResponseLoggingForDebug = false, @@ -105,6 +106,7 @@ public IppConfiguration GetConfiguration() EnableSerilogRequestResponseLoggingForFile = false, ServiceRequestLoggingLocationForFile = System.IO.Path.GetTempPath() } +#pragma warning restore CS0618 // Type or member is obsolete }; if (ippConfigurationSection == null) @@ -115,11 +117,13 @@ public IppConfiguration GetConfiguration() ippConfig.Logger = new Logger { CustomLogger = new TraceLogger(), +#pragma warning disable CS0618 // Type or member is obsolete RequestLog = new RequestLog { EnableRequestResponseLogging = false, ServiceRequestLoggingLocation = System.IO.Path.GetTempPath() } +#pragma warning restore CS0618 // Type or member is obsolete }; ippConfig.Message = new Message @@ -160,6 +164,7 @@ public IppConfiguration GetConfiguration() } ippConfig.Logger = new Logger(); +#pragma warning disable CS0618 // Type or member is obsolete ippConfig.Logger.RequestLog = new RequestLog(); ippConfig.Logger.RequestLog.EnableRequestResponseLogging = ippConfigurationSection.Logger.RequestLog.EnableRequestResponseLogging; if (string.IsNullOrEmpty(ippConfigurationSection.Logger.RequestLog.RequestResponseLoggingDirectory)) @@ -177,6 +182,7 @@ public IppConfiguration GetConfiguration() ippConfig.Logger.RequestLog.ServiceRequestLoggingLocation = ippConfigurationSection.Logger.RequestLog.RequestResponseLoggingDirectory; } +#pragma warning restore CS0618 // Type or member is obsolete if (!string.IsNullOrEmpty(ippConfigurationSection.Logger.CustomLogger.Name) && !string.IsNullOrEmpty(ippConfigurationSection.Logger.CustomLogger.Type) && ippConfigurationSection.Logger.CustomLogger.Enable) { @@ -355,7 +361,8 @@ public IppConfiguration GetConfiguration() ippConfig.AdvancedLogger = new AdvancedLogger { - + +#pragma warning disable CS0618 // Type or member is obsolete RequestAdvancedLog = new RequestAdvancedLog() { EnableSerilogRequestResponseLoggingForDebug = false, @@ -364,17 +371,20 @@ public IppConfiguration GetConfiguration() EnableSerilogRequestResponseLoggingForFile = false, ServiceRequestLoggingLocationForFile = System.IO.Path.GetTempPath() } +#pragma warning restore CS0618 // Type or member is obsolete }; ippConfig.Logger = new Logger { CustomLogger = new TraceLogger(), +#pragma warning disable CS0618 // Type or member is obsolete RequestLog = new RequestLog { EnableRequestResponseLogging = false, ServiceRequestLoggingLocation = System.IO.Path.GetTempPath() } +#pragma warning restore CS0618 // Type or member is obsolete }; ippConfig.Message = new Message @@ -481,6 +491,7 @@ public IppConfiguration GetConfiguration() #endregion +#pragma warning disable CS0618 // Type or member is obsolete if (!string.IsNullOrEmpty(serilogLoggerSettingsFile["LogDirectory"]) && Convert.ToBoolean(serilogLoggerSettingsFile["EnableLogs"]) == true) { @@ -517,6 +528,7 @@ public IppConfiguration GetConfiguration() ippConfig.Logger.RequestLog.ServiceRequestLoggingLocation = loggerSettings["LogDirectory"]; } +#pragma warning disable CS0618 // Type or member is obsolete if (!string.IsNullOrEmpty(customLoggerSettings["Name"]) && !string.IsNullOrEmpty(customLoggerSettings["Type"]) && Convert.ToBoolean(customLoggerSettings["Enable"]) == true) { diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/Logger.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/Logger.cs index 69d2e5ae..e7efb79f 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/Logger.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/Logger.cs @@ -31,6 +31,7 @@ public class Logger /// /// Gets or sets the Request logging mechanism. /// + [System.Obsolete("Use a logging framework with CustomLogger.")] public RequestLog RequestLog { get; set; } /// diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/MemoryConfigurationProvider.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/MemoryConfigurationProvider.cs index ab921893..f76a9f5d 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/MemoryConfigurationProvider.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/MemoryConfigurationProvider.cs @@ -44,11 +44,13 @@ public MemoryConfigurationProvider(IppConfiguration cfg) cfg.Logger = new Logger { CustomLogger = new TraceLogger(), +#pragma warning disable CS0618 // Type or member is obsolete RequestLog = new RequestLog { EnableRequestResponseLogging = false, ServiceRequestLoggingLocation = System.IO.Path.GetTempPath() } +#pragma warning restore CS0618 // Type or member is obsolete }; } @@ -57,6 +59,7 @@ public MemoryConfigurationProvider(IppConfiguration cfg) cfg.AdvancedLogger = new AdvancedLogger { +#pragma warning disable CS0618 // Type or member is obsolete RequestAdvancedLog = new RequestAdvancedLog() { EnableSerilogRequestResponseLoggingForDebug = false, @@ -65,6 +68,7 @@ public MemoryConfigurationProvider(IppConfiguration cfg) EnableSerilogRequestResponseLoggingForFile = false, ServiceRequestLoggingLocationForFile = System.IO.Path.GetTempPath() } +#pragma warning restore CS0618 // Type or member is obsolete }; } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/RequestAdvancedLog.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/RequestAdvancedLog.cs index dfdd7da3..cd0e3e0b 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/RequestAdvancedLog.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/RequestAdvancedLog.cs @@ -30,6 +30,7 @@ namespace Intuit.Ipp.Core.Configuration /// /// Contains properties used to indicate whether request and response messages are to be logged. /// + [Obsolete("Serilog configuration for Advanced Logging deprecated.")] public class RequestAdvancedLog { /// diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/RequestLog.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/RequestLog.cs index 2722092d..fe68aa6b 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/RequestLog.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Configuration/RequestLog.cs @@ -29,6 +29,7 @@ namespace Intuit.Ipp.Core.Configuration /// /// Contains properties used to indicate whether request and response messages are to be logged. /// + [Obsolete("Direct file logging is deprecated. Use a logging framework.")] public class RequestLog { /// diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/CoreHelper.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/CoreHelper.cs index 84a03e41..0e73ef88 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/CoreHelper.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/CoreHelper.cs @@ -39,9 +39,9 @@ public static class CoreHelper /// - /// Gets or sets Serilog Request Logging. + /// Gets or sets Advanced Request Logger. /// - internal static Diagnostics.AdvancedLogging AdvancedLogging; + internal static Diagnostics.IAdvancedLogger AdvancedLogging; /// /// Gets the serializer mechanism using the service context and the depending on the request and response. @@ -158,6 +158,7 @@ public static ICompressor GetCompressor(ServiceContext serviceContext, bool isRe /// /// The serivce context object. /// Returns value which specifies the request response logging mechanism. + [Obsolete("Use IppConfiguration.AdvangedLogger")] public static Rest.LogRequestsToDisk GetRequestLogging(ServiceContext serviceContext) { Rest.LogRequestsToDisk requestLogger; @@ -179,13 +180,19 @@ public static Rest.LogRequestsToDisk GetRequestLogging(ServiceContext serviceCon /// - /// Gets the Request Response Logging mechanism for advanced logging using serilog. + /// Gets the Request Response Logging mechanism for advanced logging. /// /// The serivce context object. /// Returns value which specifies the request response logging mechanism. - public static Diagnostics.AdvancedLogging GetAdvancedLogging(ServiceContext serviceContext) + public static Diagnostics.IAdvancedLogger GetAdvancedLogging(ServiceContext serviceContext) { - Diagnostics.AdvancedLogging requestLogger; + var requestLogger = serviceContext.IppConfiguration?.AdvancedLogger?.Logger; + if (requestLogger != null) + { + return requestLogger; + } + +#pragma warning disable CS0618 // Type or member is obsolete if (serviceContext.IppConfiguration != null && serviceContext.IppConfiguration.AdvancedLogger != null && serviceContext.IppConfiguration.AdvancedLogger.RequestAdvancedLog != null) @@ -210,6 +217,9 @@ public static Diagnostics.AdvancedLogging GetAdvancedLogging(ServiceContext serv { requestLogger = new Diagnostics.AdvancedLogging(enableSerilogRequestResponseLoggingForDebug: true, enableSerilogRequestResponseLoggingForTrace: true, enableSerilogRequestResponseLoggingForConsole: true, enableSerilogRequestResponseLoggingForFile: false, serviceRequestLoggingLocationForFile: null); } +#pragma warning restore CS0618 // Type or member is obsolete + + requestLogger.Log("Advanced Logging with Serilog is deprecated."); return requestLogger; } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/AsyncRestHandler.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/AsyncRestHandler.cs index 14e2a439..56fb2230 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/AsyncRestHandler.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/AsyncRestHandler.cs @@ -221,8 +221,11 @@ private void ExecAsyncRequestWithRetryPolicy(HttpWebRequest asyncRequest) CoreHelper.AdvancedLogging.Log(allHeaders.GetKey(i) + "-" + allHeaders[i]); } +#pragma warning disable CS0618 // Type or member is obsolete // Log Request Body to a file this.RequestLogging.LogPlatformRequests(" RequestUrl: " + request.RequestUri + ", Request Payload: " + this.requestBody, true); +#pragma warning restore CS0618 // Type or member is obsolete + // Log Request Body to Serilog CoreHelper.AdvancedLogging.Log(" Request Payload: " + this.requestBody); @@ -448,8 +451,12 @@ private AsyncCallCompletedEventArgs CreateEventArgsForRequest(IAsyncResult async response_intuit_tid_header = response.Headers[i]; } } + +#pragma warning disable CS0618 // Type or member is obsolete // Log the response to Disk. this.RequestLogging.LogPlatformRequests(" Response Intuit_Tid header: " + response_intuit_tid_header + ", Response Payload: " + resultString, false); +#pragma warning restore CS0618 // Type or member is obsolete + // Log response to Serilog CoreHelper.AdvancedLogging.Log(" Response Intuit_Tid header: " + response_intuit_tid_header + ", Response Payload: " + resultString); @@ -577,8 +584,11 @@ private void GetRequestStreamCallback(IAsyncResult asynchronousResult) { HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; +#pragma warning disable CS0618 // Type or member is obsolete // Log Request Body to a file this.RequestLogging.LogPlatformRequests(" RequestUrl: " + request.RequestUri + ", Request Payload: " + this.requestBody, true); +#pragma warning restore CS0618 // Type or member is obsolete + // Log Request Body to Serilog CoreHelper.AdvancedLogging.Log(" RequestUrl: " + request.RequestUri + ", Request Payload: " + this.requestBody); UTF8Encoding encoding = new UTF8Encoding(); diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/FaultHandler.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/FaultHandler.cs index cb331fc2..257898c8 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/FaultHandler.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/FaultHandler.cs @@ -129,8 +129,11 @@ internal IdsException ParseResponseAndThrowException(WebException webException, response_intuit_tid_header = errorResponse.Headers[i]; } } + +#pragma warning disable CS0618 // Type or member is obsolete //Log errorstring to disk CoreHelper.GetRequestLogging(this.context).LogPlatformRequests(" Response Intuit_Tid header: " + response_intuit_tid_header + ", Response Payload: " + errorString, false); +#pragma warning restore CS0618 // Type or member is obsolete //Log errorstring to Serilog CoreHelper.AdvancedLogging.Log(" Response Intuit_Tid header: " + response_intuit_tid_header + ", Response Payload: " + errorString); diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/RestHandler.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/RestHandler.cs index db89f0dc..9a58f86d 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/RestHandler.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/RestHandler.cs @@ -62,7 +62,11 @@ protected RestHandler(ServiceContext context) this.ResponseCompressor = CoreHelper.GetCompressor(this.serviceContext, false); this.RequestSerializer = CoreHelper.GetSerializer(this.serviceContext, true); this.responseSerializer = CoreHelper.GetSerializer(this.serviceContext, false); + +#pragma warning disable CS0618 // Type or member is obsolete this.RequestLogging = CoreHelper.GetRequestLogging(this.serviceContext); +#pragma warning restore CS0618 // Type or member is obsolete + // this.AdvancedLogging = CoreHelper.GetAdvancedLogging(this.serviceContext); } @@ -97,6 +101,7 @@ protected RestHandler() /// /// Gets or sets Request Logging. /// + [Obsolete("Use CoreHelper.AdvangedLogging")] internal LogRequestsToDisk RequestLogging { get; set; } ///// @@ -264,9 +269,11 @@ public virtual System.Net.HttpWebRequest PrepareRequest(RequestParameters reques CoreHelper.AdvancedLogging.Log(allHeaders.GetKey(i) + "-" + allHeaders[i]); } - +#pragma warning disable CS0618 // Type or member is obsolete // Log Request Body to a file this.RequestLogging.LogPlatformRequests(" RequestUrl: " + requestEndpoint + ", Request Payload:" + requestXML.ToString(), true); +#pragma warning restore CS0618 // Type or member is obsolete + //Log to Serilog CoreHelper.AdvancedLogging.Log( "Request Payload:" + requestXML.ToString()); diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/SyncRestHandler.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/SyncRestHandler.cs index bde53b05..5b5d63f9 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/SyncRestHandler.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/RestCalls/SyncRestHandler.cs @@ -379,7 +379,11 @@ private string ParseResponse(HttpWebResponse httpWebResponse) response_intuit_tid_header = httpWebResponse.Headers[i]; } } + +#pragma warning disable CS0618 // Type or member is obsolete this.RequestLogging.LogPlatformRequests(" Response Intuit_Tid header: " + response_intuit_tid_header + ", Response Payload: " + response, false); +#pragma warning restore CS0618 // Type or member is obsolete + //Log to Serilog CoreHelper.AdvancedLogging.Log(" Response Intuit_Tid header: " + response_intuit_tid_header + ", Response Payload: " + response); diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Retry/IntuitRetryPolicy.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Retry/IntuitRetryPolicy.cs index bdae3570..00ee8bf7 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Retry/IntuitRetryPolicy.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Core/Retry/IntuitRetryPolicy.cs @@ -409,9 +409,11 @@ public void ExecuteAction(Action beginAction, Func(Func func) } } +#pragma warning disable CS0618 // Type or member is obsolete // Log the error string to disk. CoreHelper.GetRequestLogging(this.context).LogPlatformRequests(" Response Intuit_Tid header: " + response_intuit_tid_header + " Response Payload: " + errorString, false); +#pragma warning restore CS0618 // Type or member is obsolete + //Log to Serilog CoreHelper.AdvancedLogging.Log("Response Intuit_Tid header: " + response_intuit_tid_header + ", Response Payload: " + errorString); diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/AdvancedLogging.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/AdvancedLogging.cs index f60bff37..3658da8b 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/AdvancedLogging.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/AdvancedLogging.cs @@ -34,6 +34,7 @@ namespace Intuit.Ipp.Diagnostics /// /// Contains properties used to indicate whether request and response messages are to be logged. /// + [Obsolete("Use TraceLogger or a custom implementation.")] public class AdvancedLogging : IAdvancedLogger { /// @@ -41,16 +42,6 @@ public class AdvancedLogging : IAdvancedLogger /// private string serviceRequestLoggingLocationForFile; - /// - /// request Azure Document DB url. - /// - private Uri serviceRequestAzureDocumentDBUrl; - - /// - /// request Azure Document DB Secure Key - /// - private string serviceRequestAzureDocumentDBSecureKey; - /// /// request TTL-time to live for all logs /// diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/Interface/IAdvancedLogger.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/Interface/IAdvancedLogger.cs index bbf52c5b..3772c73a 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/Interface/IAdvancedLogger.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/Interface/IAdvancedLogger.cs @@ -31,4 +31,23 @@ public interface IAdvancedLogger /// The message to write. void Log(string messageToWrite); } + + /// + /// Null logger. + /// + public class NullAdvancedLogger : IAdvancedLogger + { + /// + /// Singleton instance of . + /// + public static readonly IAdvancedLogger Instance = new NullAdvancedLogger(); + + private NullAdvancedLogger() + { + } + + void IAdvancedLogger.Log(string messageToWrite) + { + } + } } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/Interface/ILogger.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/Interface/ILogger.cs index c7aa4ac4..666a82df 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/Interface/ILogger.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/Interface/ILogger.cs @@ -33,4 +33,23 @@ public interface ILogger /// The message to write. void Log(TraceLevel idsTraceLevel, string messageToWrite); } + + /// + /// Null logger. + /// + public class NullLogger : ILogger + { + /// + /// Singleton instance of . + /// + public static readonly ILogger Instance = new NullLogger(); + + private NullLogger() + { + } + + void ILogger.Log(TraceLevel idsTraceLevel, string messageToWrite) + { + } + } } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/TraceLogger.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/TraceLogger.cs index a4663c65..602c79ea 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/TraceLogger.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.Diagnostics/TraceLogger.cs @@ -29,7 +29,7 @@ namespace Intuit.Ipp.Diagnostics /// /// Logs trace messages using System.Diagnostics. /// - public class TraceLogger : ILogger + public class TraceLogger : ILogger, IAdvancedLogger { /// /// Provides a multilevel switch to control tracing. @@ -85,5 +85,10 @@ public void Log(TraceLevel idsTraceLevel, string messageToWrite) break; } } + + void IAdvancedLogger.Log(string messageToWrite) + { + Log(TraceLevel.Verbose, messageToWrite); + } } } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.GlobalTaxServiceTest/GlobalTaxServiceTest.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.GlobalTaxServiceTest/GlobalTaxServiceTest.cs index 3db9ef9c..ba01175e 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.GlobalTaxServiceTest/GlobalTaxServiceTest.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.GlobalTaxServiceTest/GlobalTaxServiceTest.cs @@ -48,9 +48,10 @@ public TestContext TestContext public static void MyClassInitialize(TestContext testContext) { context = Initializer.InitializeServiceContextQbo(); +#pragma warning disable CS0618 // Type or member is obsolete context.IppConfiguration.Logger.RequestLog.EnableRequestResponseLogging = true; context.IppConfiguration.Logger.RequestLog.ServiceRequestLoggingLocation = @"c:\\Logs"; - +#pragma warning restore CS0618 // Type or member is obsolete } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/IOAuthAdvancedLogger.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/IOAuthAdvancedLogger.cs index cdaff466..34144294 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/IOAuthAdvancedLogger.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/IOAuthAdvancedLogger.cs @@ -20,6 +20,7 @@ namespace Intuit.Ipp.OAuth2PlatformClient.Diagnostics { + [System.Obsolete("Use IOAuthLogger.")] public interface IOAuthAdvancedLogger { /// diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/IOAuthLogger.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/IOAuthLogger.cs new file mode 100644 index 00000000..afd95d7b --- /dev/null +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/IOAuthLogger.cs @@ -0,0 +1,112 @@ +////********************************************************* +// +/******************************************************************************* + * Copyright 2016 Intuit + * + * 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. + *******************************************************************************/ +// This file contains an interface for Logging. +////********************************************************* + +using System.Diagnostics; +using System.Net.Http; + +namespace Intuit.Ipp.OAuth2PlatformClient.Diagnostics +{ + /// + /// Logger for OAuth requests and responses. + /// + public interface IOAuthLogger + { + /// + /// Log a simple message. + /// + /// The message. + void Log(string message); + + /// + /// Log HTTP request path and headers. + /// + /// The that will send the request, which might specify . + /// The . + void LogRequest(HttpClient httpClient, HttpRequestMessage request); + + /// + /// Determines if the request body should be read and logged. + /// + /// if the body should be logged. + bool ShouldLogRequestBody(); + + /// + /// Log HTTP request body. + /// + /// The request body. + void LogRequestBody(string body); + + /// + /// Log HTTP response. + /// + /// The HTTP response. + /// The intuit_tid header value. + /// A log message. + /// The response body. + void LogResponse(HttpResponseMessage response, string intuit_tid = null, string message = null, string body = null); + + /// + /// Log HTTP response error. + /// + /// The HTTP response. + /// Details about the error. + void LogResponseError(HttpResponseMessage response, string errorDetail = null); + } + + /// + /// Null logger. + /// + public class NullOAuthLogger : IOAuthLogger + { + /// + /// Singleton instance of . + /// + public static readonly IOAuthLogger Instance = new NullOAuthLogger(); + + private NullOAuthLogger() + { + } + + void IOAuthLogger.Log(string messageToWrite) + { + } + + void IOAuthLogger.LogRequest(HttpClient httpClient, HttpRequestMessage request) + { + } + + bool IOAuthLogger.ShouldLogRequestBody() + { + return false; + } + + void IOAuthLogger.LogRequestBody(string body) + { + } + + void IOAuthLogger.LogResponse(HttpResponseMessage response, string intuit_tid, string message, string body) + { + } + + void IOAuthLogger.LogResponseError(HttpResponseMessage response, string errorDetail) + { + } + } +} diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/LogHelper.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/LogHelper.cs index 7feaa7e1..82ee6532 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/LogHelper.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/LogHelper.cs @@ -23,6 +23,7 @@ namespace Intuit.Ipp.OAuth2PlatformClient.Diagnostics /// /// Helper class for advanced logger/serilogger /// + [System.Obsolete("Use Logger with TraceLogger or a custom implementation.")] public static class LogHelper { /// diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/OAuthAdvancedLogging.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/OAuthAdvancedLogging.cs index 76b0f69c..5979dba8 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/OAuthAdvancedLogging.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient.Diagnostics/OAuthAdvancedLogging.cs @@ -27,11 +27,13 @@ namespace Intuit.Ipp.OAuth2PlatformClient.Diagnostics using Serilog.Core; using Serilog.Events; using System.Globalization; + using System.Net.Http; /// /// Contains properties used to indicate whether request and response messages are to be logged. /// - public class OAuthAdvancedLogging : IOAuthAdvancedLogger + [Obsolete("Serilog configuration for Advanced Logging deprecated.")] + public class OAuthAdvancedLogging : IOAuthAdvancedLogger, IOAuthLogger { /// /// request logging location. @@ -237,13 +239,57 @@ public OAuthAdvancedLogging(bool enableSerilogRequestResponseLoggingForDebug, bo } + /// + /// Should response body be logged? + /// + public bool ShowInfoLogs { get; set; } + /// /// Logging message from SDK /// /// public void Log(string messageToWrite) { - logger.Write(LogEventLevel.Verbose, messageToWrite); + logger.Write(LogEventLevel.Information, messageToWrite); + } + + void IOAuthLogger.LogRequest(HttpClient httpClient, HttpRequestMessage request) + { + logger.Write(LogEventLevel.Information, "Request url- " + request.RequestUri); + logger.Write(LogEventLevel.Debug, "Request headers- "); + var authorization = request.Headers.Authorization ?? httpClient.DefaultRequestHeaders.Authorization; + logger.Write(LogEventLevel.Debug, "Authorization Header: " + authorization); + logger.Write(LogEventLevel.Debug, "ContentType header: " + request.Content.Headers.ContentType); + var accept = request.Headers.Accept ?? httpClient.DefaultRequestHeaders.Accept; + logger.Write(LogEventLevel.Debug, "Accept header: " + accept); + } + + bool IOAuthLogger.ShouldLogRequestBody() + { + return logger.IsEnabled(LogEventLevel.Verbose); + } + + void IOAuthLogger.LogRequestBody(string body) + { + logger.Write(LogEventLevel.Verbose, "Request Body: " + body); + } + + void IOAuthLogger.LogResponse(HttpResponseMessage response, string intuit_tid, string message, string body) + { + logger.Write(LogEventLevel.Information, + "Response Intuit_Tid header - " + intuit_tid + ", Response Status Code- " + response.StatusCode + + message == null ? "" : ", " + message); + + if (body != null && !ShowInfoLogs && logger.IsEnabled(LogEventLevel.Debug)) + { + logger.Write(LogEventLevel.Debug, "Response Body- " + body); + } + } + + void IOAuthLogger.LogResponseError(HttpResponseMessage response, string errorDetail) + { + logger.Write(LogEventLevel.Warning, "Response: Status Code- " + response.StatusCode); + logger.Write(LogEventLevel.Information, "Response: Error Details- " + response.ReasonPhrase + ": " + errorDetail); } } } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/OAuth2Client.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/OAuth2Client.cs index c0b2a71a..b99ec406 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/OAuth2Client.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/OAuth2Client.cs @@ -6,20 +6,13 @@ using Newtonsoft.Json; using System; using System.Collections.Generic; -using System.Net.Http; -using System.Net.Http.Headers; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Threading; using System.Net; -using System.Reflection; -using System.Linq; using System.IO; -using System.Globalization; -using Serilog; using Intuit.Ipp.OAuth2PlatformClient.Diagnostics; -using Serilog; namespace Intuit.Ipp.OAuth2PlatformClient { /// @@ -30,72 +23,54 @@ public class OAuth2Client /// /// Advanced Logger for OAuth2 calls /// + [Obsolete("Use Logger.")] public static OAuthAdvancedLogging AdvancedLogger; /// /// Enable extra field to check if new OAuth2Client is used for OAuth calls and Advanced logging /// + [Obsolete("Use Logger.")] internal static bool AdvancedLoggerEnabled = false; - /// - /// Internal field to check if OAuth2Client is used for OAuth calls to enable on intuit-tid based logs, no verbose logs will be enabled if this is true - /// - internal static bool ShowInfoLogs = false; - /// /// Enable extra field to check if OAuth2Client is used for OAuth calls to enable on intuit-tid based logs, no verbose logs will be enabled if this is true /// + [Obsolete("Use Logger.")] public bool EnableAdvancedLoggerInfoMode { get; set; } = false; - - /// /// request logging location. /// private string serviceRequestLoggingLocationForFile; - /// - /// request Azure Document DB url. - /// - private Uri serviceRequestAzureDocumentDBUrl; - - /// - /// request Azure Document DB Secure Key - /// - private string serviceRequestAzureDocumentDBSecureKey; - - ///// - ///// request TTL-time to live for all logs - ///// - //public double ServiceRequestAzureDocumentDBTTL { get; set; } - /// /// Gets or sets a value indicating whether to enable reqeust response logging for Debug logs. /// + [Obsolete("Serilog configuration for Advanced Logging deprecated.")] public bool EnableSerilogRequestResponseLoggingForDebug { get; set; } - /// /// Gets or sets a value indicating whether to enable reqeust response logging for Trace logs. /// + [Obsolete("Serilog configuration for Advanced Logging deprecated.")] public bool EnableSerilogRequestResponseLoggingForTrace { get; set; } - /// /// Gets or sets a value indicating whether to enable reqeust response logging for Console logs. /// + [Obsolete("Serilog configuration for Advanced Logging deprecated.")] public bool EnableSerilogRequestResponseLoggingForConsole { get; set; } - ///// ///// Gets or sets a value indicating whether to enable reqeust response logging for file logs. ///// + [Obsolete("Serilog configuration for Advanced Logging deprecated.")] public bool EnableSerilogRequestResponseLoggingForFile { get; set; } - /// /// Gets or sets the service request logging location for File. /// + [Obsolete("Serilog configuration for Advanced Logging deprecated.")] public string ServiceRequestLoggingLocationForFile { get @@ -155,8 +130,55 @@ public string ServiceRequestLoggingLocationForFile /// /// CustomLogger /// + [Obsolete("Use Logger with a custom implementation.")] public Serilog.ILogger CustomLogger { get; set; } +#pragma warning disable CS0618 // Type or member is obsolete + + private OAuthAdvancedLogging InitializeAdvancedLogger() + { + AdvancedLoggerEnabled = true; + + OAuthAdvancedLogging logger; + if (this.CustomLogger != null) + { + //Use custom logger + logger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); + } + else + { + //Intialize Logger + logger = LogHelper.GetAdvancedLogging( + enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, + enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, + enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, + enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, + serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); + } + + //Set internal property to track only informational -intuit_tid based logs + if (EnableAdvancedLoggerInfoMode == true) + { + logger.ShowInfoLogs = true; + } + + AdvancedLogger = logger; + return logger; + } + +#pragma warning restore CS0618 // Type or member is obsolete + + private IOAuthLogger logger; + + /// + /// Logger for OAuth requests and responses. + /// Defaults to configured from properties on this client. + /// + public IOAuthLogger Logger + { + get => logger ?? InitializeAdvancedLogger(); + set => logger = value; + } /// /// OAuth2Client constructor @@ -270,26 +292,7 @@ public string GetAuthorizationURL(List scopes, string CSRFToken) { throw new System.Exception("Discovery Call failed. Authorize Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - } string scopeValue = ""; for (var index = 0; index < scopes.Count; index++) { @@ -307,7 +310,7 @@ public string GetAuthorizationURL(List scopes, string CSRFToken) CSRFToken); //Logging authorization request - AdvancedLogger.Log("Logging AuthorizationRequest:" + authorizationRequest); + Logger.Log("Logging AuthorizationRequest:" + authorizationRequest); return authorizationRequest; } @@ -325,25 +328,6 @@ public string GetAuthorizationURL(List scopes, string CSRFToken) { throw new System.Exception("Discovery Call failed. Authorize Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - } string scopeValue = ""; for (var index = 0; index < scopes.Count; index++) @@ -362,7 +346,7 @@ public string GetAuthorizationURL(List scopes, string CSRFToken) CSRFToken); //Logging authorization request - AdvancedLogger.Log("Logging AuthorizationRequest:" + authorizationRequest); + Logger.Log("Logging AuthorizationRequest:" + authorizationRequest); return authorizationRequest; } @@ -379,28 +363,6 @@ public string GetAuthorizationURL(List scopes) throw new System.Exception("Discovery Call failed. Authorize Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - } - - - string scopeValue = ""; for (var index = 0; index < scopes.Count; index++) { @@ -420,7 +382,7 @@ public string GetAuthorizationURL(List scopes) CSRFToken); //Logging authorization request - AdvancedLogger.Log("Logging AuthorizationRequest:" + authorizationRequest); + Logger.Log("Logging AuthorizationRequest:" + authorizationRequest); return authorizationRequest; } @@ -553,30 +515,10 @@ public string GetAuthorizationURL(List scopes) { if (string.IsNullOrEmpty(DiscoveryDoc.TokenEndpoint)) { - AdvancedLogger.Log("Discovery Call failed.BearerToken Endpoint is empty."); + Logger.Log("Discovery Call failed.BearerToken Endpoint is empty."); return new TokenResponse(HttpStatusCode.InternalServerError, "Discovery Call failed. BearerToken Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - - } - var tokenClient = new TokenClient(DiscoveryDoc.TokenEndpoint, ClientID, ClientSecret); return await tokenClient.RequestTokenFromCodeAsync(code, RedirectURI, cancellationToken: cancellationToken).ConfigureAwait(false); } @@ -593,31 +535,10 @@ public string GetAuthorizationURL(List scopes) { if (string.IsNullOrEmpty(tokenEndpoint)) { - AdvancedLogger.Log("BearerToken Endpoint is empty."); + Logger.Log("BearerToken Endpoint is empty."); return new TokenResponse(HttpStatusCode.InternalServerError, "BearerToken Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - - } - var tokenClient = new TokenClient(tokenEndpoint, ClientID, ClientSecret); return await tokenClient.RequestTokenFromCodeAsync(code, RedirectURI, cancellationToken: cancellationToken).ConfigureAwait(false); } @@ -633,30 +554,10 @@ public string GetAuthorizationURL(List scopes) { if (string.IsNullOrEmpty(DiscoveryDoc.TokenEndpoint)) { - AdvancedLogger.Log("Discovery Call failed. RefreshToken Endpoint is empty."); + Logger.Log("Discovery Call failed. RefreshToken Endpoint is empty."); return new TokenResponse(HttpStatusCode.InternalServerError, "Discovery Call failed. RefreshToken Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - } - var tokenClient = new TokenClient(DiscoveryDoc.TokenEndpoint, ClientID, ClientSecret); return await tokenClient.RequestRefreshTokenAsync(refreshToken, cancellationToken).ConfigureAwait(false); } @@ -673,30 +574,10 @@ public string GetAuthorizationURL(List scopes) { if (string.IsNullOrEmpty(tokenEndpoint)) { - AdvancedLogger.Log("RefreshToken Endpoint is empty."); + Logger.Log("RefreshToken Endpoint is empty."); return new TokenResponse(HttpStatusCode.InternalServerError, "RefreshToken Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - } - var tokenClient = new TokenClient(tokenEndpoint, ClientID, ClientSecret); return await tokenClient.RequestRefreshTokenAsync(refreshToken, cancellationToken).ConfigureAwait(false); } @@ -711,31 +592,10 @@ public string GetAuthorizationURL(List scopes) { if (string.IsNullOrEmpty(DiscoveryDoc.RevocationEndpoint)) { - AdvancedLogger.Log("Discovery Call failed. RevokeToken Endpoint is empty."); + Logger.Log("Discovery Call failed. RevokeToken Endpoint is empty."); return new TokenRevocationResponse(HttpStatusCode.InternalServerError, "Discovery Call failed. RevokeToken Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - } - - TokenRevocationClient revokeTokenClient = new TokenRevocationClient(DiscoveryDoc.RevocationEndpoint, ClientID, ClientSecret); return await revokeTokenClient.RevokeAsync(new TokenRevocationRequest { @@ -754,31 +614,10 @@ public string GetAuthorizationURL(List scopes) { if (string.IsNullOrEmpty(revokeTokenEndpoint)) { - AdvancedLogger.Log("Revoke Token Endpoint is empty."); + Logger.Log("Revoke Token Endpoint is empty."); return new TokenRevocationResponse(HttpStatusCode.InternalServerError, "Revoke Token Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - - } - TokenRevocationClient revokeTokenClient = new TokenRevocationClient(revokeTokenEndpoint, ClientID, ClientSecret); return await revokeTokenClient.RevokeAsync(new TokenRevocationRequest { @@ -796,31 +635,10 @@ public string GetAuthorizationURL(List scopes) { if (string.IsNullOrEmpty(DiscoveryDoc.UserInfoEndpoint)) { - AdvancedLogger.Log("Discovery Call failed. UserInfo Endpoint is empty."); + Logger.Log("Discovery Call failed. UserInfo Endpoint is empty."); return new UserInfoResponse(HttpStatusCode.InternalServerError, "Discovery Call failed. UserInfo Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - - } - UserInfoClient userInfoClient = new UserInfoClient(DiscoveryDoc.UserInfoEndpoint); return await userInfoClient.GetAsync(accessToken, cancellationToken).ConfigureAwait(false); } @@ -836,31 +654,10 @@ public string GetAuthorizationURL(List scopes) { if (string.IsNullOrEmpty(userInfoEndpoint)) { - AdvancedLogger.Log("UserInfo Endpoint is empty."); + Logger.Log("UserInfo Endpoint is empty."); return new UserInfoResponse(HttpStatusCode.InternalServerError, "UserInfo Endpoint is empty."); } - AdvancedLoggerEnabled = true; - //Set internal property to track only informational -intuit_tid based logs - if (EnableAdvancedLoggerInfoMode == true) - { - ShowInfoLogs = true; - } - - if (this.CustomLogger != null) - { - //Use custom logger - AdvancedLogger = LogHelper.GetAdvancedLoggingCustom(this.CustomLogger); - - - } - else - { - //Intialize Logger - AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: this.EnableSerilogRequestResponseLoggingForDebug, enableSerilogRequestResponseLoggingForTrace: this.EnableSerilogRequestResponseLoggingForTrace, enableSerilogRequestResponseLoggingForConsole: this.EnableSerilogRequestResponseLoggingForConsole, enableSerilogRequestResponseLoggingForFile: this.EnableSerilogRequestResponseLoggingForFile, serviceRequestLoggingLocationForFile: this.ServiceRequestLoggingLocationForFile); - } - - UserInfoClient userInfoClient = new UserInfoClient(userInfoEndpoint); return await userInfoClient.GetAsync(accessToken, cancellationToken).ConfigureAwait(false); } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenClient.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenClient.cs index a209bfd6..b6136d32 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenClient.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenClient.cs @@ -46,12 +46,6 @@ public TokenClient(string endpoint) /// innerHttpMessageHandler public TokenClient(string endpoint, HttpMessageHandler innerHttpMessageHandler) { - if (OAuth2Client.AdvancedLoggerEnabled == false) - { - //Intialize Logger - OAuth2Client.AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: false, enableSerilogRequestResponseLoggingForTrace: false, enableSerilogRequestResponseLoggingForConsole: false, enableSerilogRequestResponseLoggingForFile: false, serviceRequestLoggingLocationForFile: System.IO.Path.GetTempPath()); - } - if (endpoint == null) throw new ArgumentNullException(nameof(endpoint)); if (innerHttpMessageHandler == null) throw new ArgumentNullException(nameof(innerHttpMessageHandler)); @@ -114,6 +108,18 @@ public TokenClient(string endpoint, string clientId, string clientSecret, HttpMe /// public AuthenticationStyle AuthenticationStyle { get; set; } + private IOAuthLogger logger; + + /// + /// Logger for OAuth requests and responses. + /// Defaults to . + /// + public IOAuthLogger Logger + { + get => logger ?? NullOAuthLogger.Instance; + set => logger = value; + } + /// /// TimeOut /// @@ -145,15 +151,13 @@ public TimeSpan Timeout request.Content.Headers.ContentType = new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); } - if (OAuth2Client.AdvancedLoggerEnabled != false) + + Logger.LogRequest(Client, request); + if (Logger.ShouldLogRequestBody()) { - OAuth2Client.AdvancedLogger.Log("Request url- " + Address); - OAuth2Client.AdvancedLogger.Log("Request headers- "); - OAuth2Client.AdvancedLogger.Log("Authorization Header: " + request.Headers.Authorization.ToString()); - OAuth2Client.AdvancedLogger.Log("ContentType header: " + request.Content.Headers.ContentType.ToString()); - OAuth2Client.AdvancedLogger.Log("Accept header: " + "application/json"); - OAuth2Client.AdvancedLogger.Log("Request Body: " + await request.Content.ReadAsStringAsync().ConfigureAwait(false)); + Logger.LogRequestBody(await request.Content.ReadAsStringAsync().ConfigureAwait(false)); } + try { response = await Client.SendAsync(request, cancellationToken).ConfigureAwait(false); @@ -175,13 +179,7 @@ public TimeSpan Timeout } var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);//errorDetail can be added here if required for BadRequest. - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response Status Code- " + response.StatusCode); - else - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response Status Code- " + response.StatusCode + ", Response Body- " + content); - } + Logger.LogResponse(response, intuit_tid, body: content); return new TokenResponse(content); } else @@ -195,26 +193,12 @@ public TimeSpan Timeout if (errorDetail != null && errorDetail != "") { - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode); - else - OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase + ": " + errorDetail); - - } + Logger.LogResponseError(response, errorDetail); return new TokenResponse(response.StatusCode, response.ReasonPhrase + ": " + errorDetail); } else { - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode); - else - OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase); - - } + Logger.LogResponseError(response); return new TokenResponse(response.StatusCode, response.ReasonPhrase); } } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenClientExtensions.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenClientExtensions.cs index b3332c8a..1c4ad2f5 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenClientExtensions.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenClientExtensions.cs @@ -28,10 +28,7 @@ public static class TokenClientExtensions /// task of TokenResponse public static Task RequestTokenFromCodeAsync(this TokenClient client, string code, string redirectUri, string codeVerifier = null, object extra = null, CancellationToken cancellationToken = default(CancellationToken)) { - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - OAuth2Client.AdvancedLogger.Log("Access/Bearer token request initiated"); - } + client.Logger.Log("Access/Bearer token request initiated"); var fields = new Dictionary { { OidcConstants.TokenRequest.GrantType, OidcConstants.GrantTypes.AuthorizationCode }, @@ -55,10 +52,7 @@ public static class TokenClientExtensions /// task of TokenResponse public static Task RequestRefreshTokenAsync(this TokenClient client, string refreshToken, object extra = null, CancellationToken cancellationToken = default(CancellationToken)) { - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - OAuth2Client.AdvancedLogger.Log("Refresh token request initiated"); - } + client.Logger.Log("Refresh token request initiated"); var fields = new Dictionary { { OidcConstants.TokenRequest.GrantType, OidcConstants.GrantTypes.RefreshToken }, diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenRevocationClient.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenRevocationClient.cs index c22f1b6b..a1eb0ad1 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenRevocationClient.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenRevocationClient.cs @@ -65,12 +65,6 @@ public class TokenRevocationClient : IDisposable /// innerHttpMessageHandler public TokenRevocationClient(string endpoint, string clientId = "", string clientSecret = "", HttpMessageHandler innerHttpMessageHandler = null) { - if (OAuth2Client.AdvancedLoggerEnabled == false) - { - //Intialize Logger - OAuth2Client.AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: false, enableSerilogRequestResponseLoggingForTrace: false, enableSerilogRequestResponseLoggingForConsole: false, enableSerilogRequestResponseLoggingForFile: false, serviceRequestLoggingLocationForFile: System.IO.Path.GetTempPath()); - } - if (endpoint == null) throw new ArgumentNullException(nameof(endpoint)); if (innerHttpMessageHandler == null) innerHttpMessageHandler = new HttpClientHandler(); @@ -91,6 +85,18 @@ public TokenRevocationClient(string endpoint, string clientId = "", string clien Address = endpoint; } + private IOAuthLogger logger; + + /// + /// Logger for OAuth requests and responses. + /// Defaults to . + /// + public IOAuthLogger Logger + { + get => logger ?? NullOAuthLogger.Instance; + set => logger = value; + } + /// /// Timeout /// @@ -124,19 +130,15 @@ public virtual async Task RevokeAsync( msgRequest.Content = stringContent; - if (OAuth2Client.AdvancedLoggerEnabled != false) + Logger.LogRequest(Client, msgRequest); + if (Logger.ShouldLogRequestBody()) { - OAuth2Client.AdvancedLogger.Log("Request url- " + Address); - OAuth2Client.AdvancedLogger.Log("Request headers- "); - OAuth2Client.AdvancedLogger.Log("Authorization Header: " + Client.DefaultRequestHeaders.Authorization.ToString());//check - OAuth2Client.AdvancedLogger.Log("ContentType header: " + "application/json"); - OAuth2Client.AdvancedLogger.Log("Accept header: " + "application/json"); - OAuth2Client.AdvancedLogger.Log("Request Body: " + await msgRequest.Content.ReadAsStringAsync().ConfigureAwait(false)); + Logger.LogRequestBody(await msgRequest.Content.ReadAsStringAsync().ConfigureAwait(false)); } try { - var response = await Client.PostAsync("", msgRequest.Content).ConfigureAwait(false); + var response = await Client.SendAsync(msgRequest).ConfigureAwait(false); HttpResponseHeaders headers = response.Headers; @@ -153,13 +155,7 @@ public virtual async Task RevokeAsync( intuit_tid = "None"; } - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response Status Code- " + response.StatusCode + ", Token Revoked successfully"); - else - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response Status Code- " + response.StatusCode + ", Token Revoked successfully"); - } + Logger.LogResponse(response, intuit_tid, message: "Token Revoked successfully"); return new TokenRevocationResponse(); } else if (response.StatusCode == HttpStatusCode.BadRequest) @@ -176,13 +172,7 @@ public virtual async Task RevokeAsync( } var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response Status Code- " + response.StatusCode); - else - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response Status Code- " + response.StatusCode + ", Response Body- " + content); - } + Logger.LogResponse(response, intuit_tid, body: content); return new TokenRevocationResponse(content); //errorDetail can be added here if required. } else @@ -197,24 +187,12 @@ public virtual async Task RevokeAsync( if (errorDetail != null && errorDetail != "") { - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode); - else - OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase + ": " + errorDetail); - } + Logger.LogResponse(response, errorDetail); return new TokenRevocationResponse(response.StatusCode, response.ReasonPhrase + ": " + errorDetail); } else { - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode); - else - OAuth2Client.AdvancedLogger.Log("Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase + ": " + errorDetail); - } + Logger.LogResponse(response); return new TokenRevocationResponse(response.StatusCode, response.ReasonPhrase); } } diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenRevocationClientExtensions.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenRevocationClientExtensions.cs index 58885250..135e9000 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenRevocationClientExtensions.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/TokenRevocationClientExtensions.cs @@ -21,7 +21,7 @@ public static class TokenRevocationClientExtensions /// Task of TokenRevocationResponse public static Task RevokeAccessTokenAsync(this TokenRevocationClient client, string token, CancellationToken cancellationToken = default(CancellationToken)) { - OAuth2Client.AdvancedLogger.Log("Revoke Access token request initiated"); + client.Logger.Log("Revoke Access token request initiated"); return client.RevokeAsync(new TokenRevocationRequest { Token = token, @@ -37,7 +37,7 @@ public static class TokenRevocationClientExtensions /// Task of TokenRevocationResponse public static Task RevokeRefreshTokenAsync(this TokenRevocationClient client, string token, CancellationToken cancellationToken = default(CancellationToken)) { - OAuth2Client.AdvancedLogger.Log("Revoke Refresh token request initiated"); + client.Logger.Log("Revoke Refresh token request initiated"); return client.RevokeAsync(new TokenRevocationRequest { Token = token, diff --git a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/UserInfoClient.cs b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/UserInfoClient.cs index 31e74548..3c4f2f63 100644 --- a/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/UserInfoClient.cs +++ b/IPPDotNetDevKitCSV3/Code/Intuit.Ipp.OAuth2PlatformClient/Client/UserInfoClient.cs @@ -36,12 +36,6 @@ public UserInfoClient(string endpoint) /// innerHttpMessageHandler public UserInfoClient(string endpoint, HttpMessageHandler innerHttpMessageHandler) { - if (OAuth2Client.AdvancedLoggerEnabled == false) - { - //Intialize Logger - OAuth2Client.AdvancedLogger = LogHelper.GetAdvancedLogging(enableSerilogRequestResponseLoggingForDebug: false, enableSerilogRequestResponseLoggingForTrace: false, enableSerilogRequestResponseLoggingForConsole: false, enableSerilogRequestResponseLoggingForFile: false, serviceRequestLoggingLocationForFile: System.IO.Path.GetTempPath()); - } - if (endpoint == null) throw new ArgumentNullException(nameof(endpoint)); if (innerHttpMessageHandler == null) throw new ArgumentNullException(nameof(innerHttpMessageHandler)); @@ -54,12 +48,18 @@ public UserInfoClient(string endpoint, HttpMessageHandler innerHttpMessageHandle _client.DefaultRequestHeaders.Accept.Add( new MediaTypeWithQualityHeaderValue("application/json")); _client.DefaultRequestHeaders.Add("Connection", "close"); + } - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - OAuth2Client.AdvancedLogger.Log("UserInfo request initiated"); - OAuth2Client.AdvancedLogger.Log("Request url- " + endpoint); - } + private IOAuthLogger logger; + + /// + /// Logger for OAuth requests and responses. + /// Defaults to . + /// + public IOAuthLogger Logger + { + get => logger ?? NullOAuthLogger.Instance; + set => logger = value; } /// @@ -90,15 +90,12 @@ public TimeSpan Timeout request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); - if (OAuth2Client.AdvancedLoggerEnabled != false) + Logger.LogRequest(_client, request); + if (Logger.ShouldLogRequestBody()) { - OAuth2Client.AdvancedLogger.Log("Request headers- "); - OAuth2Client.AdvancedLogger.Log("Authorization Header: " + request.Headers.Authorization.ToString()); - - OAuth2Client.AdvancedLogger.Log("Accept header: " + "application/json"); + Logger.LogRequestBody(await request.Content.ReadAsStringAsync().ConfigureAwait(false)); } - HttpResponseMessage response; try { @@ -131,40 +128,19 @@ public TimeSpan Timeout if (errorDetail != null && errorDetail != "") { - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response: Status Code- " + response.StatusCode); - else - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase + ": " + errorDetail); - - } + Logger.LogResponseError(response, errorDetail); return new UserInfoResponse(response.StatusCode, response.ReasonPhrase + ": " + errorDetail); } else { - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response: Status Code- " + response.StatusCode); - else - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response: Status Code- " + response.StatusCode + ", Error Details- " + response.ReasonPhrase); - - } + Logger.LogResponseError(response); return new UserInfoResponse(response.StatusCode, response.ReasonPhrase); } } var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false); - if (OAuth2Client.AdvancedLoggerEnabled != false) - { - if (OAuth2Client.ShowInfoLogs == true)//log just intuit_tid for info logging mode - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response Status Code- " + response.StatusCode); - else - OAuth2Client.AdvancedLogger.Log("Response Intuit_Tid header - " + intuit_tid + ", Response Status Code- " + response.StatusCode + ", Response Body- " + content); - } + Logger.LogResponse(response, intuit_tid, body: content); return new UserInfoResponse(content); } catch (System.Exception ex) diff --git a/README.md b/README.md index 3c1cdabd..db17a7f2 100644 --- a/README.md +++ b/README.md @@ -90,49 +90,55 @@ The code has been divided into following main categories- ## Enabling logs for the SDK -Logs help you in easliy identifying detailed issues with your payload, get more info in the exception details for fixing them. -* New logging support was added to the SDK which includes support for reporting headers and multiple logging sinks available from Serilog. You can chooise to have either one or more of these logging sinks enabled. - -Serilogger logs can be enabled for **OAuth2PlatformClient** using the following lines - - - static OAuth2Client oauthClient = new OAuth2Client(clientID, clientSecret, redirectURI, appEnvironment); - //Use this line to enable only intuit-tid based logs, no tokens/response will be logged. - //If set to false, all detailed logs will be available for response - //If set to true, only intuit-tid response headers will be available - - // This will work with both custom logger or already supported serilog logger sinks in the SDK - oauthClient.EnableAdvancedLoggerInfoMode = true; - - // Option for devs to use this for setting their own custom logger - //Adding support for custom logger where value can be an instance of Serilog.Core.ILogger - oauthClient.CustomLogger = ; - - //Already supported logger in the SDK. Either use custom logger or the below statements for serilog logs to work. - oauthClient.EnableSerilogRequestResponseLoggingForConsole = true; - oauthClient.EnableSerilogRequestResponseLoggingForDebug = true; - oauthClient.EnableSerilogRequestResponseLoggingForFile = true; - oauthClient.EnableSerilogRequestResponseLoggingForTrace = true; - oauthClient.ServiceRequestLoggingLocationForFile = @"C:\Documents\Serilog_log";//Any drive logging location - - -Serilogger logs can be enabled for **QBO API calls** using the following lines - - - ServiceContext context = new ServiceContext(dictionary["realmId"], IntuitServicesType.QBO, oauthValidator); - - //Adding support for custom logger where value can be an instance of Serilog.Core.ILogger - context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.CustomLogger = ; - - //Already supported logger in the SDK. Either use custom logger or the below statements for serilog logs to work. - context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.EnableSerilogRequestResponseLoggingForFile = true; - context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.EnableSerilogRequestResponseLoggingForConsole = true; - context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.EnableSerilogRequestResponseLoggingForTrace = true; - context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.EnableSerilogRequestResponseLoggingForDebug = true; - context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.ServiceRequestLoggingLocationForFile = @"C:\Documents\Serilog_log"; //Any drive logging location - -Old file based logs can be enabled by using the following lines- + +### Basic Logging + +Most logging uses `IppConfiguration.Logger`, which has two properties: +- `CustomLogger` allows providing an implementation of `Intuit.IppDiagnostics.ILogger` (default: `Intuit.Ipp.Diagnostics.TraceLogger`). +- `RequestLog` allows configuring basic file logging (default: disabled). **This will be removed in a future release.** + ```csharp + context.IppConfiguration.Logger.RequestLog.EnableRequestResponseLogging = true; + context.IppConfiguration.Logger.RequestLog.ServiceRequestLoggingLocation = @"C:\Documents\QuickBooksOnline_Log"; //Any drive logging location + ``` - context.IppConfiguration.Logger.RequestLog.EnableRequestResponseLogging = true; - context.IppConfiguration.Logger.RequestLog.ServiceRequestLoggingLocation = @"C:\Documents\Serilog_log"; //Any drive logging location - +### Advanced Logging + +Request/response logging uses `IppConfiguration.AdvancedLogger`, which has two properties: +- `Logger` allows providing an implementation of `Intuit.IppDiagnostics.IAdvancedLogger` (default: `Intuit.Ipp.Diagnostics.TraceLogger`). +- `RequestAdvancedLog` allows configuring logging with Serilog (default: disabled). **This will be removed in a future release.** + ```csharp + ServiceContext context = new ServiceContext(dictionary["realmId"], IntuitServicesType.QBO, oauthValidator); + + //Adding support for custom logger where value can be an instance of Serilog.Core.ILogger + context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.CustomLogger = ; + + //Already supported logger in the SDK. Either use custom logger or the below statements for serilog logs to work. + context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.EnableSerilogRequestResponseLoggingForFile = true; + context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.EnableSerilogRequestResponseLoggingForConsole = true; + context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.EnableSerilogRequestResponseLoggingForTrace = true; + context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.EnableSerilogRequestResponseLoggingForDebug = true; + context.IppConfiguration.AdvancedLogger.RequestAdvancedLog.ServiceRequestLoggingLocationForFile = @"C:\Documents\Serilog_log"; //Any drive logging location + ``` + +### OAuth Logging + +The clients in `Intuit.Ipp.OAuth2PlatformClient` have a `Logger` property that can be assigned with an implementation of `Intuit.Ipp.OAuth2PlatformClient.Diagnostics.IOAuthLogger`. +- `TokenClient`, `TokenRevocationClient` and `UserInfoClient` default to `NullOAuthLogger`. +- `OAuth2Client` defaults to `Intuit.Ipp.OAuth2PlatformClient.Diagnostics.OAuthAdvancedLogging` with similar Serilog configuration. **This will be removed in a future release.** + ```csharp + //Adding support for custom logger where value can be an instance of Serilog.Core.ILogger + oauthClient.CustomLogger = ; + + //Already supported logger in the SDK. Either use custom logger or the below statements for serilog logs to work. + oauthClient.EnableSerilogRequestResponseLoggingForConsole = true; + oauthClient.EnableSerilogRequestResponseLoggingForDebug = true; + oauthClient.EnableSerilogRequestResponseLoggingForFile = true; + oauthClient.EnableSerilogRequestResponseLoggingForTrace = true; + oauthClient.ServiceRequestLoggingLocationForFile = @"C:\Documents\Serilog_log";//Any drive logging location + ``` + +## Fiddler + * **Fiddler logs are really useful too. You can enable them by following the steps below** Download Fiddler from Google and run it alongside your code to log raw requests and responses along with URL and headers.