Skip to content

Commit 119b333

Browse files
author
Marc Lewandowski
committed
Add Serilog logging adapter. Fixes #463.
1 parent 426c4af commit 119b333

File tree

3 files changed

+96
-0
lines changed

3 files changed

+96
-0
lines changed

MySqlConnector.sln

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySqlConnector.Logging.log4
1616
EndProject
1717
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}"
1818
EndProject
19+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "MySqlConnector.Logging.Serilog", "src\MySqlConnector.Logging.Serilog\MySqlConnector.Logging.Serilog.csproj", "{38806B85-6526-4A81-9905-45D3411B0AE2}"
20+
EndProject
1921
Global
2022
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2123
Debug|Any CPU = Debug|Any CPU
@@ -50,6 +52,10 @@ Global
5052
{6A3F1732-F874-463E-9BB8-21690E7B8ED0}.Debug|Any CPU.Build.0 = Debug|Any CPU
5153
{6A3F1732-F874-463E-9BB8-21690E7B8ED0}.Release|Any CPU.ActiveCfg = Release|Any CPU
5254
{6A3F1732-F874-463E-9BB8-21690E7B8ED0}.Release|Any CPU.Build.0 = Release|Any CPU
55+
{38806B85-6526-4A81-9905-45D3411B0AE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
56+
{38806B85-6526-4A81-9905-45D3411B0AE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
57+
{38806B85-6526-4A81-9905-45D3411B0AE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
58+
{38806B85-6526-4A81-9905-45D3411B0AE2}.Release|Any CPU.Build.0 = Release|Any CPU
5359
EndGlobalSection
5460
GlobalSection(SolutionProperties) = preSolution
5561
HideSolutionNode = FALSE
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFrameworks>net45;net46;netstandard1.3;netstandard2.0</TargetFrameworks>
5+
<Title>MySqlConnector Logging Adapter for Serilog</Title>
6+
<Description>Writes lightly-structured MySqlConnector logging output to Serilog.</Description>
7+
<Copyright>Copyright 2017 Bradley Grainger</Copyright>
8+
<Authors>Marc Lewandowski</Authors>
9+
<PackageTags>mysql;mysqlconnector;async;ado.net;database;netcore;serilog;logging</PackageTags>
10+
</PropertyGroup>
11+
12+
<ItemGroup>
13+
<PackageReference Include="Serilog" Version="2.6.0" />
14+
</ItemGroup>
15+
16+
<ItemGroup>
17+
<ProjectReference Include="..\MySqlConnector\MySqlConnector.csproj" />
18+
</ItemGroup>
19+
20+
</Project>
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
using System;
2+
using System.Text.RegularExpressions;
3+
using Serilog;
4+
using Serilog.Events;
5+
6+
namespace MySqlConnector.Logging
7+
{
8+
public sealed class SerilogLoggerProvider : IMySqlConnectorLoggerProvider
9+
{
10+
public SerilogLoggerProvider(bool attemptProperties) => m_attemptProperties = attemptProperties;
11+
12+
public IMySqlConnectorLogger CreateLogger(string name)
13+
{
14+
return new SerilogLogger(name, m_attemptProperties);
15+
}
16+
17+
private class SerilogLogger : IMySqlConnectorLogger
18+
{
19+
public SerilogLogger(string name, bool attemptProperties)
20+
{
21+
m_name = name;
22+
m_logger = Serilog.Log.ForContext("SourceContext", "MySqlConnector." + name);
23+
m_attemptProperties = attemptProperties;
24+
}
25+
26+
public bool IsEnabled(MySqlConnectorLogLevel level) => m_logger.IsEnabled(GetLevel(level));
27+
28+
public void Log(MySqlConnectorLogLevel level, string message, object[] args = null, Exception exception = null)
29+
{
30+
if (args == null || args.Length == 0)
31+
m_logger.Write(GetLevel(level), exception, message);
32+
else
33+
{
34+
// rewrite message as template
35+
var template = tokenReplacer.Replace(message, $"{{{m_name}A$1}}");
36+
m_logger.Write(GetLevel(level), exception, template, args);
37+
}
38+
}
39+
40+
private static LogEventLevel GetLevel(MySqlConnectorLogLevel level)
41+
{
42+
switch (level)
43+
{
44+
case MySqlConnectorLogLevel.Trace:
45+
return LogEventLevel.Verbose;
46+
case MySqlConnectorLogLevel.Debug:
47+
return LogEventLevel.Debug;
48+
case MySqlConnectorLogLevel.Info:
49+
return LogEventLevel.Information;
50+
case MySqlConnectorLogLevel.Warn:
51+
return LogEventLevel.Warning;
52+
case MySqlConnectorLogLevel.Error:
53+
return LogEventLevel.Error;
54+
case MySqlConnectorLogLevel.Fatal:
55+
return LogEventLevel.Fatal;
56+
default:
57+
throw new ArgumentOutOfRangeException(nameof(level), level, "Invalid value for 'level'.");
58+
}
59+
}
60+
61+
static readonly Regex tokenReplacer = new Regex(@"\{(\d+)\}", RegexOptions.Compiled);
62+
63+
readonly ILogger m_logger;
64+
readonly bool m_attemptProperties;
65+
readonly string m_name;
66+
}
67+
68+
readonly bool m_attemptProperties;
69+
}
70+
}

0 commit comments

Comments
 (0)