diff --git a/CryptoExchange.Net/Clients/BaseRestClient.cs b/CryptoExchange.Net/Clients/BaseRestClient.cs index bc5464b..7853c44 100644 --- a/CryptoExchange.Net/Clients/BaseRestClient.cs +++ b/CryptoExchange.Net/Clients/BaseRestClient.cs @@ -21,6 +21,8 @@ namespace CryptoExchange.Net.Clients protected BaseRestClient(ILoggerFactory? loggerFactory, string name) : base(loggerFactory, name) { _logger = loggerFactory?.CreateLogger(name + ".RestClient") ?? NullLoggerFactory.Instance.CreateLogger(name); + + LibraryHelpers.StaticLogger = loggerFactory?.CreateLogger(name); } } } diff --git a/CryptoExchange.Net/Clients/BaseSocketClient.cs b/CryptoExchange.Net/Clients/BaseSocketClient.cs index 38f34e7..27dbfbf 100644 --- a/CryptoExchange.Net/Clients/BaseSocketClient.cs +++ b/CryptoExchange.Net/Clients/BaseSocketClient.cs @@ -40,6 +40,8 @@ namespace CryptoExchange.Net.Clients protected BaseSocketClient(ILoggerFactory? loggerFactory, string name) : base(loggerFactory, name) { _logger = loggerFactory?.CreateLogger(name + ".SocketClient") ?? NullLoggerFactory.Instance.CreateLogger(name); + + LibraryHelpers.StaticLogger = loggerFactory?.CreateLogger(name); } /// diff --git a/CryptoExchange.Net/Converters/SystemTextJson/BoolConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/BoolConverter.cs index 9ada30b..deaf118 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/BoolConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/BoolConverter.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.Extensions.Logging; +using System; using System.Diagnostics; using System.Runtime.Serialization; using System.Text.Json; @@ -47,7 +48,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson if (string.IsNullOrEmpty(value)) { if (typeToConvert == typeof(bool)) - Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Received null bool value, but property type is not a nullable bool"); + LibraryHelpers.StaticLogger?.LogWarning("Received null bool value, but property type is not a nullable bool"); return default; } diff --git a/CryptoExchange.Net/Converters/SystemTextJson/DateTimeConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/DateTimeConverter.cs index 5180641..dff328e 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/DateTimeConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/DateTimeConverter.cs @@ -1,4 +1,5 @@ -using System; +using Microsoft.Extensions.Logging; +using System; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; using System.Globalization; @@ -39,7 +40,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson if (reader.TokenType == JsonTokenType.Null) { if (typeToConvert == typeof(DateTime)) - Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | DateTime value of null, but property is not nullable"); + LibraryHelpers.StaticLogger?.LogWarning("DateTime value of null, but property is not nullable"); return default; } @@ -124,7 +125,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson || !int.TryParse(stringValue.Substring(8, 2), out var hour) || !int.TryParse(stringValue.Substring(10, 2), out var minute)) { - Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Unknown DateTime format: " + stringValue); + LibraryHelpers.StaticLogger?.LogWarning("Unknown DateTime format: " + stringValue); return default; } return new DateTime(year, month, day, hour, minute, 0, DateTimeKind.Utc); @@ -137,7 +138,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson || !int.TryParse(stringValue.Substring(4, 2), out var month) || !int.TryParse(stringValue.Substring(6, 2), out var day)) { - Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Unknown DateTime format: " + stringValue); + LibraryHelpers.StaticLogger?.LogWarning("Unknown DateTime format: " + stringValue); return default; } return new DateTime(year, month, day, 0, 0, 0, DateTimeKind.Utc); @@ -150,7 +151,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson || !int.TryParse(stringValue.Substring(2, 2), out var month) || !int.TryParse(stringValue.Substring(4, 2), out var day)) { - Trace.WriteLine("{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Unknown DateTime format: " + stringValue); + LibraryHelpers.StaticLogger?.LogWarning("Unknown DateTime format: " + stringValue); return default; } return new DateTime(year + 2000, month, day, 0, 0, 0, DateTimeKind.Utc); @@ -179,7 +180,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson || !int.TryParse(values[1], out var month) || !int.TryParse(values[2], out var day)) { - Trace.WriteLine("{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Unknown DateTime format: " + stringValue); + LibraryHelpers.StaticLogger?.LogWarning("Unknown DateTime format: " + stringValue); return default; } diff --git a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs index 252e6ae..7eb4dcc 100644 --- a/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs +++ b/CryptoExchange.Net/Converters/SystemTextJson/EnumConverter.cs @@ -1,4 +1,6 @@ using CryptoExchange.Net.Attributes; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using System; using System.Collections.Concurrent; using System.Collections.Generic; @@ -79,7 +81,7 @@ namespace CryptoExchange.Net.Converters.SystemTextJson } public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - return _enumConverter.ReadNullable(ref reader, typeToConvert, options, out var isEmptyString, out var warn); + return _enumConverter.ReadNullable(ref reader, typeToConvert, options, out var isEmptyString); } public override void Write(Utf8JsonWriter writer, T? value, JsonSerializerOptions options) @@ -98,20 +100,13 @@ namespace CryptoExchange.Net.Converters.SystemTextJson /// public override T Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) { - var t = ReadNullable(ref reader, typeToConvert, options, out var isEmptyString, out var warn); + var t = ReadNullable(ref reader, typeToConvert, options, out var isEmptyString); if (t == null) { - if (warn) + if (isEmptyString && !_unknownValuesWarned.Contains(null)) { - if (isEmptyString) - { - // We received an empty string and have no mapping for it, and the property isn't nullable - Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Received empty string as enum value, but property type is not a nullable enum. EnumType: {typeof(T).Name}. If you think {typeof(T).Name} should be nullable please open an issue on the Github repo"); - } - else - { - Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Received null enum value, but property type is not a nullable enum. EnumType: {typeof(T).Name}. If you think {typeof(T).Name} should be nullable please open an issue on the Github repo"); - } + // We received an empty string and have no mapping for it, and the property isn't nullable + LibraryHelpers.StaticLogger?.LogWarning($"Received null or empty enum value, but property type is not a nullable enum. EnumType: {typeof(T).Name}. If you think {typeof(T).Name} should be nullable please open an issue on the Github repo"); } return new T(); // return default value @@ -122,10 +117,9 @@ namespace CryptoExchange.Net.Converters.SystemTextJson } } - private T? ReadNullable(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, out bool isEmptyString, out bool warn) + private T? ReadNullable(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options, out bool isEmptyString) { isEmptyString = false; - warn = false; var enumType = typeof(T); if (_mapping == null) _mapping = AddMapping(); @@ -154,9 +148,8 @@ namespace CryptoExchange.Net.Converters.SystemTextJson // We received an enum value but weren't able to parse it. if (!_unknownValuesWarned.Contains(stringValue)) { - warn = true; _unknownValuesWarned.Add(stringValue!); - Trace.WriteLine($"{DateTime.Now:yyyy/MM/dd HH:mm:ss:fff} | Warning | Cannot map enum value. EnumType: {enumType.Name}, Value: {stringValue}, Known values: {string.Join(", ", _mapping.Select(m => m.Value))}. If you think {stringValue} should added please open an issue on the Github repo"); + LibraryHelpers.StaticLogger?.LogWarning($"Cannot map enum value. EnumType: {enumType.Name}, Value: {stringValue}, Known values: {string.Join(", ", _mapping.Select(m => m.Value))}. If you think {stringValue} should added please open an issue on the Github repo"); } } diff --git a/CryptoExchange.Net/LibraryHelpers.cs b/CryptoExchange.Net/LibraryHelpers.cs index 64491cd..5c706a1 100644 --- a/CryptoExchange.Net/LibraryHelpers.cs +++ b/CryptoExchange.Net/LibraryHelpers.cs @@ -1,4 +1,5 @@ using CryptoExchange.Net.Objects; +using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Net; @@ -12,6 +13,22 @@ namespace CryptoExchange.Net /// public static class LibraryHelpers { + private static ILogger? _staticLogger; + /// + /// Static logger + /// + public static ILogger? StaticLogger + { + get => _staticLogger; + internal set + { + if (_staticLogger != null) + return; + + _staticLogger = value; + } + } + /// /// Client order id separator ///