Skip to content

Commit eef98c4

Browse files
author
Colin Young
committed
Merge branch 'custom-column-names' into localdb-tests
2 parents 061dc5c + 31ab786 commit eef98c4

File tree

2 files changed

+97
-42
lines changed

2 files changed

+97
-42
lines changed

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

Lines changed: 58 additions & 20 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.
@@ -22,35 +23,37 @@ public ColumnOptions()
2223

2324
Properties = new PropertiesColumnOptions();
2425

25-
Store = new Dictionary<StandardColumn, string>
26+
Store = new Collection<StandardColumn>
2627
{
27-
{ StandardColumn.Message, StandardColumn.Message.ToString()},
28-
{ StandardColumn.MessageTemplate, StandardColumn.MessageTemplate.ToString()},
29-
{ StandardColumn.Level, StandardColumn.Level.ToString()},
30-
{ StandardColumn.TimeStamp, StandardColumn.TimeStamp.ToString()},
31-
{ StandardColumn.Exception,StandardColumn.Exception.ToString()},
32-
{ StandardColumn.Properties, StandardColumn.Properties.ToString()}
28+
StandardColumn.Message,
29+
StandardColumn.MessageTemplate,
30+
StandardColumn.Level,
31+
StandardColumn.TimeStamp,
32+
StandardColumn.Exception,
33+
StandardColumn.Properties
3334
};
3435

36+
Message = new MessageColumnOptions();
37+
MessageTemplate = new MessageTemplateColumnOptions();
3538
TimeStamp = new TimeStampColumnOptions();
36-
39+
Exception = new ExceptionColumnOptions();
3740
LogEvent = new LogEventColumnOptions();
3841
}
3942

4043
/// <summary>
4144
/// A list of columns that will be stored in the logs table in the database.
4245
/// </summary>
43-
public IDictionary<StandardColumn, string> Store
46+
public ICollection<StandardColumn> Store
4447
{
4548
get { return _store; }
4649
set
4750
{
4851
if (value == null)
4952
{
50-
_store = new Dictionary<StandardColumn, string>();
51-
foreach (StandardColumn column in Enum.GetValues(typeof (StandardColumn)))
53+
_store = new Collection<StandardColumn>();
54+
foreach (StandardColumn column in Enum.GetValues(typeof(StandardColumn)))
5255
{
53-
_store.Add(column, column.ToString());
56+
_store.Add(column);
5457
}
5558
}
5659
else
@@ -65,10 +68,19 @@ public IDictionary<StandardColumn, string> Store
6568
/// </summary>
6669
public ICollection<DataColumn> AdditionalDataColumns { get; set; }
6770

71+
/// Options for the Exception column.
72+
/// </summary>
73+
public ExceptionColumnOptions Exception { get; set; }
74+
6875
/// <summary>
69-
/// Options for the Id column.
76+
/// Options for the MessageTemplate column.
77+
/// </summary>
78+
public MessageTemplateColumnOptions MessageTemplate { get; set; }
79+
80+
/// <summary>
81+
/// Options for the Message column.
7082
/// </summary>
71-
public IdColumnOptions Id { get; private set; }
83+
public MessageColumnOptions Message { get; set; }
7284

7385
/// <summary>
7486
/// Options for the Level column.
@@ -104,7 +116,7 @@ public class IdColumnOptions
104116
/// <summary>
105117
/// Options for the Level column.
106118
/// </summary>
107-
public class LevelColumnOptions
119+
public class LevelColumnOptions : CommonColumnOptions
108120
{
109121
/// <summary>
110122
/// If true will store Level as an enum in a tinyint column as opposed to a string.
@@ -115,7 +127,7 @@ public class LevelColumnOptions
115127
/// <summary>
116128
/// Options for the Properties column.
117129
/// </summary>
118-
public class PropertiesColumnOptions
130+
public class PropertiesColumnOptions : CommonColumnOptions
119131
{
120132
/// <summary>
121133
/// Default constructor.
@@ -192,10 +204,21 @@ public PropertiesColumnOptions()
192204
public bool UsePropertyKeyAsElementName { get; set; }
193205
}
194206

207+
/// <summary>
208+
/// Shared column customization options.
209+
/// </summary>
210+
public class CommonColumnOptions
211+
{
212+
/// <summary>
213+
/// The name of the column in the database.
214+
/// </summary>
215+
public string ColumnName { get; set; }
216+
}
217+
195218
/// <summary>
196219
/// Options for the TimeStamp column.
197220
/// </summary>
198-
public class TimeStampColumnOptions
221+
public class TimeStampColumnOptions : CommonColumnOptions
199222
{
200223
/// <summary>
201224
/// If true, the time is converted to universal time.
@@ -206,12 +229,27 @@ public class TimeStampColumnOptions
206229
/// <summary>
207230
/// Options for the LogEvent column.
208231
/// </summary>
209-
public class LogEventColumnOptions
232+
public class LogEventColumnOptions : CommonColumnOptions
210233
{
211234
/// <summary>
212235
/// Exclude properties from the LogEvent column if they are being saved to additional columns.
213236
/// </summary>
214237
public bool ExcludeAdditionalProperties { get; set; }
215238
}
239+
240+
/// <summary>
241+
/// Options for the message column
242+
/// </summary>
243+
public class MessageColumnOptions : CommonColumnOptions {}
244+
245+
/// <summary>
246+
/// Options for the Exception column.
247+
/// </summary>
248+
public class ExceptionColumnOptions : CommonColumnOptions {}
249+
250+
/// <summary>
251+
/// Options for the MessageTemplate column.
252+
/// </summary>
253+
public class MessageTemplateColumnOptions : CommonColumnOptions {}
216254
}
217-
}
255+
}

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)