Skip to content

Commit 7b1cd54

Browse files
committed
SqlConnection config Action
Signed-off-by: Nathan Hart <nhart12@gmail.com>
1 parent 83fdfa5 commit 7b1cd54

File tree

14 files changed

+166
-84
lines changed

14 files changed

+166
-84
lines changed

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
using System;
16+
using Microsoft.Data.SqlClient;
1617
using Microsoft.Extensions.Configuration;
1718
using Serilog.Configuration;
1819
using Serilog.Debugging;
@@ -109,6 +110,7 @@ public static LoggerConfiguration MSSqlServer(
109110
/// <param name="columnOptions">An externally-modified group of column settings</param>
110111
/// <param name="columnOptionsSection">A config section defining various column settings</param>
111112
/// <param name="logEventFormatter">Supplies custom formatter for the LogEvent column, or null</param>
113+
/// <param name="connectionConfiguration">Supplies an extension point for customizing the underyling SqlConnection</param>
112114
/// <returns>Logger configuration, allowing configuration to continue.</returns>
113115
/// <exception cref="ArgumentNullException">A required parameter is null.</exception>
114116
public static LoggerConfiguration MSSqlServer(
@@ -121,7 +123,8 @@ public static LoggerConfiguration MSSqlServer(
121123
IFormatProvider formatProvider = null,
122124
ColumnOptions columnOptions = null,
123125
IConfigurationSection columnOptionsSection = null,
124-
ITextFormatter logEventFormatter = null) =>
126+
ITextFormatter logEventFormatter = null,
127+
Action<SqlConnection> connectionConfiguration = null) =>
125128
loggerConfiguration.MSSqlServerInternal(
126129
connectionString: connectionString,
127130
sinkOptions: sinkOptions,
@@ -135,7 +138,8 @@ public static LoggerConfiguration MSSqlServer(
135138
applySystemConfiguration: new ApplySystemConfiguration(),
136139
applyMicrosoftExtensionsConfiguration: new ApplyMicrosoftExtensionsConfiguration(),
137140
sinkFactory: new MSSqlServerSinkFactory(),
138-
batchingSinkFactory: new PeriodicBatchingSinkFactory());
141+
batchingSinkFactory: new PeriodicBatchingSinkFactory(),
142+
connectionConfiguration: connectionConfiguration);
139143

140144
// Internal overload with parameters used by tests to override the config section and inject mocks
141145
internal static LoggerConfiguration MSSqlServerInternal(
@@ -152,15 +156,16 @@ internal static LoggerConfiguration MSSqlServerInternal(
152156
IApplySystemConfiguration applySystemConfiguration,
153157
IApplyMicrosoftExtensionsConfiguration applyMicrosoftExtensionsConfiguration,
154158
IMSSqlServerSinkFactory sinkFactory,
155-
IPeriodicBatchingSinkFactory batchingSinkFactory)
159+
IPeriodicBatchingSinkFactory batchingSinkFactory,
160+
Action<SqlConnection> connectionConfiguration)
156161
{
157162
if (loggerConfiguration == null)
158163
throw new ArgumentNullException(nameof(loggerConfiguration));
159164

160165
ReadConfiguration(ref connectionString, ref sinkOptions, sinkOptionsSection, appConfiguration,
161166
ref columnOptions, columnOptionsSection, applySystemConfiguration, applyMicrosoftExtensionsConfiguration);
162167

163-
var sink = sinkFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter);
168+
var sink = sinkFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter, connectionConfiguration);
164169

165170
var periodicBatchingSink = batchingSinkFactory.Create(sink, sinkOptions);
166171

@@ -230,6 +235,7 @@ public static LoggerConfiguration MSSqlServer(
230235
/// <param name="columnOptions">An externally-modified group of column settings</param>
231236
/// <param name="columnOptionsSection">A config section defining various column settings</param>
232237
/// <param name="logEventFormatter">Supplies custom formatter for the LogEvent column, or null</param>
238+
/// <param name="connectionConfiguration">Supplies an extension point for customizing the underyling SqlConnection</param>
233239
/// <returns>Logger configuration, allowing configuration to continue.</returns>
234240
/// <exception cref="ArgumentNullException">A required parameter is null.</exception>
235241
public static LoggerConfiguration MSSqlServer(
@@ -242,7 +248,8 @@ public static LoggerConfiguration MSSqlServer(
242248
IFormatProvider formatProvider = null,
243249
ColumnOptions columnOptions = null,
244250
IConfigurationSection columnOptionsSection = null,
245-
ITextFormatter logEventFormatter = null) =>
251+
ITextFormatter logEventFormatter = null,
252+
Action<SqlConnection> connectionConfiguration = null) =>
246253
loggerAuditSinkConfiguration.MSSqlServerInternal(
247254
connectionString: connectionString,
248255
sinkOptions: sinkOptions,
@@ -255,7 +262,8 @@ public static LoggerConfiguration MSSqlServer(
255262
logEventFormatter: logEventFormatter,
256263
applySystemConfiguration: new ApplySystemConfiguration(),
257264
applyMicrosoftExtensionsConfiguration: new ApplyMicrosoftExtensionsConfiguration(),
258-
auditSinkFactory: new MSSqlServerAuditSinkFactory());
265+
auditSinkFactory: new MSSqlServerAuditSinkFactory(),
266+
connectionConfiguration: connectionConfiguration);
259267

260268
// Internal overload with parameters used by tests to override the config section and inject mocks
261269
internal static LoggerConfiguration MSSqlServerInternal(
@@ -271,15 +279,16 @@ internal static LoggerConfiguration MSSqlServerInternal(
271279
ITextFormatter logEventFormatter,
272280
IApplySystemConfiguration applySystemConfiguration,
273281
IApplyMicrosoftExtensionsConfiguration applyMicrosoftExtensionsConfiguration,
274-
IMSSqlServerAuditSinkFactory auditSinkFactory)
282+
IMSSqlServerAuditSinkFactory auditSinkFactory,
283+
Action<SqlConnection> connectionConfiguration)
275284
{
276285
if (loggerAuditSinkConfiguration == null)
277286
throw new ArgumentNullException(nameof(loggerAuditSinkConfiguration));
278287

279288
ReadConfiguration(ref connectionString, ref sinkOptions, sinkOptionsSection, appConfiguration,
280289
ref columnOptions, columnOptionsSection, applySystemConfiguration, applyMicrosoftExtensionsConfiguration);
281290

282-
var auditSink = auditSinkFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter);
291+
var auditSink = auditSinkFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter, connectionConfiguration);
283292

284293
return loggerAuditSinkConfiguration.Sink(auditSink, restrictedToMinimumLevel, sinkOptions?.LevelSwitch);
285294
}

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

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
using System;
16+
using Microsoft.Data.SqlClient;
1617
using Microsoft.Extensions.Configuration;
1718
using Serilog.Configuration;
1819
using Serilog.Events;
@@ -102,6 +103,7 @@ public static LoggerConfiguration MSSqlServer(
102103
/// <param name="columnOptions">An externally-modified group of column settings</param>
103104
/// <param name="columnOptionsSection">A config section defining various column settings</param>
104105
/// <param name="logEventFormatter">Supplies custom formatter for the LogEvent column, or null</param>
106+
/// <param name="connectionConfiguration">Supplies an extension point for customizing the underyling SqlConnection</param>
105107
/// <returns>Logger configuration, allowing configuration to continue.</returns>
106108
/// <exception cref="ArgumentNullException">A required parameter is null.</exception>
107109
public static LoggerConfiguration MSSqlServer(
@@ -114,7 +116,8 @@ public static LoggerConfiguration MSSqlServer(
114116
IFormatProvider formatProvider = null,
115117
ColumnOptions columnOptions = null,
116118
IConfigurationSection columnOptionsSection = null,
117-
ITextFormatter logEventFormatter = null)
119+
ITextFormatter logEventFormatter = null,
120+
Action<SqlConnection> connectionConfiguration = null)
118121
{
119122
if (loggerConfiguration == null)
120123
throw new ArgumentNullException(nameof(loggerConfiguration));
@@ -123,7 +126,7 @@ public static LoggerConfiguration MSSqlServer(
123126
columnOptionsSection, sinkOptionsSection);
124127

125128
IMSSqlServerSinkFactory sinkFactory = new MSSqlServerSinkFactory();
126-
var sink = sinkFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter);
129+
var sink = sinkFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter, connectionConfiguration);
127130

128131
IPeriodicBatchingSinkFactory periodicBatchingSinkFactory = new PeriodicBatchingSinkFactory();
129132
var periodicBatchingSink = periodicBatchingSinkFactory.Create(sink, sinkOptions);
@@ -194,6 +197,7 @@ public static LoggerConfiguration MSSqlServer(
194197
/// <param name="columnOptions">An externally-modified group of column settings</param>
195198
/// <param name="columnOptionsSection">A config section defining various column settings</param>
196199
/// <param name="logEventFormatter">Supplies custom formatter for the LogEvent column, or null</param>
200+
/// <param name="connectionConfiguration">Supplies an extension point for customizing the underyling SqlConnection</param>
197201
/// <returns>Logger configuration, allowing configuration to continue.</returns>
198202
/// <exception cref="ArgumentNullException">A required parameter is null.</exception>
199203
public static LoggerConfiguration MSSqlServer(
@@ -206,7 +210,8 @@ public static LoggerConfiguration MSSqlServer(
206210
IFormatProvider formatProvider = null,
207211
ColumnOptions columnOptions = null,
208212
IConfigurationSection columnOptionsSection = null,
209-
ITextFormatter logEventFormatter = null)
213+
ITextFormatter logEventFormatter = null,
214+
Action<SqlConnection> connectionConfiguration = null)
210215
{
211216
if (loggerAuditSinkConfiguration == null)
212217
throw new ArgumentNullException(nameof(loggerAuditSinkConfiguration));
@@ -215,7 +220,7 @@ public static LoggerConfiguration MSSqlServer(
215220
columnOptionsSection, sinkOptionsSection);
216221

217222
IMSSqlServerAuditSinkFactory auditSinkFactory = new MSSqlServerAuditSinkFactory();
218-
var auditSink = auditSinkFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter);
223+
var auditSink = auditSinkFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter, connectionConfiguration);
219224

220225
return loggerAuditSinkConfiguration.Sink(auditSink, restrictedToMinimumLevel, sinkOptions?.LevelSwitch);
221226
}

src/Serilog.Sinks.MSSqlServer/Configuration/Factories/IMSSqlServerAuditSinkFactory.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using Microsoft.Data.SqlClient;
23
using Serilog.Core;
34
using Serilog.Formatting;
45

@@ -11,6 +12,7 @@ ILogEventSink Create(
1112
MSSqlServerSinkOptions sinkOptions,
1213
IFormatProvider formatProvider,
1314
ColumnOptions columnOptions,
14-
ITextFormatter logEventFormatter);
15+
ITextFormatter logEventFormatter,
16+
Action<SqlConnection> connectionConfiguration);
1517
}
1618
}

src/Serilog.Sinks.MSSqlServer/Configuration/Factories/IMSSqlServerSinkFactory.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using Serilog.Formatting;
33
using Serilog.Core;
4+
using Microsoft.Data.SqlClient;
45

56
namespace Serilog.Sinks.MSSqlServer.Configuration.Factories
67
{
@@ -11,6 +12,7 @@ IBatchedLogEventSink Create(
1112
MSSqlServerSinkOptions sinkOptions,
1213
IFormatProvider formatProvider,
1314
ColumnOptions columnOptions,
14-
ITextFormatter logEventFormatter);
15+
ITextFormatter logEventFormatter,
16+
Action<SqlConnection> connectionConfiguration);
1517
}
1618
}

src/Serilog.Sinks.MSSqlServer/Configuration/Factories/MSSqlServerAuditSinkFactory.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using Microsoft.Data.SqlClient;
23
using Serilog.Core;
34
using Serilog.Formatting;
45

@@ -11,12 +12,14 @@ public ILogEventSink Create(
1112
MSSqlServerSinkOptions sinkOptions,
1213
IFormatProvider formatProvider,
1314
ColumnOptions columnOptions,
14-
ITextFormatter logEventFormatter) =>
15+
ITextFormatter logEventFormatter,
16+
Action<SqlConnection> connectionConfiguration) =>
1517
new MSSqlServerAuditSink(
1618
connectionString,
1719
sinkOptions,
1820
formatProvider,
1921
columnOptions,
20-
logEventFormatter);
22+
logEventFormatter,
23+
connectionConfiguration);
2124
}
2225
}

src/Serilog.Sinks.MSSqlServer/Configuration/Factories/MSSqlServerSinkFactory.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using Serilog.Formatting;
33
using Serilog.Core;
4+
using Microsoft.Data.SqlClient;
45

56
namespace Serilog.Sinks.MSSqlServer.Configuration.Factories
67
{
@@ -11,12 +12,14 @@ public IBatchedLogEventSink Create(
1112
MSSqlServerSinkOptions sinkOptions,
1213
IFormatProvider formatProvider,
1314
ColumnOptions columnOptions,
14-
ITextFormatter logEventFormatter) =>
15+
ITextFormatter logEventFormatter,
16+
Action<SqlConnection> connectionConfiguration) =>
1517
new MSSqlServerSink(
1618
connectionString,
1719
sinkOptions,
1820
formatProvider,
1921
columnOptions,
20-
logEventFormatter);
22+
logEventFormatter,
23+
connectionConfiguration);
2124
}
2225
}

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Dependencies/SinkDependenciesFactory.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using Microsoft.Data.SqlClient;
23
using Serilog.Formatting;
34
using Serilog.Sinks.MSSqlServer.Output;
45
using Serilog.Sinks.MSSqlServer.Platform;
@@ -13,7 +14,9 @@ internal static SinkDependencies Create(
1314
MSSqlServerSinkOptions sinkOptions,
1415
IFormatProvider formatProvider,
1516
ColumnOptions columnOptions,
16-
ITextFormatter logEventFormatter)
17+
ITextFormatter logEventFormatter,
18+
Action<SqlConnection> connectionConfiguration = null
19+
)
1720
{
1821
columnOptions = columnOptions ?? new ColumnOptions();
1922
columnOptions.FinalizeConfigurationForSinkConstructor();
@@ -22,7 +25,7 @@ internal static SinkDependencies Create(
2225
// unless sink option EnlistInTransaction is set to true.
2326
var sqlConnectionStringBuilderWrapper = new SqlConnectionStringBuilderWrapper(
2427
connectionString, sinkOptions.EnlistInTransaction);
25-
var sqlConnectionFactory = new SqlConnectionFactory(sqlConnectionStringBuilderWrapper);
28+
var sqlConnectionFactory = new SqlConnectionFactory(sqlConnectionStringBuilderWrapper, connectionConfiguration);
2629
var sqlCommandFactory = new SqlCommandFactory();
2730
var dataTableCreator = new DataTableCreator(sinkOptions.TableName, columnOptions);
2831
var sqlCreateTableWriter = new SqlCreateTableWriter(sinkOptions.SchemaName,
@@ -34,7 +37,7 @@ internal static SinkDependencies Create(
3437
InitialCatalog = ""
3538
};
3639
var sqlConnectionFactoryNoDb =
37-
new SqlConnectionFactory(sqlConnectionStringBuilderWrapperNoDb);
40+
new SqlConnectionFactory(sqlConnectionStringBuilderWrapperNoDb, connectionConfiguration);
3841
var sqlCreateDatabaseWriter = new SqlCreateDatabaseWriter(sqlConnectionStringBuilderWrapper.InitialCatalog);
3942

4043
var logEventDataGenerator =

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/MSSqlServerAuditSink.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414

1515
using System;
16+
using Microsoft.Data.SqlClient;
1617
using Serilog.Core;
1718
using Serilog.Events;
1819
using Serilog.Formatting;
@@ -67,12 +68,14 @@ public MSSqlServerAuditSink(
6768
/// <param name="formatProvider">Supplies culture-specific formatting information, or null.</param>
6869
/// <param name="columnOptions">Options that pertain to columns</param>
6970
/// <param name="logEventFormatter">Supplies custom formatter for the LogEvent column, or null</param>
71+
/// <param name="connectionConfiguration">Optional action to perform additional configuraton on underyling SQLConnection</param>
7072
public MSSqlServerAuditSink(
7173
string connectionString,
7274
MSSqlServerSinkOptions sinkOptions,
7375
IFormatProvider formatProvider = null,
7476
ColumnOptions columnOptions = null,
75-
ITextFormatter logEventFormatter = null)
77+
ITextFormatter logEventFormatter = null,
78+
Action<SqlConnection> connectionConfiguration = null)
7679
: this(sinkOptions, columnOptions,
7780
SinkDependenciesFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter))
7881
{

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/MSSqlServerSink.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
using Serilog.Sinks.MSSqlServer.Dependencies;
2121
using Serilog.Sinks.MSSqlServer.Platform;
2222
using Serilog.Core;
23+
using Microsoft.Data.SqlClient;
2324

2425
namespace Serilog.Sinks.MSSqlServer
2526
{
@@ -90,13 +91,15 @@ public MSSqlServerSink(
9091
/// <param name="formatProvider">Supplies culture-specific formatting information, or null.</param>
9192
/// <param name="columnOptions">Options that pertain to columns</param>
9293
/// <param name="logEventFormatter">Supplies custom formatter for the LogEvent column, or null</param>
94+
/// <param name="connectionConfiguration">Optional action to perform additional configuraton on underyling SQLConnection</param>
9395
public MSSqlServerSink(
9496
string connectionString,
9597
MSSqlServerSinkOptions sinkOptions,
9698
IFormatProvider formatProvider = null,
9799
ColumnOptions columnOptions = null,
98-
ITextFormatter logEventFormatter = null)
99-
: this(sinkOptions, SinkDependenciesFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter))
100+
ITextFormatter logEventFormatter = null,
101+
Action<SqlConnection> connectionConfiguration = null)
102+
: this(sinkOptions, SinkDependenciesFactory.Create(connectionString, sinkOptions, formatProvider, columnOptions, logEventFormatter, connectionConfiguration))
100103
{
101104
}
102105

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Platform/SqlClient/SqlConnectionWrapper.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,13 @@ internal class SqlConnectionWrapper : ISqlConnectionWrapper
99
private readonly SqlConnection _sqlConnection;
1010
private bool _disposedValue;
1111

12-
public SqlConnectionWrapper(string connectionString)
12+
public SqlConnectionWrapper(string connectionString, Action<SqlConnection> connectionConfiguration = null)
1313
{
1414
_sqlConnection = new SqlConnection(connectionString);
15+
if (connectionConfiguration != null)
16+
{
17+
connectionConfiguration(_sqlConnection);
18+
}
1519
}
1620

1721
public SqlConnection SqlConnection => _sqlConnection;
Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using Microsoft.Data.SqlClient;
23
using Serilog.Sinks.MSSqlServer.Platform.SqlClient;
34

45
namespace Serilog.Sinks.MSSqlServer.Platform
@@ -7,18 +8,21 @@ internal class SqlConnectionFactory : ISqlConnectionFactory
78
{
89
private readonly string _connectionString;
910
private readonly ISqlConnectionStringBuilderWrapper _sqlConnectionStringBuilderWrapper;
11+
private readonly Action<SqlConnection> _connectionConfiguration;
1012

11-
public SqlConnectionFactory(ISqlConnectionStringBuilderWrapper sqlConnectionStringBuilderWrapper)
13+
public SqlConnectionFactory(ISqlConnectionStringBuilderWrapper sqlConnectionStringBuilderWrapper,
14+
Action<SqlConnection> connectionConfiguration = null)
1215
{
1316
_sqlConnectionStringBuilderWrapper = sqlConnectionStringBuilderWrapper
1417
?? throw new ArgumentNullException(nameof(sqlConnectionStringBuilderWrapper));
1518

1619
_connectionString = _sqlConnectionStringBuilderWrapper.ConnectionString;
20+
_connectionConfiguration = connectionConfiguration;
1721
}
1822

1923
public ISqlConnectionWrapper Create()
2024
{
21-
return new SqlConnectionWrapper(_connectionString);
25+
return new SqlConnectionWrapper(_connectionString, _connectionConfiguration);
2226
}
2327
}
2428
}

0 commit comments

Comments
 (0)