From 2eb2e0d29d6c3f239065d6a7595f5493b48a2d5d Mon Sep 17 00:00:00 2001 From: Bradley Grainger Date: Sun, 31 Dec 2017 20:08:21 -0800 Subject: [PATCH] Add Microsoft.Extensions.Logging provider. Fixes #418 --- MySqlConnector.sln | 8 ++- appveyor.yml | 1 + ...icrosoftExtensionsLoggingLoggerProvider.cs | 56 +++++++++++++++++++ ...ogging.Microsoft.Extensions.Logging.csproj | 20 +++++++ 4 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 src/MySqlConnector.Logging.Microsoft.Extensions.Logging/MicrosoftExtensionsLoggingLoggerProvider.cs create mode 100644 src/MySqlConnector.Logging.Microsoft.Extensions.Logging/MySqlConnector.Logging.Microsoft.Extensions.Logging.csproj diff --git a/MySqlConnector.sln b/MySqlConnector.sln index 15d89769c..0409bae80 100644 --- a/MySqlConnector.sln +++ b/MySqlConnector.sln @@ -1,6 +1,6 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio 15 -VisualStudioVersion = 15.0.27004.2010 +VisualStudioVersion = 15.0.27130.2010 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySqlConnector", "src\MySqlConnector\MySqlConnector.csproj", "{F82378AF-274E-4FBA-8E45-27126D607B85}" EndProject @@ -14,6 +14,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Conformance.Tests", "tests\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySqlConnector.Logging.log4net", "src\MySqlConnector.Logging.log4net\MySqlConnector.Logging.log4net.csproj", "{A15647B8-FA3F-4536-BF4E-4F93F2FBFC75}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySqlConnector.Logging.Microsoft.Extensions.Logging", "src\MySqlConnector.Logging.Microsoft.Extensions.Logging\MySqlConnector.Logging.Microsoft.Extensions.Logging.csproj", "{6A3F1732-F874-463E-9BB8-21690E7B8ED0}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -44,6 +46,10 @@ Global {A15647B8-FA3F-4536-BF4E-4F93F2FBFC75}.Debug|Any CPU.Build.0 = Debug|Any CPU {A15647B8-FA3F-4536-BF4E-4F93F2FBFC75}.Release|Any CPU.ActiveCfg = Release|Any CPU {A15647B8-FA3F-4536-BF4E-4F93F2FBFC75}.Release|Any CPU.Build.0 = Release|Any CPU + {6A3F1732-F874-463E-9BB8-21690E7B8ED0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6A3F1732-F874-463E-9BB8-21690E7B8ED0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6A3F1732-F874-463E-9BB8-21690E7B8ED0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6A3F1732-F874-463E-9BB8-21690E7B8ED0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/appveyor.yml b/appveyor.yml index aab1d0998..02942bd41 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -13,6 +13,7 @@ after_test: - cmd: |- dotnet pack src\MySqlConnector\MySqlConnector.csproj -c Release -p:SourceLinkCreate=true -p:SourceLinkTest=true dotnet pack src\MySqlConnector.Logging.log4net\MySqlConnector.Logging.log4net.csproj -c Release -p:SourceLinkCreate=true -p:SourceLinkTest=true + dotnet pack src\MySqlConnector.Logging.Microsoft.Extensions.Logging\MySqlConnector.Logging.Microsoft.Extensions.Logging.csproj -c Release -p:SourceLinkCreate=true -p:SourceLinkTest=true notifications: - provider: Slack incoming_webhook: diff --git a/src/MySqlConnector.Logging.Microsoft.Extensions.Logging/MicrosoftExtensionsLoggingLoggerProvider.cs b/src/MySqlConnector.Logging.Microsoft.Extensions.Logging/MicrosoftExtensionsLoggingLoggerProvider.cs new file mode 100644 index 000000000..970d61902 --- /dev/null +++ b/src/MySqlConnector.Logging.Microsoft.Extensions.Logging/MicrosoftExtensionsLoggingLoggerProvider.cs @@ -0,0 +1,56 @@ +using System; +using System.Globalization; +using Microsoft.Extensions.Logging; + +namespace MySqlConnector.Logging +{ + public sealed class MicrosoftExtensionsLoggingLoggerProvider : IMySqlConnectorLoggerProvider + { + public MicrosoftExtensionsLoggingLoggerProvider(ILoggerFactory loggerFactory) => m_loggerFactory = loggerFactory; + + public IMySqlConnectorLogger CreateLogger(string name) => new MicrosoftExtensionsLoggingLogger(m_loggerFactory.CreateLogger(name)); + + private class MicrosoftExtensionsLoggingLogger : IMySqlConnectorLogger + { + public MicrosoftExtensionsLoggingLogger(ILogger logger) => m_logger = logger; + + public bool IsEnabled(MySqlConnectorLogLevel level) => m_logger.IsEnabled(GetLevel(level)); + + public void Log(MySqlConnectorLogLevel level, string message, object[] args = null, Exception exception = null) + { + if (args == null || args.Length == 0) + m_logger.Log(GetLevel(level), 0, message, exception, s_getMessage); + else + m_logger.Log(GetLevel(level), 0, (message, args), exception, s_messageFormatter); + } + + private static LogLevel GetLevel(MySqlConnectorLogLevel level) + { + switch (level) + { + case MySqlConnectorLogLevel.Trace: + return LogLevel.Trace; + case MySqlConnectorLogLevel.Debug: + return LogLevel.Debug; + case MySqlConnectorLogLevel.Info: + return LogLevel.Information; + case MySqlConnectorLogLevel.Warn: + return LogLevel.Warning; + case MySqlConnectorLogLevel.Error: + return LogLevel.Error; + case MySqlConnectorLogLevel.Fatal: + return LogLevel.Critical; + default: + throw new ArgumentOutOfRangeException(nameof(level), level, "Invalid value for 'level'."); + } + } + + static readonly Func s_getMessage = (s, e) => s; + static readonly Func<(string Message, object[] Args), Exception, string> s_messageFormatter = (s, e) => string.Format(CultureInfo.InvariantCulture, s.Message, s.Args); + + readonly ILogger m_logger; + } + + readonly ILoggerFactory m_loggerFactory; + } +} diff --git a/src/MySqlConnector.Logging.Microsoft.Extensions.Logging/MySqlConnector.Logging.Microsoft.Extensions.Logging.csproj b/src/MySqlConnector.Logging.Microsoft.Extensions.Logging/MySqlConnector.Logging.Microsoft.Extensions.Logging.csproj new file mode 100644 index 000000000..7aba16672 --- /dev/null +++ b/src/MySqlConnector.Logging.Microsoft.Extensions.Logging/MySqlConnector.Logging.Microsoft.Extensions.Logging.csproj @@ -0,0 +1,20 @@ + + + + netstandard2.0 + MySqlConnector Logging Adapter for Microsoft.Extensions.Logging + Writes MySqlConnector logging output to Microsoft.Extensions.Logging with one line of code. + Copyright 2017 Bradley Grainger + Bradley Grainger + mysql;mysqlconnector;async;ado.net;database;netcore;logging + + + + + + + + + + +