Example #1
0
        static LogEvent[] ReadBatch(LogEventReader reader, Func <LogEvent, bool> filter,
                                    int count, InvalidDataHandling invalidDataHandling)
        {
            var batch = new List <LogEvent>();

            do
            {
                try
                {
                    while (batch.Count < count && reader.TryRead(out var evt))
                    {
                        if (filter == null || filter(evt))
                        {
                            batch.Add(evt);
                        }
                    }
                }
                catch (Exception ex)
                {
                    if (ex is JsonReaderException || ex is InvalidDataException)
                    {
                        if (invalidDataHandling == InvalidDataHandling.Ignore)
                        {
                            continue;
                        }
                    }

                    throw;
                }

                return(batch.ToArray());
            } while (true);
        }
Example #2
0
        public IActionResult LogEvent([FromQuery] bool clef)
        {
            var isValidMediaType = clef || this.Request.ContentType?.StartsWith(ClefMediaType, StringComparison.OrdinalIgnoreCase) == true;

            if (!isValidMediaType)
            {
                return(this.StatusCode((int)HttpStatusCode.UnsupportedMediaType));
            }

            using (var streamReader = new StreamReader(this.Request.Body))
                using (var logEventReader = new LogEventReader(streamReader))
                {
                    try
                    {
                        while (logEventReader.TryRead(out var logEvent))
                        {
                            Log.Write(logEvent);
                        }
                    }
                    catch (Exception ex)
                    {
                        return(this.BadRequest(ex.Message));
                    }
                }

            // LINK (Cameron): https://github.com/serilog/serilog-sinks-seq/blob/9fe533663448c5ca799c4bb3d3e57c9ca6ed302b/src/Serilog.Sinks.Seq/Sinks/Seq/SeqApi.cs#L37
            return(new ContentResult
            {
                Content = @"{""MinimumLevelAccepted"":null}",
                ContentType = "application/json",
                StatusCode = (int)HttpStatusCode.Created,
            });
        }
Example #3
0
        private RockLogEvent GetLogEventFromLogLine(string logLine)
        {
            try
            {
                var evt = LogEventReader.ReadFromString(logLine, _jsonSerializer);

                var domain = evt.Properties["domain"].ToString();
                evt.RemovePropertyIfPresent("domain");

                var message = evt.RenderMessage().Replace("{domain}", "").Trim();
                domain = domain.Replace("\"", "");

                return(new RockLogEvent
                {
                    DateTime = evt.Timestamp.DateTime.ToLocalTime(),
                    Exception = evt.Exception,
                    Level = GetRockLogLevelFromSerilogLevel(evt.Level),
                    Domain = domain,
                    Message = message
                });
            }
            catch (Exception ex)
            {
                // In rare instances it is possible that the event didn't get completely flushed to the log
                // and when that happens it won't be able to be correctly parsed so we need to handle that gracefully.
                ExceptionLogService.LogException(ex);
                return(null);
            }
        }
        public void MissingMessagesAreAcceptedAsEmpty()
        {
            const string document = "{\"@t\":\"2016-10-12T04:20:58.0554314Z\"}";
            var          evt      = LogEventReader.ReadFromString(document);

            Assert.Empty(evt.MessageTemplate.Tokens);
        }
Example #5
0
        public static LogEvent ReadFromJObject(JObject jObject)
        {
            if (!jObject.TryGetValue("@t", out _))
            {
                jObject.Add("@t", new JValue(DateTime.UtcNow.ToString("O")));
            }

            if (jObject.TryGetValue("@l", out var levelToken))
            {
                jObject.Remove("@l");

                var serilogLevel = LevelMapping.ToSerilogLevel(levelToken.Value <string>());
                if (serilogLevel != LogEventLevel.Information)
                {
                    jObject.Add("@l", new JValue(serilogLevel.ToString()));
                }

                jObject.Add(SurrogateLevelProperty.PropertyName, levelToken);
            }
            else
            {
                jObject.Add(SurrogateLevelProperty.PropertyName, new JValue("Information"));
            }

            return(LogEventReader.ReadFromJObject(jObject));
        }
Example #6
0
        public static void PipeEvents(LogEventReader source, Logger destination, InvalidDataHandling invalidDataHandling)
        {
            do
            {
                try
                {
                    while (source.TryRead(out var evt))
                    {
                        destination.Write(evt);
                    }

                    return;
                }
                catch (Exception ex)
                {
                    if (ex is JsonReaderException || ex is InvalidDataException)
                    {
                        if (invalidDataHandling == InvalidDataHandling.Ignore)
                        {
                            continue;
                        }

                        if (invalidDataHandling == InvalidDataHandling.Report)
                        {
                            destination.Error(ex, "An event was not in CLEF format.");
                            continue;
                        }
                    }

                    throw;
                }
            } while (true);
        }
        public void MessagesAreEscapedIntoTemplates()
        {
            const string document = "{\"@t\":\"2016-10-12T04:20:58.0554314Z\",\"@m\":\"Hello, {text}\"}";
            var          evt      = LogEventReader.ReadFromString(document);

            Assert.Equal("Hello, {{text}}", evt.MessageTemplate.Text);
        }
Example #8
0
        /// <summary>Creates an new instance by loading the specified reader.</summary>
        /// <param name="reader">The reader to load the instance from.</param>
        /// <returns>A new instance deserialize from the specifed reader.</returns>
        public static LogEvent Load(XmlReader reader)
        {
            var logReader = new LogEventReader();
            var instance  = logReader.Read(reader);

            return(instance);
        }
Example #9
0
        public LogRecord(MainWindowViewModel outer, string rowText, int lineNumber)
        {
            outer.WeakPropertyChanged += (sender, args) =>
            {
                switch (args.PropertyName)
                {
                case nameof(MainWindowViewModel.Render):
                    RaisePropertiesChanged(nameof(DisplayText));
                    break;

                case nameof(MainWindowViewModel.ShowUTC):
                    RaisePropertiesChanged(nameof(Timestamp));
                    break;
                }
            };
            _outer     = outer;
            LineNumber = lineNumber;
            RowText    = rowText.Trim();
            _logEvent  = new Lazy <LogEvent>(() =>
            {
                try
                {
                    return(LogEventReader.ReadFromJObject(JObject.Parse(RowText)));
                }
                catch
                {
                    return(new LogEvent(DateTimeOffset.MinValue, LogEventLevel.Verbose, new Exception(), MessageTemplate.Empty, Enumerable.Empty <LogEventProperty>()));
                }
            });
        }
        public List <LogEvent> ReadLogs(string filePath, Logger logger = null)
        {
            var logItems = new List <LogEvent>();

            using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
            {
                using (var stream = new StreamReader(fs))
                {
                    var reader = new LogEventReader(stream);
                    while (TryRead(reader, out var evt))
                    {
                        if (evt == null)
                        {
                            continue;
                        }

                        if (logger != null)
                        {
                            //We can persist the log item (using the passed in Serilog config)
                            //In this case a Logger with File Sink setup
                            logger.Write(evt);
                        }

                        logItems.Add(evt);
                    }
                }
            }

            _logItems   = logItems;
            LogFilePath = filePath;
            LogIsOpen   = true;

            return(_logItems);
        }
Example #11
0
        public void ReadPropertiesWhiteSpace()
        {
            string xml = @"<LogEvent>
    <Properties>
        <Property>
            <Name>Test</Name>
            <Value>ErrorWrite</Value>
        </Property>
    </Properties>
</LogEvent>";

            var sr     = new StringReader(xml);
            var reader = XmlReader.Create(sr);

            var logReader = new LogEventReader();
            var log       = logReader.Read(reader);

            log.Should().NotBeNull();

            log.Properties.Should().NotBeNull();
            log.Properties.Should().NotBeEmpty();
            log.Properties.Count.Should().Be(1);

            log.Properties[0].Name.Should().Be("Test");
            log.Properties[0].Value.Should().Be("ErrorWrite");
        }
Example #12
0
    protected override IReadOnlyList <LogEvent> GetLogs(LogTimePeriod logTimePeriod, ILogFilter filter, int skip,
                                                        int take)
    {
        var logs = new List <LogEvent>();

        var count = 0;

        // foreach full day in the range - see if we can find one or more filenames that end with
        // yyyyMMdd.json - Ends with due to MachineName in filenames - could be 1 or more due to load balancing
        for (DateTime day = logTimePeriod.StartTime.Date; day.Date <= logTimePeriod.EndTime.Date; day = day.AddDays(1))
        {
            // Filename ending to search for (As could be multiple)
            var filesToFind = GetSearchPattern(day);

            var filesForCurrentDay = Directory.GetFiles(_logsPath, filesToFind);

            // Foreach file we find - open it
            foreach (var filePath in filesForCurrentDay)
            {
                // Open log file & add contents to the log collection
                // Which we then use LINQ to page over
                using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    using (var stream = new StreamReader(fs))
                    {
                        var reader = new LogEventReader(stream);
                        while (TryRead(reader, out LogEvent? evt))
                        {
                            // We may get a null if log line is malformed
                            if (evt == null)
                            {
                                continue;
                            }

                            if (count > skip + take)
                            {
                                break;
                            }

                            if (count < skip)
                            {
                                count++;
                                continue;
                            }

                            if (filter.TakeLogEvent(evt))
                            {
                                logs.Add(evt);
                            }

                            count++;
                        }
                    }
                }
            }
        }

        return(logs);
    }
        public void HandlesDefaultJsonNetSerialization()
        {
            const string document = "{\"@t\":\"2016-10-12T04:20:58.0554314Z\",\"@m\":\"Hello\"}";
            var          jObject  = JsonConvert.DeserializeObject <JObject>(document);
            var          evt      = LogEventReader.ReadFromJObject(jObject);

            Assert.Equal(DateTimeOffset.Parse("2016-10-12T04:20:58.0554314Z"), evt.Timestamp);
        }
Example #14
0
 private AnalogyLogMessage ParserJObject(JObject jo, ILogger analogy)
 {
     var evt = LogEventReader.ReadFromJObject(jo);
     {
         analogy.Write(evt);
         return(CommonParser.ParseLogEventProperties(evt));
     }
 }
Example #15
0
        private void HandleLogEvent(string serializedEvent)
        {
            var eventReader = new LogEventReader(new StringReader(serializedEvent));

            while (eventReader.TryRead(out var logEvent))
            {
                LogEventArrived?.Invoke(this, new LogEventArrivedEventArgs(logEvent));
            }
        }
        public void RoundTripsTypeTags()
        {
            const string document = "{\"@t\":\"2016-10-12T04:20:58.0554314Z\",\"@m\":\"Hello\",\"User\":{\"$type\":\"TestUser\",\"Name\":\"nblumhardt\"}}";
            var          evt      = LogEventReader.ReadFromString(document);

            var user = (StructureValue)evt.Properties["User"];

            Assert.Equal("TestUser", user.TypeTag);
        }
Example #17
0
        public async Task Invoke(HttpContext context, Func <Task> next)
        {
            if (context.Request.Path != _endpointPath)
            {
                await next();

                return;
            }

            var reader = new StreamReader(context.Request.Body);

            var line = await reader.ReadLineAsync();

            while (line != null)
            {
                if (!string.IsNullOrWhiteSpace(line))
                {
                    if (line.Length > _eventBodyLimitBytes)
                    {
                        var startToLog = (int)Math.Min(_eventBodyLimitBytes ?? 1024, 1024);
                        var prefix     = line.Substring(0, startToLog);
                        SelfLog.WriteLine("Dropping oversize event from {0} of {1} chars: {2}", context.Connection.RemoteIpAddress, line.Length, prefix);
                        line = reader.ReadLine();
                        continue;
                    }

                    try
                    {
                        var jObject = JsonConvert.DeserializeObject <JObject>(line);
                        var evt     = LogEventReader.ReadFromJObject(jObject);
                        if (_clientLevelSwitch == null || evt.Level >= _clientLevelSwitch.MinimumLevel)
                        {
                            if (_originPropertyName != null)
                            {
                                evt.RemovePropertyIfPresent(_originPropertyName); // Ensure the client can't override this
                            }
                            _log.Write(evt);
                        }
                    }
                    catch (Exception ex)
                    {
                        SelfLog.WriteLine("Failed to deserialize event from {0}: {1}", context.Connection.RemoteIpAddress, ex);
                    }
                }

                line = await reader.ReadLineAsync();
            }

            context.Response.StatusCode = 201;
            if (_clientLevelSwitch != null)
            {
                await context.Response.WriteAsync("{\"MinimumLevelAccepted\":\"" + _clientLevelSwitch.MinimumLevel + "\"}");
            }
        }
        public void PassesThroughUnrecognizedReifiedProperties()
        {
            const string document = "{\"@t\":\"2016-10-12T04:20:58.0554314Z\",\"@m\":\"Hello\",\"@foo\":42}";
            var          evt      = LogEventReader.ReadFromString(document);

            var foo = evt.Properties["@foo"];

            Assert.Equal(42L, ((ScalarValue)foo).Value);

            // Ensure we don't just forward everything
            Assert.False(evt.Properties.ContainsKey("@m"));
        }
Example #19
0
        public void ReadErrorNull()
        {
            string xml = "<LogEvent><Error /></LogEvent>";

            var sr     = new StringReader(xml);
            var reader = XmlReader.Create(sr);

            var logReader = new LogEventReader();
            var log       = logReader.Read(reader);

            log.Should().NotBeNull();
        }
Example #20
0
        static LogEvent[] PipeEvents(string input, InvalidDataHandling invalidDataHandling)
        {
            var output = new CollectingSink();

            using (var source = new LogEventReader(new StringReader(input)))
                using (var destination = new LoggerConfiguration()
                                         .MinimumLevel.Is(LevelAlias.Minimum)
                                         .WriteTo.Sink(output)
                                         .CreateLogger())
                {
                    EventPipe.PipeEvents(source, destination, invalidDataHandling);
                }

            return(output.Events);
        }
Example #21
0
        private bool TryRead(LogEventReader reader, out LogEvent evt)
        {
            try
            {
                return(reader.TryRead(out evt));
            }
            catch (JsonReaderException ex)
            {
                // As we are reading/streaming one line at a time in the JSON file
                // Thus we can not report the line number, as it will always be 1
                _logger.Error <JsonLogViewer>(ex, "Unable to parse a line in the JSON log file");

                evt = null;
                return(true);
            }
        }
        public void BasicFieldsAreRead()
        {
            const string document = "{\"@t\":\"2016-10-12T04:20:58.0554314Z\",\"@mt\":\"Hello, {@User}\",\"User\":{\"Name\":\"nblumhardt\",\"Id\":101}}";
            var          evt      = LogEventReader.ReadFromString(document);

            Assert.Equal(DateTimeOffset.Parse("2016-10-12T04:20:58.0554314Z"), evt.Timestamp);
            Assert.Equal(LogEventLevel.Information, evt.Level);
            Assert.Equal("Hello, {@User}", evt.MessageTemplate.Text);

            var user = (StructureValue)evt.Properties["User"];

            Assert.Equal("Name", user.Properties[0].Name);
            Assert.Equal(new ScalarValue("nblumhardt"), (ScalarValue)user.Properties[0].Value);
            Assert.Equal("Id", user.Properties[1].Name);
            Assert.Equal(101L, ((ScalarValue)user.Properties[1].Value).Value);
        }
        public void AllEventsAreRead()
        {
            var all = new List <LogEvent>();

            using (var clef = File.OpenText("LogEventReaderTests.clef"))
            {
                var      reader = new LogEventReader(clef);
                LogEvent evt;
                while (reader.TryRead(out evt))
                {
                    all.Add(evt);
                }
            }

            Assert.Equal(5, all.Count);
        }
Example #24
0
        public IActionResult GetSystemLog()
        {
            List <LogEvent> logs = new List <LogEvent>();

            // configure strongly typed settings objects
            var logPath = Configuration.GetSection("AppSettings").Get <AppSettings>().LogPath;

            DirectoryInfo di = new DirectoryInfo(logPath);

            di = di.Parent;

            DateTime now = DateTime.Now;
            var      patternYesterday = $"log-{now.AddDays(-1).ToString("yyyyMMdd")}*.log";
            var      patternToday     = $"log-{now.ToString("yyyyMMdd")}*.log";

            //get log files and sort
            var yesterdayLogs = di.GetFiles(patternYesterday).ToList();
            var todayLogs     = di.GetFiles(patternToday).ToList();

            yesterdayLogs = yesterdayLogs.OrderBy(o => o.CreationTime).ToList();
            todayLogs     = todayLogs.OrderBy(o => o.CreationTime).ToList();

            List <FileInfo> logfiles = new List <FileInfo>();

            logfiles.AddRange(yesterdayLogs);
            logfiles.AddRange(todayLogs);

            string result = string.Empty;

            foreach (var fi in logfiles)
            {
                using (var clef = System.IO.File.Open(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                {
                    TextReader tr     = new StreamReader(clef);
                    var        reader = new LogEventReader(tr);

                    LogEvent evt;
                    while (reader.TryRead(out evt))
                    {
                        logs.Add(evt);
                    }
                }
            }

            logs.Reverse();
            return(Ok(new { Logs = logs }));
        }
Example #25
0
        public void ReaderNoWhiteSpace()
        {
            string xml = @"<LogEvent><SequenceID>1</SequenceID><TimeStamp>2012-09-24T09:09:59.5433403-05:00</TimeStamp><Level>Error</Level><LoggerName>LogEventWriterTest</LoggerName><Message>Error reading file 'blah.txt'.</Message></LogEvent>";

            var sr     = new StringReader(xml);
            var reader = XmlReader.Create(sr);

            var logReader = new LogEventReader();
            var log       = logReader.Read(reader);

            log.Should().NotBeNull();
            log.SequenceID.Should().Be(1);
            log.TimeStamp.Should().Be(DateTime.Parse("2012-09-24T09:09:59.5433403-05:00"));
            log.Level.Should().Be("Error");
            log.LoggerName.Should().Be("LogEventWriterTest");
            log.Message.Should().Be("Error reading file 'blah.txt'.");
        }
Example #26
0
        public async Task <IEnumerable <AnalogyLogMessage> > Process(string fileName, CancellationToken token, ILogMessageCreatedHandler messagesHandler)
        {
            var messages = await Task <IEnumerable <AnalogyLogMessage> > .Factory.StartNew(() =>
            {
                List <AnalogyLogMessage> parsedMessages = new List <AnalogyLogMessage>();
                try
                {
                    using (var analogy = new LoggerConfiguration()
                                         .WriteTo.Analogy()
                                         .CreateLogger())
                    {
                        using (var fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                            using (var clef = new StreamReader(fileStream, encoding: Encoding.UTF8))
                            {
                                var reader = new LogEventReader(clef);
                                while (reader.TryRead(out var evt))
                                {
                                    analogy.Write(evt);
                                    AnalogyLogMessage m = CommonParser.ParseLogEventProperties(evt);
                                    if (TimeStampTimeZone != null)
                                    {
                                        m.Date = TimeZoneInfo.ConvertTimeFromUtc(m.Date, TimeStampTimeZone);
                                    }
                                    parsedMessages.Add(m);
                                }

                                messagesHandler.AppendMessages(parsedMessages, fileName);
                                return(parsedMessages);
                            }
                    }
                }
                catch (Exception e)
                {
                    AnalogyLogMessage empty = new AnalogyLogMessage($"Error reading file {fileName}: Error: {e.Message}",
                                                                    AnalogyLogLevel.Error, AnalogyLogClass.General, "Analogy", "None");
                    empty.Source = nameof(ClefParser);
                    empty.Module = "Analogy.LogViewer.Serilog";
                    parsedMessages.Add(empty);
                    messagesHandler.AppendMessages(parsedMessages, fileName);
                    return(parsedMessages);
                }
            });

            return(messages);
        }
        private async void ReadEventsLoop()
        {
            var waitStream = new AsyncToSyncProgressStream(logConnection, cancellationTokenSource.Token);
            var reader     = new LogEventReader(new StreamReader(waitStream));

            while (await waitStream.WaitForData())
            {
                try
                {
                    if (reader.TryRead(out var logEvent))
                    {
                        HandleEvent(logEvent);
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }
        }
Example #28
0
        public UIElement GetView(HttpResponseMessage responseMessage, CommandResultDto dto, IServiceProvider serviceProvider)
        {
            if (responseMessage.Content?.Headers.ContentType.MediaType != "maze/jsonlog")
            {
                return(null);
            }

            var log       = responseMessage.Content.ReadAsStringAsync().Result;
            var logEvents = new List <LogEvent>();

            using (var stringReader = new StringReader(log))
            {
                var logReader = new LogEventReader(stringReader);
                while (logReader.TryRead(out var logEvent))
                {
                    logEvents.Add(logEvent);
                }
            }

            return(new LogView(logEvents));
        }
Example #29
0
        private RockLogEvent GetLogEventFromLogLine(string logLine)
        {
            var evt = LogEventReader.ReadFromString(logLine, jsonSerializer);

            var domain = evt.Properties["domain"].ToString();

            evt.RemovePropertyIfPresent("domain");

            var message = evt.RenderMessage().Replace("{domain}", "").Trim();

            domain = domain.Replace("\"", "");

            return(new RockLogEvent
            {
                DateTime = evt.Timestamp.DateTime.ToLocalTime(),
                Exception = evt.Exception,
                Level = GetRockLogLevelFromSerilogLevel(evt.Level),
                Domain = domain,
                Message = message
            });
        }
Example #30
0
        public async Task <ReadResult> TryReadAsync()
        {
            var frame = await _reader.TryReadAsync();

            if (!frame.HasValue)
            {
                return(new ReadResult(null, frame.IsAtEnd));
            }

            if (frame.IsOrphan)
            {
                throw new InvalidDataException($"A line arrived late or could not be parsed: `{frame.Value.Trim()}`.");
            }

            var frameValue = new JsonTextReader(new StringReader(frame.Value));

            if (!(_serializer.Deserialize <JToken>(frameValue) is JObject jobject))
            {
                throw new InvalidDataException($"The line is not a JSON object: `{frame.Value.Trim()}`.");
            }

            if (!jobject.TryGetValue("@t", out _))
            {
                jobject.Add("@t", new JValue(DateTime.UtcNow.ToString("O")));
            }

            if (jobject.TryGetValue("@l", out var levelToken))
            {
                jobject.Remove("@l");
                jobject.Add(SurrogateLevelProperty.PropertyName, levelToken);
            }
            else
            {
                jobject.Add(SurrogateLevelProperty.PropertyName, new JValue("Information"));
            }

            var evt = LogEventReader.ReadFromJObject(jobject);

            return(new ReadResult(evt, frame.IsAtEnd));
        }