Skip to content

Commit 81947c5

Browse files
committed
* Azure Managed Identities auth config works for Microsoft.Extensions.Configuration
* Adapted WorkerServiceDemo to use the new azure configuration values for sink and audit sink.
1 parent 0725821 commit 81947c5

File tree

17 files changed

+324
-68
lines changed

17 files changed

+324
-68
lines changed

sample/WorkerServiceDemo/appsettings.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,30 @@
3232
}
3333
}
3434
}
35+
],
36+
"AuditTo": [
37+
{
38+
"Name": "MSSqlServer",
39+
"Args": {
40+
"connectionString": "Server=localhost;Database=LogTest;Integrated Security=SSPI;",
41+
"tableName": "LogEventsAudit",
42+
"columnOptionsSection": {
43+
"addStandardColumns": [ "LogEvent" ],
44+
"removeStandardColumns": [ "MessageTemplate", "Properties" ],
45+
"timeStamp": {
46+
"columnName": "Timestamp",
47+
"convertToUtc": false
48+
}
49+
},
50+
"autoCreateSqlTable": true,
51+
"restrictedToMinimumLevel": "Information",
52+
"logEventFormatter": "WorkerServiceDemo.CustomLogEventFormatter::Formatter, WorkerServiceDemo",
53+
"sinkOptionsSection": {
54+
"useAzureManagedIdentity": false,
55+
"azureServiceTokenProviderResource": "TestAuditAzureServiceTokenProviderResource"
56+
}
57+
}
58+
}
3559
]
3660
}
3761
}

src/Serilog.Sinks.MSSqlServer/Configuration/Extensions/Hybrid/LoggerConfigurationMSSqlServerExtensions.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -128,10 +128,11 @@ internal static LoggerConfiguration MSSqlServerInternal(
128128
var serviceConfigSection = applySystemConfiguration.GetSinkConfigurationSection(AppConfigSectionName);
129129
if (serviceConfigSection != null)
130130
{
131-
colOpts = applySystemConfiguration.ConfigureColumnOptions(serviceConfigSection, colOpts);
132131
connStr = applySystemConfiguration.GetConnectionString(connStr);
132+
colOpts = applySystemConfiguration.ConfigureColumnOptions(serviceConfigSection, colOpts);
133+
// TODO get sink options from config
133134

134-
if (appConfiguration != null || columnOptionsSection != null)
135+
if (appConfiguration != null || columnOptionsSection != null || sinkOptionsSection != null)
135136
SelfLog.WriteLine("Warning: Both System.Configuration (app.config or web.config) and Microsoft.Extensions.Configuration are being applied to the MSSQLServer sink.");
136137
}
137138

@@ -147,7 +148,7 @@ internal static LoggerConfiguration MSSqlServerInternal(
147148

148149
if (sinkOptionsSection != null)
149150
{
150-
// TODO read sink options from configuration
151+
sinkOpts = applyMicrosoftExtensionsConfiguration.ConfigureSinkOptions(sinkOpts, sinkOptionsSection);
151152
}
152153

153154
var sink = sinkFactory.Create(connStr, tableName, batchPostingLimit, defaultedPeriod, formatProvider,
@@ -234,10 +235,11 @@ internal static LoggerConfiguration MSSqlServerInternal(
234235
var serviceConfigSection = applySystemConfiguration.GetSinkConfigurationSection(AppConfigSectionName);
235236
if (serviceConfigSection != null)
236237
{
237-
colOpts = applySystemConfiguration.ConfigureColumnOptions(serviceConfigSection, colOpts);
238238
connStr = applySystemConfiguration.GetConnectionString(connStr);
239+
colOpts = applySystemConfiguration.ConfigureColumnOptions(serviceConfigSection, colOpts);
240+
// TODO get sink options from config
239241

240-
if (appConfiguration != null || columnOptionsSection != null)
242+
if (appConfiguration != null || columnOptionsSection != null || sinkOptionsSection != null)
241243
SelfLog.WriteLine("Warning: Both System.Configuration (app.config or web.config) and Microsoft.Extensions.Configuration are being applied to the MSSQLServer sink.");
242244
}
243245

@@ -253,7 +255,7 @@ internal static LoggerConfiguration MSSqlServerInternal(
253255

254256
if (sinkOptionsSection != null)
255257
{
256-
// TODO read sink options from configuration
258+
sinkOpts = applyMicrosoftExtensionsConfiguration.ConfigureSinkOptions(sinkOpts, sinkOptionsSection);
257259
}
258260

259261
var auditSink = auditSinkFactory.Create(connStr, tableName, formatProvider, autoCreateSqlTable,

src/Serilog.Sinks.MSSqlServer/Configuration/Extensions/Microsoft.Extensions.Configuration/LoggerConfigurationMSSqlServerExtensions.cs

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,7 @@ public static LoggerConfiguration MSSqlServer(
6868
string schemaName = "dbo",
6969
ITextFormatter logEventFormatter = null,
7070
SinkOptions sinkOptions = null,
71-
#pragma warning disable CA1801
7271
IConfigurationSection sinkOptionsSection = null)
73-
#pragma warning restore CA1801
7472
{
7573
if (loggerConfiguration == null)
7674
throw new ArgumentNullException(nameof(loggerConfiguration));
@@ -80,7 +78,7 @@ public static LoggerConfiguration MSSqlServer(
8078
IApplyMicrosoftExtensionsConfiguration microsoftExtensionsConfiguration = new ApplyMicrosoftExtensionsConfiguration();
8179
connectionString = microsoftExtensionsConfiguration.GetConnectionString(connectionString, appConfiguration);
8280
columnOptions = microsoftExtensionsConfiguration.ConfigureColumnOptions(columnOptions, columnOptionsSection);
83-
// TODO read sink options from configuration
81+
sinkOptions = microsoftExtensionsConfiguration.ConfigureSinkOptions(sinkOptions, sinkOptionsSection);
8482

8583
IMSSqlServerSinkFactory sinkFactory = new MSSqlServerSinkFactory();
8684
var sink = sinkFactory.Create(connectionString, tableName, batchPostingLimit, defaultedPeriod,
@@ -120,17 +118,15 @@ public static LoggerConfiguration MSSqlServer(
120118
string schemaName = "dbo",
121119
ITextFormatter logEventFormatter = null,
122120
SinkOptions sinkOptions = null,
123-
#pragma warning disable CA1801
124121
IConfigurationSection sinkOptionsSection = null)
125-
#pragma warning restore CA1801
126122
{
127123
if (loggerAuditSinkConfiguration == null)
128124
throw new ArgumentNullException(nameof(loggerAuditSinkConfiguration));
129125

130126
IApplyMicrosoftExtensionsConfiguration microsoftExtensionsConfiguration = new ApplyMicrosoftExtensionsConfiguration();
131127
connectionString = microsoftExtensionsConfiguration.GetConnectionString(connectionString, appConfiguration);
132128
columnOptions = microsoftExtensionsConfiguration.ConfigureColumnOptions(columnOptions, columnOptionsSection);
133-
// TODO read sink options from configuration
129+
sinkOptions = microsoftExtensionsConfiguration.ConfigureSinkOptions(sinkOptions, sinkOptionsSection);
134130

135131
IMSSqlServerAuditSinkFactory auditSinkFactory = new MSSqlServerAuditSinkFactory();
136132
var auditSink = auditSinkFactory.Create(connectionString, tableName, formatProvider, autoCreateSqlTable,
Original file line numberDiff line numberDiff line change
@@ -1,48 +1,40 @@
11
using Microsoft.Extensions.Configuration;
22
using Serilog.Sinks.MSSqlServer.Configuration;
3+
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Options;
34

45
namespace Serilog.Sinks.MSSqlServer
56
{
6-
/// <summary>
7-
/// Configures the sink's connection string and ColumnOtions object.
8-
/// </summary>
97
internal class ApplyMicrosoftExtensionsConfiguration : IApplyMicrosoftExtensionsConfiguration
108
{
119
private readonly IMicrosoftExtensionsConnectionStringProvider _connectionStringProvider;
1210
private readonly IMicrosoftExtensionsColumnOptionsProvider _columnOptionsProvider;
11+
private readonly IMicrosoftExtensionsSinkOptionsProvider _sinkOptionsProvider;
1312

14-
public ApplyMicrosoftExtensionsConfiguration()
13+
public ApplyMicrosoftExtensionsConfiguration() : this(
14+
new MicrosoftExtensionsConnectionStringProvider(),
15+
new MicrosoftExtensionsColumnOptionsProvider(),
16+
new MicrosoftExtensionsSinkOptionsProvider())
1517
{
16-
_connectionStringProvider = new MicrosoftExtensionsConnectionStringProvider();
17-
_columnOptionsProvider = new MicrosoftExtensionsColumnOptionsProvider();
1818
}
1919

2020
// Constructor with injectable dependencies for tests
2121
internal ApplyMicrosoftExtensionsConfiguration(
2222
IMicrosoftExtensionsConnectionStringProvider connectionStringProvider,
23-
IMicrosoftExtensionsColumnOptionsProvider columnOptionsProvider)
23+
IMicrosoftExtensionsColumnOptionsProvider columnOptionsProvider,
24+
IMicrosoftExtensionsSinkOptionsProvider sinkOptionsProvider)
2425
{
2526
_connectionStringProvider = connectionStringProvider;
2627
_columnOptionsProvider = columnOptionsProvider;
28+
_sinkOptionsProvider = sinkOptionsProvider;
2729
}
2830

29-
/// <summary>
30-
/// Examine if supplied connection string is a reference to an item in the "ConnectionStrings" section of web.config
31-
/// If it is, return the ConnectionStrings item, if not, return string as supplied.
32-
/// </summary>
33-
/// <param name="nameOrConnectionString">The name of the ConnectionStrings key or raw connection string.</param>
34-
/// <param name="appConfiguration">Additional application-level configuration.</param>
35-
/// <remarks>Pulled from review of Entity Framework 6 methodology for doing the same</remarks>
3631
public string GetConnectionString(string nameOrConnectionString, IConfiguration appConfiguration) =>
3732
_connectionStringProvider.GetConnectionString(nameOrConnectionString, appConfiguration);
3833

39-
/// <summary>
40-
/// Create or add to the ColumnOptions object and apply any configuration changes to it.
41-
/// </summary>
42-
/// <param name="columnOptions">An optional externally-created ColumnOptions object to be updated with additional configuration values.</param>
43-
/// <param name="config">A configuration section typically named "columnOptionsSection" (see docs).</param>
44-
/// <returns></returns>
4534
public ColumnOptions ConfigureColumnOptions(ColumnOptions columnOptions, IConfigurationSection config) =>
4635
_columnOptionsProvider.ConfigureColumnOptions(columnOptions, config);
36+
37+
public SinkOptions ConfigureSinkOptions(SinkOptions sinkOptions, IConfigurationSection config) =>
38+
_sinkOptionsProvider.ConfigureSinkOptions(sinkOptions, config);
4739
}
4840
}
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
using Microsoft.Extensions.Configuration;
2+
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Options;
23

34
namespace Serilog.Sinks.MSSqlServer
45
{
56
internal interface IApplyMicrosoftExtensionsConfiguration
67
{
7-
ColumnOptions ConfigureColumnOptions(ColumnOptions columnOptions, IConfigurationSection config);
88
string GetConnectionString(string nameOrConnectionString, IConfiguration appConfiguration);
9+
ColumnOptions ConfigureColumnOptions(ColumnOptions columnOptions, IConfigurationSection config);
10+
SinkOptions ConfigureSinkOptions(SinkOptions sinkOptions, IConfigurationSection config);
911
}
10-
}
12+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using Microsoft.Extensions.Configuration;
2+
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Options;
3+
4+
namespace Serilog.Sinks.MSSqlServer.Configuration
5+
{
6+
internal interface IMicrosoftExtensionsSinkOptionsProvider
7+
{
8+
SinkOptions ConfigureSinkOptions(SinkOptions sinkOptions, IConfigurationSection config);
9+
}
10+
}

src/Serilog.Sinks.MSSqlServer/Configuration/Implementations/Microsoft.Extensions.Configuration/MicrosoftExtensionsColumnOptionsProvider.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Collections.Generic;
33
using System.Collections.ObjectModel;
44
using System.Linq;
5-
using System.Security.Cryptography.X509Certificates;
65
using Microsoft.Extensions.Configuration;
76

87
namespace Serilog.Sinks.MSSqlServer.Configuration
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
using System.Linq;
3+
using Microsoft.Extensions.Configuration;
4+
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Options;
5+
6+
namespace Serilog.Sinks.MSSqlServer.Configuration
7+
{
8+
internal class MicrosoftExtensionsSinkOptionsProvider : IMicrosoftExtensionsSinkOptionsProvider
9+
{
10+
public SinkOptions ConfigureSinkOptions(SinkOptions sinkOptions, IConfigurationSection config)
11+
{
12+
if (config == null)
13+
{
14+
return sinkOptions;
15+
}
16+
17+
ReadAzureManagedIdentitiesOptions(config, sinkOptions);
18+
19+
return sinkOptions;
20+
}
21+
22+
private void ReadAzureManagedIdentitiesOptions(IConfigurationSection config, SinkOptions sinkOptions)
23+
{
24+
SetProperty.IfNotNull<bool>(config["useAzureManagedIdentity"], val => sinkOptions.UseAzureManagedIdentity = val);
25+
SetProperty.IfNotNull<string>(config["azureServiceTokenProviderResource"], val => sinkOptions.AzureServiceTokenProviderResource = val);
26+
}
27+
}
28+
}

src/Serilog.Sinks.MSSqlServer/Configuration/Implementations/SetProperty.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public static void IfNotNull<T>(string value, PropertySetter<T> setter)
2626
if (value == null || setter == null) return;
2727
try
2828
{
29-
T setting = (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
29+
var setting = (T)Convert.ChangeType(value, typeof(T), CultureInfo.InvariantCulture);
3030
setter(setting);
3131
}
3232
// don't change the property if the conversion fails

src/Serilog.Sinks.MSSqlServer/Configuration/Implementations/System.Configuration/ApplySystemConfiguration.cs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -4,18 +4,15 @@
44

55
namespace Serilog.Sinks.MSSqlServer
66
{
7-
/// <summary>
8-
/// Configures the sink's connection string and ColumnOtions object.
9-
/// </summary>
107
internal class ApplySystemConfiguration : IApplySystemConfiguration
118
{
129
private readonly ISystemConfigurationConnectionStringProvider _connectionStringProvider;
1310
private readonly ISystemConfigurationColumnOptionsProvider _columnOptionsProvider;
1411

15-
public ApplySystemConfiguration()
12+
public ApplySystemConfiguration() : this (
13+
new SystemConfigurationConnectionStringProvider(),
14+
new SystemConfigurationColumnOptionsProvider())
1615
{
17-
_connectionStringProvider = new SystemConfigurationConnectionStringProvider();
18-
_columnOptionsProvider = new SystemConfigurationColumnOptionsProvider();
1916
}
2017

2118
// Constructor with injectable dependencies for tests
@@ -27,27 +24,14 @@ internal ApplySystemConfiguration(
2724
_columnOptionsProvider = columnOptionsProvider;
2825
}
2926

30-
/// <summary>
31-
/// Gets the config section specified and returns it if of type MSSqlServerConfigurationSection or null otherwise.
32-
/// </summary>
33-
/// <param name="configurationSectionName">The name of the config section.</param>
3427
public MSSqlServerConfigurationSection GetSinkConfigurationSection(string configurationSectionName)
3528
{
3629
return ConfigurationManager.GetSection(configurationSectionName) as MSSqlServerConfigurationSection;
3730
}
3831

39-
/// <summary>
40-
/// Examine if supplied connection string is a reference to an item in the "ConnectionStrings" section of web.config
41-
/// If it is, return the ConnectionStrings item, if not, return string as supplied.
42-
/// </summary>
43-
/// <param name="nameOrConnectionString">The name of the ConnectionStrings key or raw connection string.</param>
44-
/// <remarks>Pulled from review of Entity Framework 6 methodology for doing the same</remarks>
4532
public string GetConnectionString(string nameOrConnectionString) =>
4633
_connectionStringProvider.GetConnectionString(nameOrConnectionString);
4734

48-
/// <summary>
49-
/// Populate ColumnOptions properties and collections from app config
50-
/// </summary>
5135
public ColumnOptions ConfigureColumnOptions(MSSqlServerConfigurationSection config, ColumnOptions columnOptions) =>
5236
_columnOptionsProvider.ConfigureColumnOptions(config, columnOptions);
5337
}

0 commit comments

Comments
 (0)