Skip to content

Commit 31ab786

Browse files
author
Colin Young
committed
Change to use separate column options to set column names
1 parent f9c884b commit 31ab786

File tree

2 files changed

+101
-40
lines changed

2 files changed

+101
-40
lines changed

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/ColumnOptions.cs

Lines changed: 62 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Collections.ObjectModel;
34
using System.Data;
45

56
namespace Serilog.Sinks.MSSqlServer
@@ -9,7 +10,7 @@ namespace Serilog.Sinks.MSSqlServer
910
/// </summary>
1011
public class ColumnOptions
1112
{
12-
private IDictionary<StandardColumn, string> _store;
13+
ICollection<StandardColumn> _store;
1314

1415
/// <summary>
1516
/// Default constructor.
@@ -20,35 +21,37 @@ public ColumnOptions()
2021

2122
Properties = new PropertiesColumnOptions();
2223

23-
Store = new Dictionary<StandardColumn, string>
24+
Store = new Collection<StandardColumn>
2425
{
25-
{ StandardColumn.Message, StandardColumn.Message.ToString()},
26-
{ StandardColumn.MessageTemplate, StandardColumn.MessageTemplate.ToString()},
27-
{ StandardColumn.Level, StandardColumn.Level.ToString()},
28-
{ StandardColumn.TimeStamp, StandardColumn.TimeStamp.ToString()},
29-
{ StandardColumn.Exception,StandardColumn.Exception.ToString()},
30-
{ StandardColumn.Properties, StandardColumn.Properties.ToString()}
26+
StandardColumn.Message,
27+
StandardColumn.MessageTemplate,
28+
StandardColumn.Level,
29+
StandardColumn.TimeStamp,
30+
StandardColumn.Exception,
31+
StandardColumn.Properties
3132
};
3233

34+
Message = new MessageColumnOptions();
35+
MessageTemplate = new MessageTemplateColumnOptions();
3336
TimeStamp = new TimeStampColumnOptions();
34-
37+
Exception = new ExceptionColumnOptions();
3538
LogEvent = new LogEventColumnOptions();
3639
}
3740

3841
/// <summary>
3942
/// A list of columns that will be stored in the logs table in the database.
4043
/// </summary>
41-
public IDictionary<StandardColumn, string> Store
44+
public ICollection<StandardColumn> Store
4245
{
4346
get { return _store; }
4447
set
4548
{
4649
if (value == null)
4750
{
48-
_store = new Dictionary<StandardColumn, string>();
49-
foreach (StandardColumn column in Enum.GetValues(typeof (StandardColumn)))
51+
_store = new Collection<StandardColumn>();
52+
foreach (StandardColumn column in Enum.GetValues(typeof(StandardColumn)))
5053
{
51-
_store.Add(column, column.ToString());
54+
_store.Add(column);
5255
}
5356
}
5457
else
@@ -63,6 +66,21 @@ public IDictionary<StandardColumn, string> Store
6366
/// </summary>
6467
public ICollection<DataColumn> AdditionalDataColumns { get; set; }
6568

69+
/// <summary>
70+
/// Options for the Exception column.
71+
/// </summary>
72+
public ExceptionColumnOptions Exception { get; set; }
73+
74+
/// <summary>
75+
/// Options for the MessageTemplate column.
76+
/// </summary>
77+
public MessageTemplateColumnOptions MessageTemplate { get; set; }
78+
79+
/// <summary>
80+
/// Options for the Message column.
81+
/// </summary>
82+
public MessageColumnOptions Message { get; set; }
83+
6684
/// <summary>
6785
/// Options for the Level column.
6886
/// </summary>
@@ -86,7 +104,7 @@ public IDictionary<StandardColumn, string> Store
86104
/// <summary>
87105
/// Options for the Level column.
88106
/// </summary>
89-
public class LevelColumnOptions
107+
public class LevelColumnOptions : CommonColumnOptions
90108
{
91109
/// <summary>
92110
/// If true will store Level as an enum in a tinyint column as opposed to a string.
@@ -97,7 +115,7 @@ public class LevelColumnOptions
97115
/// <summary>
98116
/// Options for the Properties column.
99117
/// </summary>
100-
public class PropertiesColumnOptions
118+
public class PropertiesColumnOptions : CommonColumnOptions
101119
{
102120
/// <summary>
103121
/// Default constructor.
@@ -174,10 +192,21 @@ public PropertiesColumnOptions()
174192
public bool UsePropertyKeyAsElementName { get; set; }
175193
}
176194

195+
/// <summary>
196+
/// Shared column customization options.
197+
/// </summary>
198+
public class CommonColumnOptions
199+
{
200+
/// <summary>
201+
/// The name of the column in the database.
202+
/// </summary>
203+
public string ColumnName { get; set; }
204+
}
205+
177206
/// <summary>
178207
/// Options for the TimeStamp column.
179208
/// </summary>
180-
public class TimeStampColumnOptions
209+
public class TimeStampColumnOptions : CommonColumnOptions
181210
{
182211
/// <summary>
183212
/// If true, the time is converted to universal time.
@@ -188,12 +217,27 @@ public class TimeStampColumnOptions
188217
/// <summary>
189218
/// Options for the LogEvent column.
190219
/// </summary>
191-
public class LogEventColumnOptions
220+
public class LogEventColumnOptions : CommonColumnOptions
192221
{
193222
/// <summary>
194223
/// Exclude properties from the LogEvent column if they are being saved to additional columns.
195224
/// </summary>
196225
public bool ExcludeAdditionalProperties { get; set; }
197226
}
227+
228+
/// <summary>
229+
/// Options for the message column
230+
/// </summary>
231+
public class MessageColumnOptions : CommonColumnOptions {}
232+
233+
/// <summary>
234+
/// Options for the Exception column.
235+
/// </summary>
236+
public class ExceptionColumnOptions : CommonColumnOptions {}
237+
238+
/// <summary>
239+
/// Options for the MessageTemplate column.
240+
/// </summary>
241+
public class MessageTemplateColumnOptions : CommonColumnOptions {}
198242
}
199-
}
243+
}

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

Lines changed: 39 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ public MSSqlServerSink(
8989
if (_columnOptions.AdditionalDataColumns != null)
9090
_additionalDataColumnNames = new HashSet<string>(_columnOptions.AdditionalDataColumns.Select(c => c.ColumnName), StringComparer.OrdinalIgnoreCase);
9191

92-
if (_columnOptions.Store.ContainsKey(StandardColumn.LogEvent))
92+
if (_columnOptions.Store.Contains(StandardColumn.LogEvent))
9393
_jsonFormatter = new JsonFormatter(formatProvider: formatProvider);
9494

9595
// Prepare the data table
@@ -168,41 +168,64 @@ DataTable CreateDataTable()
168168

169169
foreach (var standardColumn in _columnOptions.Store)
170170
{
171-
switch (standardColumn.Key)
171+
switch (standardColumn)
172172
{
173173
case StandardColumn.Level:
174174
eventsTable.Columns.Add(new DataColumn
175175
{
176176
DataType = _columnOptions.Level.StoreAsEnum ? typeof(byte) : typeof(string),
177177
MaxLength = _columnOptions.Level.StoreAsEnum ? 0 : 128,
178-
ColumnName = standardColumn.Value
178+
ColumnName = _columnOptions.Level.ColumnName ?? StandardColumn.Level.ToString()
179179
});
180180
break;
181181
case StandardColumn.TimeStamp:
182182
eventsTable.Columns.Add(new DataColumn
183183
{
184-
DataType = Type.GetType("System.DateTime"),
185-
ColumnName = standardColumn.Value,
184+
DataType = typeof(DateTime),
185+
ColumnName = _columnOptions.TimeStamp.ColumnName ?? StandardColumn.TimeStamp.ToString(),
186186
AllowDBNull = false
187187
});
188188
break;
189189
case StandardColumn.LogEvent:
190190
eventsTable.Columns.Add(new DataColumn
191191
{
192-
DataType = Type.GetType("System.String"),
193-
ColumnName = standardColumn.Value
192+
DataType = typeof(string),
193+
ColumnName = _columnOptions.LogEvent.ColumnName ?? StandardColumn.LogEvent.ToString()
194+
});
195+
break;
196+
case StandardColumn.Message:
197+
eventsTable.Columns.Add(new DataColumn
198+
{
199+
DataType = typeof(string),
200+
MaxLength = -1,
201+
ColumnName = _columnOptions.Message.ColumnName ?? StandardColumn.Message.ToString()
202+
});
203+
break;
204+
case StandardColumn.MessageTemplate:
205+
eventsTable.Columns.Add(new DataColumn
206+
{
207+
DataType = typeof(string),
208+
MaxLength = -1,
209+
ColumnName = _columnOptions.MessageTemplate.ColumnName ?? StandardColumn.MessageTemplate.ToString()
194210
});
195211
break;
196-
default:
212+
case StandardColumn.Exception:
197213
eventsTable.Columns.Add(new DataColumn
198214
{
199215
DataType = typeof(string),
200216
MaxLength = -1,
201-
ColumnName = standardColumn.Value
217+
ColumnName = _columnOptions.Exception.ColumnName ?? StandardColumn.Exception.ToString()
218+
});
219+
break;
220+
case StandardColumn.Properties:
221+
eventsTable.Columns.Add(new DataColumn
222+
{
223+
DataType = typeof(string),
224+
MaxLength = -1,
225+
ColumnName = _columnOptions.Properties.ColumnName ?? StandardColumn.Properties.ToString()
202226
});
203227
break;
204228
}
205-
206229
}
207230

208231
if (_columnOptions.AdditionalDataColumns != null)
@@ -225,7 +248,7 @@ void FillDataTable(IEnumerable<LogEvent> events)
225248
{
226249
var row = _eventsTable.NewRow();
227250

228-
foreach (var column in _columnOptions.Store.Keys)
251+
foreach (var column in _columnOptions.Store)
229252
{
230253
switch (column)
231254
{
@@ -239,9 +262,7 @@ void FillDataTable(IEnumerable<LogEvent> events)
239262
row["Level"] = logEvent.Level;
240263
break;
241264
case StandardColumn.TimeStamp:
242-
row["TimeStamp"] = _columnOptions.TimeStamp.ConvertToUtc
243-
? logEvent.Timestamp.DateTime.ToUniversalTime()
244-
: logEvent.Timestamp.DateTime;
265+
row["TimeStamp"] = _columnOptions.TimeStamp.ConvertToUtc ? logEvent.Timestamp.DateTime.ToUniversalTime() : logEvent.Timestamp.DateTime;
245266
break;
246267
case StandardColumn.Exception:
247268
row["Exception"] = logEvent.Exception != null ? logEvent.Exception.ToString() : null;
@@ -289,15 +310,11 @@ private string ConvertPropertiesToXmlStructure(IEnumerable<KeyValuePair<string,
289310

290311
if (options.UsePropertyKeyAsElementName)
291312
{
292-
sb.AppendFormat("<{0}>{1}</{0}>", XmlPropertyFormatter.GetValidElementName(property.Key),
293-
value);
313+
sb.AppendFormat("<{0}>{1}</{0}>", XmlPropertyFormatter.GetValidElementName(property.Key), value);
294314
}
295315
else
296316
{
297-
sb.AppendFormat("<{0} key='{1}'>{2}</{0}>",
298-
options.PropertyElementName,
299-
property.Key,
300-
value);
317+
sb.AppendFormat("<{0} key='{1}'>{2}</{0}>", options.PropertyElementName, property.Key, value);
301318
}
302319
}
303320

@@ -341,15 +358,15 @@ private void ConvertPropertiesToColumn(DataRow row, IReadOnlyDictionary<string,
341358
if (scalarValue == null)
342359
{
343360
row[columnName] = property.Value.ToString();
344-
continue;
361+
continue;
345362
}
346363

347364
if (scalarValue.Value == null && row.Table.Columns[columnName].AllowDBNull)
348365
{
349366
row[columnName] = DBNull.Value;
350367
continue;
351368
}
352-
369+
353370
if (TryChangeType(scalarValue.Value, columnType, out conversion))
354371
{
355372
row[columnName] = conversion;

0 commit comments

Comments
 (0)