public void JoinableString_6_strings() { string name = "RickDrizin"; int orderId = 1001; var combined = JS() + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"created Order {orderId:OrderId}" + $"created Order {orderId:OrderId}" + $"created Order {orderId:OrderId}"; Assert.AreEqual("User '{0:UserName}'\nUser '{1:UserName}'\nUser '{2:UserName}'\ncreated Order {3:OrderId}created Order {4:OrderId}created Order {5:OrderId}", combined.Format); var msg = new StructuredLogMessage(combined); Assert.AreEqual("User '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\ncreated Order {OrderId}created Order {OrderId}created Order {OrderId}", msg.MessageTemplate); Assert.AreEqual(6, msg.Properties.Length); Assert.AreEqual(name, msg.Properties[0]); Assert.AreEqual(name, msg.Properties[1]); Assert.AreEqual(name, msg.Properties[2]); Assert.AreEqual(orderId, msg.Properties[3]); Assert.AreEqual(orderId, msg.Properties[4]); Assert.AreEqual(orderId, msg.Properties[5]); }
public void JoinableString_11_strings() { string name = "RickDrizin"; var combined = JS() + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n" + $"User '{name:UserName}'\n"; Assert.AreEqual("User '{0:UserName}'\nUser '{1:UserName}'\nUser '{2:UserName}'\nUser '{3:UserName}'\nUser '{4:UserName}'\nUser '{5:UserName}'\nUser '{6:UserName}'\nUser '{7:UserName}'\nUser '{8:UserName}'\nUser '{9:UserName}'\nUser '{10:UserName}'\n", combined.Format); var msg = new StructuredLogMessage(combined); Assert.AreEqual("User '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\nUser '{UserName}'\n", msg.MessageTemplate); Assert.AreEqual(11, msg.Properties.Length); Assert.AreEqual(name, msg.Properties[0]); Assert.AreEqual(name, msg.Properties[1]); Assert.AreEqual(name, msg.Properties[2]); }
public static void InterpolatedWarning(this ILogger logger, Exception exception, FormattableString message) { if (!logger.IsEnabled(LogLevel.Warning)) { return; } StructuredLogMessage msg = new StructuredLogMessage(message); logger.LogWarning(exception, msg.MessageTemplate, msg.Properties); }
public static void InterpolatedInformation(this ILogger logger, FormattableString message) { if (!logger.IsEnabled(LogLevel.Information)) { return; } StructuredLogMessage msg = new StructuredLogMessage(message); logger.LogInformation(msg.MessageTemplate, msg.Properties); }
public static void InterpolatedDebug(this ILogger logger, FormattableString message) { if (!logger.IsEnabled(LogEventLevel.Debug)) { return; } StructuredLogMessage msg = new StructuredLogMessage(message); logger.Debug(msg.MessageTemplate, msg.Properties); }
public static void InterpolatedWrite(this ILogger logger, LogEventLevel level, Exception exception, FormattableString message) { if (!logger.IsEnabled(level)) { return; } StructuredLogMessage msg = new StructuredLogMessage(message); logger.Write(level, exception, msg.MessageTemplate, msg.Properties); }
public void NamedProperty_ExplicitSyntax() { DateTime now = DateTime.Now; // The format is explicitly forwarded to the template var msg = new StructuredLogMessage($"Date {NP(now, "Timestamp") }"); Assert.AreEqual("Date {Timestamp}", msg.MessageTemplate); Assert.AreEqual(1, msg.Properties.Length); Assert.AreEqual(now, msg.Properties[0]); }
public void PerformanceTests() { DateTime now = DateTime.Now; int iteractions = 10000; // Explicit NP syntax var sw = Stopwatch.StartNew(); for (int i = 0; i < iteractions; i++) { var msg = new StructuredLogMessage($"... at {NP(now, "Date")}"); string output = msg.MessageTemplate; } System.Diagnostics.Debug.WriteLine($"Syntax 1: {sw.ElapsedMilliseconds}ms"); // Anonymous syntax sw = Stopwatch.StartNew(); for (int i = 0; i < iteractions; i++) { var msg = new StructuredLogMessage($"... at {new { Date = now }}"); string output = msg.MessageTemplate; } System.Diagnostics.Debug.WriteLine($"Syntax 2: {sw.ElapsedMilliseconds}ms"); // Colon syntax sw = Stopwatch.StartNew(); for (int i = 0; i < iteractions; i++) { var msg = new StructuredLogMessage($"...at {now:Date}"); string output = msg.MessageTemplate; } System.Diagnostics.Debug.WriteLine($"Syntax 3: {sw.ElapsedMilliseconds}ms"); // Turns out Expression syntax is quite slow (without any benefit?), so removed. // Expression NP syntax /* sw = Stopwatch.StartNew(); for (int i = 0; i < iteractions; i++) { var msg = new StructuredLogMessage($"... at {NP(x => now)}"); string output = msg.MessageTemplate; } System.Diagnostics.Debug.WriteLine($"Syntax 4: {sw.ElapsedMilliseconds}ms"); // Expression NP syntax without reflecting over propertyName sw = Stopwatch.StartNew(); for (int i = 0; i < iteractions; i++) { var msg = new StructuredLogMessage($"... at {NP(x => now, "Date")}"); string output = msg.MessageTemplate; } System.Diagnostics.Debug.WriteLine($"Syntax 5: {sw.ElapsedMilliseconds}ms"); */ }
public void NullValues_Shouldnt_Crash() { string name = null; int? orderId = null; var msg = new StructuredLogMessage($"User '{name:UserName}' created Order {orderId:OrderId}"); Assert.DoesNotThrow(() => { var prop = msg.Properties; }); Assert.AreEqual("User '{UserName}' created Order {OrderId}", msg.MessageTemplate); Assert.AreEqual(2, msg.Properties.Length); Assert.AreEqual(name, msg.Properties[0]); Assert.AreEqual(orderId, msg.Properties[1]); }
public void SerilogDestructureNamedPropertySyntax() { var input = new { Latitude = 25, Longitude = 134 }; var time = 34; // Serilog has this @ destructuring operator, which in plain Serilog should be used as " {@variable} " // but here in interpolated strings you should use " @{variable} " var msg = new StructuredLogMessage($"Processed {NP(input, "@SensorInput")} in {NP(time, "TimeMS"):000} ms."); Assert.AreEqual("Processed {@SensorInput} in {TimeMS:000} ms.", msg.MessageTemplate); Assert.AreEqual(2, msg.Properties.Length); Assert.AreEqual(input, msg.Properties[0]); Assert.AreEqual(time, msg.Properties[1]); }
public void ColonSyntax_Trim_PropName_Whitespace() { string name = "RickDrizin"; long elapsedTime = 315; int orderId = 1001; DateTime now = DateTime.Now; var msg = new StructuredLogMessage($"User '{name: UserName}' created Order {orderId: OrderId} at {now : Date}, operation took {elapsedTime : OperationElapsedTime}ms"); Assert.AreEqual("User '{UserName}' created Order {OrderId} at {Date}, operation took {OperationElapsedTime}ms", msg.MessageTemplate); Assert.AreEqual(4, msg.Properties.Length); Assert.AreEqual(name, msg.Properties[0]); Assert.AreEqual(orderId, msg.Properties[1]); Assert.AreEqual(now, msg.Properties[2]); Assert.AreEqual(elapsedTime, msg.Properties[3]); }
public void AnonymousSyntax() { string name = "RickDrizin"; long elapsedTime = 315; int orderId = 1001; DateTime now = DateTime.Now; var msg = new StructuredLogMessage($"User '{new { UserName = name }}' created Order {new { OrderId = orderId}} at {new { Date = now }}, operation took {new { OperationElapsedTime = elapsedTime }}ms"); Assert.AreEqual("User '{UserName}' created Order {OrderId} at {Date}, operation took {OperationElapsedTime}ms", msg.MessageTemplate); Assert.AreEqual(4, msg.Properties.Length); Assert.AreEqual(name, msg.Properties[0]); Assert.AreEqual(orderId, msg.Properties[1]); Assert.AreEqual(now, msg.Properties[2]); Assert.AreEqual(elapsedTime, msg.Properties[3]); }
public void Combine_Two_InterpolatedStrings() { string name = "RickDrizin"; int orderId = 1001; // JoinableString() allows us to append multiple interpolated strings using + operator, so we can break long log messages in multiple lines // but for best performance prefer $@ var msg = new StructuredLogMessage(new JoinableString() + $"User '{name:UserName}'\n" + $"created Order {orderId:OrderId}" ); Assert.AreEqual("User '{UserName}'\ncreated Order {OrderId}", msg.MessageTemplate); Assert.AreEqual(2, msg.Properties.Length); Assert.AreEqual(name, msg.Properties[0]); Assert.AreEqual(orderId, msg.Properties[1]); }