コード例 #1
0
        public void ConfigurationCanFindAndWriteToAnInputWithinAPipeline()
        {
            var healthReporterMock = new Mock <IHealthReporter>();
            var mockOutput         = new Mock <IOutput>();

            using (var serilogInput = new SerilogInput(healthReporterMock.Object))
                using (var pipeline = new DiagnosticPipeline(
                           healthReporterMock.Object,
                           new[] { serilogInput },
                           new IFilter[0],
                           new[] { new EventSink(mockOutput.Object, new IFilter[0]) }))
                {
                    var logger = new LoggerConfiguration()
                                 .WriteTo.EventFlow(pipeline)
                                 .CreateLogger();

                    logger.Information("Hello, world!");
                }
            mockOutput.Verify(output => output.SendEventsAsync(It.Is <IReadOnlyCollection <EventData> >(c => c.Count == 1),
                                                               It.IsAny <long>(), It.IsAny <CancellationToken>()), Times.Exactly(1));
        }
コード例 #2
0
        public void ReportsExceptions()
        {
            var healthReporterMock = new Mock <IHealthReporter>();
            var observer           = new Mock <IObserver <EventData> >();

            using (var serilogInput = new SerilogInput(healthReporterMock.Object))
                using (serilogInput.Subscribe(observer.Object))
                {
                    var logger = new LoggerConfiguration().WriteTo.Sink(serilogInput).CreateLogger();

                    Exception e = new Exception();
                    e.Data["ID"] = 23;
                    string message = "Something bad happened but we do not care that much";
                    logger.Information(e, message);

                    observer.Verify(s => s.OnNext(It.Is <EventData>(data =>
                                                                    data.Payload["Message"].Equals(message) &&
                                                                    data.Level == LogLevel.Informational &&
                                                                    (data.Payload["Exception"] as Exception).Data["ID"].Equals(23)
                                                                    )));
                }
        }
コード例 #3
0
        public void ReportsLevelsProperly()
        {
            var healthReporterMock = new Mock <IHealthReporter>();
            var observer           = new Mock <IObserver <EventData> >();

            using (var serilogInput = new SerilogInput(healthReporterMock.Object))
                using (serilogInput.Subscribe(observer.Object))
                {
                    var logger = new LoggerConfiguration()
                                 .MinimumLevel.Verbose()
                                 .WriteTo.Sink(serilogInput)
                                 .CreateLogger();

                    logger.Information("Info");
                    observer.Verify(s => s.OnNext(It.Is <EventData>(data => data.Level == LogLevel.Informational)));
                    observer.ResetCalls();

                    logger.Debug("Debug");
                    observer.Verify(s => s.OnNext(It.Is <EventData>(data => data.Level == LogLevel.Verbose)));
                    observer.ResetCalls();

                    logger.Verbose("Verbose");
                    observer.Verify(s => s.OnNext(It.Is <EventData>(data => data.Level == LogLevel.Verbose)));
                    observer.ResetCalls();

                    logger.Warning("Warning");
                    observer.Verify(s => s.OnNext(It.Is <EventData>(data => data.Level == LogLevel.Warning)));
                    observer.ResetCalls();

                    logger.Error("Error");
                    observer.Verify(s => s.OnNext(It.Is <EventData>(data => data.Level == LogLevel.Error)));
                    observer.ResetCalls();

                    logger.Fatal("Fatal");
                    observer.Verify(s => s.OnNext(It.Is <EventData>(data => data.Level == LogLevel.Critical)));
                    observer.ResetCalls();
                }
        }
コード例 #4
0
        public void ReportsInformationWithCustomProperties()
        {
            var healthReporterMock = new Mock <IHealthReporter>();
            var observer           = new Mock <IObserver <EventData> >();

            using (var serilogInput = new SerilogInput(healthReporterMock.Object))
                using (serilogInput.Subscribe(observer.Object))
                {
                    var logger = new LoggerConfiguration().WriteTo.Sink(serilogInput).CreateLogger();

                    // Render the string value without quotes; render the double value with fixed decimal point, 1 digit after decimal point
                    string message = "{alpha:l}{bravo:f1}{charlie}";
                    logger.Information(message, "aaa", 75.5, false);

                    observer.Verify(s => s.OnNext(It.Is <EventData>(data =>
                                                                    data.Payload["Message"].Equals("aaa75.5" + Boolean.FalseString) &&
                                                                    data.Level == LogLevel.Informational &&
                                                                    data.Payload["alpha"].Equals("aaa") &&
                                                                    data.Payload["bravo"].Equals(75.5) &&
                                                                    data.Payload["charlie"].Equals(false)
                                                                    )));
                }
        }
コード例 #5
0
        public void UsesSerilogMaxDestructuringDepth()
        {
            // Create object structure 5 levels deep
            var bravo = new EntityWithChildren()
            {
                Name = "Bravo"
            };
            var alpha = new EntityWithChildren("Alpha", new EntityWithChildren[] { bravo });

            var healthReporterMock = new Mock <IHealthReporter>();
            var observer           = new Mock <IObserver <EventData> >();
            IDictionary <string, object> spiedPayload = null;

            observer.Setup(p => p.OnNext(It.IsAny <EventData>()))
            .Callback <EventData>((p) => { spiedPayload = p.Payload; });

            SerilogInputConfiguration configuration = new SerilogInputConfiguration()
            {
                UseSerilogDepthLevel = true
            };


            using (var serilogInput = new SerilogInput(configuration, healthReporterMock.Object))
                using (serilogInput.Subscribe(observer.Object))
                {
                    var logger = new LoggerConfiguration().WriteTo.Sink(serilogInput).Destructure.ToMaximumDepth(2).CreateLogger();

                    logger.Information("Here is an {@entity}", alpha);
                }

            // At depth 2 there should be no children (only a null child placeholder)
            var e = (IDictionary <string, object>)spiedPayload["entity"];

            Assert.Equal("Alpha", e["Name"]);
            Assert.Collection((object[])e["Children"], c => Assert.Null(c));


            using (var serilogInput = new SerilogInput(configuration, healthReporterMock.Object))
                using (serilogInput.Subscribe(observer.Object))
                {
                    var logger = new LoggerConfiguration().WriteTo.Sink(serilogInput).Destructure.ToMaximumDepth(3).CreateLogger();

                    logger.Information("Here is an {@entity}", alpha);
                }

            // At depth 3 there should be one child of Alpha, but all its properties should be blank
            Assert.Equal("Alpha", ((IDictionary <string, object>)spiedPayload["entity"])["Name"]);
            var childrenOfAlpha = ((IDictionary <string, object>)spiedPayload["entity"])["Children"] as object[];

            Assert.Single(childrenOfAlpha);
            var b = childrenOfAlpha.First() as IDictionary <string, object>;

            Assert.True(b.ContainsKey("Name"));
            Assert.Null(b["Name"]);
            Assert.True(b.ContainsKey("Children"));
            Assert.Null(b["Children"]);


            using (var serilogInput = new SerilogInput(configuration, healthReporterMock.Object))
                using (serilogInput.Subscribe(observer.Object))
                {
                    var logger = new LoggerConfiguration().WriteTo.Sink(serilogInput).Destructure.ToMaximumDepth(4).CreateLogger();

                    logger.Information("Here is an {@entity}", alpha);
                }

            // At depth 4 the child of Alpha (Bravo) should have its properties set, "Name" in particular.
            Assert.Equal("Alpha", ((IDictionary <string, object>)spiedPayload["entity"])["Name"]);
            childrenOfAlpha = ((IDictionary <string, object>)spiedPayload["entity"])["Children"] as object[];
            Assert.Single(childrenOfAlpha);
            b = childrenOfAlpha.First() as IDictionary <string, object>;
            Assert.Equal("Bravo", b["Name"]);
        }