From 1d953ea70cad4bf08f33e3a2caa7cecd7bcfe5e5 Mon Sep 17 00:00:00 2001 From: Fernando Belo Date: Wed, 21 Feb 2018 22:28:17 -0300 Subject: [PATCH 1/2] Adding code for Json log format support (Serilog) --- src/YALV.Core/DataService.cs | 12 +- src/YALV.Core/Domain/EntriesProviderType.cs | 2 +- .../Providers/EntriesProviderFactory.cs | 4 +- .../Providers/JsonEntriesProvider.cs | 129 ++++++++++++++++++ src/YALV.Core/YALV.Core.csproj | 7 + src/YALV.Core/packages.config | 4 + src/YALV/Properties/Resources.Designer.cs | 9 ++ src/YALV/Properties/Resources.resx | 3 + src/YALV/ViewModel/MainWindowVM.cs | 2 +- 9 files changed, 168 insertions(+), 4 deletions(-) create mode 100644 src/YALV.Core/Providers/JsonEntriesProvider.cs create mode 100644 src/YALV.Core/packages.config diff --git a/src/YALV.Core/DataService.cs b/src/YALV.Core/DataService.cs index ec41b2b..45439a7 100644 --- a/src/YALV.Core/DataService.cs +++ b/src/YALV.Core/DataService.cs @@ -97,7 +97,17 @@ public static IList ParseLogFile(string path) IEnumerable result = null; try { - AbstractEntriesProvider provider = EntriesProviderFactory.GetProvider(); + AbstractEntriesProvider provider; + + if (Path.GetExtension(path) == ".json") + { + provider = EntriesProviderFactory.GetProvider(EntriesProviderType.Json); + } + else + { + provider = EntriesProviderFactory.GetProvider(); + } + result = provider.GetEntries(path); return result.ToList(); } diff --git a/src/YALV.Core/Domain/EntriesProviderType.cs b/src/YALV.Core/Domain/EntriesProviderType.cs index 7aa58f5..5777c8a 100644 --- a/src/YALV.Core/Domain/EntriesProviderType.cs +++ b/src/YALV.Core/Domain/EntriesProviderType.cs @@ -1,4 +1,4 @@ namespace YALV.Core.Domain { - public enum EntriesProviderType { Xml, Sqlite, MsSqlServer } + public enum EntriesProviderType { Xml, Sqlite, MsSqlServer, Json } } \ No newline at end of file diff --git a/src/YALV.Core/Providers/EntriesProviderFactory.cs b/src/YALV.Core/Providers/EntriesProviderFactory.cs index 39ddf7b..c1abd6f 100644 --- a/src/YALV.Core/Providers/EntriesProviderFactory.cs +++ b/src/YALV.Core/Providers/EntriesProviderFactory.cs @@ -17,7 +17,9 @@ public static AbstractEntriesProvider GetProvider(EntriesProviderType type = Ent case EntriesProviderType.MsSqlServer: return new MsSqlServerEntriesProvider(); - + + case EntriesProviderType.Json: + return new JsonEntriesProvider(); default: var message = String.Format((string) "Type {0} not supported", (object) type); throw new NotImplementedException(message); diff --git a/src/YALV.Core/Providers/JsonEntriesProvider.cs b/src/YALV.Core/Providers/JsonEntriesProvider.cs new file mode 100644 index 0000000..5587a53 --- /dev/null +++ b/src/YALV.Core/Providers/JsonEntriesProvider.cs @@ -0,0 +1,129 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Xml; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +using YALV.Core.Domain; + +namespace YALV.Core.Providers +{ + class JsonEntriesProvider : AbstractEntriesProvider + { + public override IEnumerable GetEntries(string dataSource, FilterParams filter) + { + var entryId = 1; + + FileStream fs = new FileStream(dataSource, System.IO.FileMode.Open, System.IO.FileAccess.Read, System.IO.FileShare.ReadWrite); + StreamReader sr = new StreamReader(fs); + + while (!sr.EndOfStream) + { + var line = sr.ReadLine(); + var lineObject = JsonConvert.DeserializeObject(line); + + LogItem entry = new LogItem() + { + File = dataSource, + Message = lineObject.SelectToken("MessageTemplate")?.Value() ?? "", + TimeStamp = lineObject.SelectToken("Timestamp").Value(), + Level = lineObject.SelectToken("Level")?.Value().ToUpper() ?? "", + App = lineObject.SelectToken("Properties").SelectToken("ProcessName")?.Value() ?? "", + Thread = lineObject.SelectToken("Properties").SelectToken("ThreadId")?.Value() ?? "", + MachineName = lineObject.SelectToken("Properties").SelectToken("MachineName")?.Value() ?? "", + UserName = lineObject.SelectToken("Properties").SelectToken("EnvironmentUserName")?.Value() ?? "", + Id = entryId, + Path = dataSource + }; + + // adjust LEVEL: + if (entry.Level == "INFORMATION") + entry.Level = "INFO"; + else if (entry.Level == "WARNING") + entry.Level = "WARN"; + + + // replace properties into message template + foreach(JProperty property in lineObject.SelectToken("Properties").Children()) + { + string token = "{" + property.Name + "}"; + string value = property.Value.Value(); + + entry.Message = entry.Message.Replace(token, value); + } + + if (filterByParameters(entry, filter)) + { + yield return entry; + entryId++; + } + } + } + + private static bool filterByParameters(LogItem entry, FilterParams parameters) + { + if (entry == null) + throw new ArgumentNullException("entry"); + if (parameters == null) + throw new ArgumentNullException("parameters"); + + bool accept = false; + switch (parameters.Level) + { + case 1: + if (String.Equals(entry.Level, "ERROR", + StringComparison.InvariantCultureIgnoreCase)) + accept = true; + break; + + case 2: + if (String.Equals(entry.Level, "INFO", + StringComparison.InvariantCultureIgnoreCase)) + accept = true; + break; + + case 3: + if (String.Equals(entry.Level, "DEBUG", + StringComparison.InvariantCultureIgnoreCase)) + accept = true; + break; + + case 4: + if (String.Equals(entry.Level, "WARN", + StringComparison.InvariantCultureIgnoreCase)) + accept = true; + break; + + case 5: + if (String.Equals(entry.Level, "FATAL", + StringComparison.InvariantCultureIgnoreCase)) + accept = true; + break; + + default: + accept = true; + break; + } + + if (parameters.Date.HasValue) + if (entry.TimeStamp < parameters.Date) + accept = false; + + if (!String.IsNullOrEmpty(parameters.Thread)) + if (!String.Equals(entry.Thread, parameters.Thread, StringComparison.InvariantCultureIgnoreCase)) + accept = false; + + if (!String.IsNullOrEmpty(parameters.Message)) + if (!entry.Message.ToUpper().Contains(parameters.Message.ToUpper())) + accept = false; + + if (!String.IsNullOrEmpty(parameters.Logger)) + if (!entry.Logger.ToUpper().Contains(parameters.Logger.ToUpper())) + accept = false; + + return accept; + } + } +} \ No newline at end of file diff --git a/src/YALV.Core/YALV.Core.csproj b/src/YALV.Core/YALV.Core.csproj index c33438e..eeb6853 100644 --- a/src/YALV.Core/YALV.Core.csproj +++ b/src/YALV.Core/YALV.Core.csproj @@ -31,6 +31,9 @@ 4 + + ..\packages\Newtonsoft.Json.11.0.1\lib\net40\Newtonsoft.Json.dll + @@ -60,8 +63,12 @@ + + + +