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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
        }
示例#7
0
        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]);
        }
示例#8
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");
            */
        }
示例#9
0
        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]);
        }
示例#10
0
        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]);
        }
示例#11
0
        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]);
        }
示例#12
0
        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]);
        }
示例#13
0
        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]);
        }