From 5e93960752cbe310b780f06265a9b615d2adbd06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B0=D0=B7=D0=B0=D1=80=D0=BE=D0=B2=20=D0=90=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=BD=20=28Nazarov=5FAA=29?= Date: Mon, 6 Jun 2022 15:47:04 +0400 Subject: [PATCH 1/5] =?UTF-8?q?=D0=A0=D0=B0=D1=81=D0=BA=D1=80=D1=8B=D1=82?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BA=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8E(mt)=20=D0=B2=20=D0=B5=D0=B3=D0=BE=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BA=D1=81=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DirectumLogConverter/ConvertOptions.cs | 3 ++ DirectumLogConverter/Converter.cs | 48 ++++++++++++++++++++++++++ 2 files changed, 51 insertions(+) diff --git a/DirectumLogConverter/ConvertOptions.cs b/DirectumLogConverter/ConvertOptions.cs index 6d15502..c5f8ac9 100644 --- a/DirectumLogConverter/ConvertOptions.cs +++ b/DirectumLogConverter/ConvertOptions.cs @@ -20,6 +20,9 @@ internal sealed class ConvertOptions [Option('c', "csv", Default = false)] public bool CsvFormat { get; set; } + [Option('m', "mergeArguments", Default = false)] + public bool NeedMergingArgumentsIntoMessageText { get; set; } + #endregion #region Методы diff --git a/DirectumLogConverter/Converter.cs b/DirectumLogConverter/Converter.cs index 004bada..c442f10 100644 --- a/DirectumLogConverter/Converter.cs +++ b/DirectumLogConverter/Converter.cs @@ -15,6 +15,11 @@ internal static class Converter { #region Поля и свойства + /// + /// Опции конвертации. + /// + private static ConvertOptions CurrentOptions; + /// /// Количество потоков, которое будет использовано для конвертации. /// @@ -40,6 +45,7 @@ internal static class Converter /// Опции конвертации. internal static void ConvertJson(ConvertOptions options) { + CurrentOptions = options; IOutputLineFormatter formatter = options.CsvFormat ? new CsvLineFormatter() : new TsvLineFormatter(); using var readerStream = new FileStream(options.InputPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite, 4096, FileOptions.SequentialScan); using var reader = new StreamReader(readerStream, Encoding.UTF8); @@ -126,6 +132,11 @@ private static string ConvertLogLine(string line, IOutputLineFormatter formatter case "span": value = ConvertSpan(jsonPair.Value); break; + case "mt": + value = Convert(jsonPair.Value); + if (CurrentOptions.NeedMergingArgumentsIntoMessageText && jsonDict.TryGetValue("args", out var argsJson)) + value = Converter.MergeArgumentsIntoMessage(value, ConvertArguments(argsJson)); + break; default: value = Convert(jsonPair.Value); break; @@ -233,6 +244,43 @@ private static string ConvertException(IJEnumerable jTokens) return result.ToString(); } + /// + /// Раскрыть параметры сообщения в его текст. + /// + /// Сообщение. + /// Параметры. + /// Строку с подставленными значениями аргументов в тексте сообщения. + private static string MergeArgumentsIntoMessage(string message, string args) + { + try + { + if (string.IsNullOrEmpty(args)) + return message; + + args = args.Replace("(", "{").Replace(")", "}"); + var parsedArgs = JObject.Parse(args); + + foreach (var arg in parsedArgs) + { + var keyString = arg.Key.ToString(); + var valueString = arg.Value.ToString(); + if (string.IsNullOrEmpty(valueString)) + valueString = "Empty value"; + + var replacingString = $"{keyString}:{valueString}"; + message = message.Replace(keyString, replacingString); + } + + message = message.Replace("{", string.Empty).Replace("}", string.Empty); + } + catch (Exception) + { + // В случае ошибки вернётся сообщение без изменений. + } + + return message; + } + #endregion } } From 979db56b05441fe16a8b42773b8b57098fb55693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B0=D0=B7=D0=B0=D1=80=D0=BE=D0=B2=20=D0=90=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=BD=20=28Nazarov=5FAA=29?= Date: Mon, 6 Jun 2022 16:30:33 +0400 Subject: [PATCH 2/5] =?UTF-8?q?=D0=A3=D0=B1=D1=80=D0=B0=D0=BB=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=88=D0=BD=D0=B5=D0=B5=20=D0=B8=D0=B7=20MergeArgumentsI?= =?UTF-8?q?ntoMessage?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DirectumLogConverter/Converter.cs | 37 +++++++++++++------------------ 1 file changed, 16 insertions(+), 21 deletions(-) diff --git a/DirectumLogConverter/Converter.cs b/DirectumLogConverter/Converter.cs index c442f10..904ece6 100644 --- a/DirectumLogConverter/Converter.cs +++ b/DirectumLogConverter/Converter.cs @@ -135,7 +135,7 @@ private static string ConvertLogLine(string line, IOutputLineFormatter formatter case "mt": value = Convert(jsonPair.Value); if (CurrentOptions.NeedMergingArgumentsIntoMessageText && jsonDict.TryGetValue("args", out var argsJson)) - value = Converter.MergeArgumentsIntoMessage(value, ConvertArguments(argsJson)); + value = Converter.MergeArgumentsIntoMessage(value, argsJson); break; default: value = Convert(jsonPair.Value); @@ -250,29 +250,24 @@ private static string ConvertException(IJEnumerable jTokens) /// Сообщение. /// Параметры. /// Строку с подставленными значениями аргументов в тексте сообщения. - private static string MergeArgumentsIntoMessage(string message, string args) + private static string MergeArgumentsIntoMessage(string message, IJEnumerable args) { try { - if (string.IsNullOrEmpty(args)) - return message; - - args = args.Replace("(", "{").Replace(")", "}"); - var parsedArgs = JObject.Parse(args); - - foreach (var arg in parsedArgs) - { - var keyString = arg.Key.ToString(); - var valueString = arg.Value.ToString(); - if (string.IsNullOrEmpty(valueString)) - valueString = "Empty value"; - - var replacingString = $"{keyString}:{valueString}"; - message = message.Replace(keyString, replacingString); - } - - message = message.Replace("{", string.Empty).Replace("}", string.Empty); - } + var jsonArgs = JObject.Parse(Convert(args, "{", "}")); + foreach (var arg in jsonArgs) + { + var keyString = arg.Key.ToString(); + var valueString = arg.Value.ToString(); + if (string.IsNullOrEmpty(valueString)) + valueString = "Empty value"; + + var replacingString = $"{keyString}:{valueString}"; + message = message.Replace(keyString, replacingString); + } + + message = message.Replace("{", string.Empty).Replace("}", string.Empty); + } catch (Exception) { // В случае ошибки вернётся сообщение без изменений. From 9832bbe58fd9ca913056a97feaa52017c6dd416f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B0=D0=B7=D0=B0=D1=80=D0=BE=D0=B2=20=D0=90=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=BD=20=28Nazarov=5FAA=29?= Date: Mon, 6 Jun 2022 17:11:31 +0400 Subject: [PATCH 3/5] =?UTF-8?q?=D0=94=D1=80=D1=83=D0=B3=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=B2=D0=B0=D1=80=D0=B8=D0=B0=D0=BD=D1=82=20=D0=B7=D0=B0=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B8=20=D0=B0=D1=80=D0=B3=D1=83=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DirectumLogConverter/Converter.cs | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/DirectumLogConverter/Converter.cs b/DirectumLogConverter/Converter.cs index 904ece6..dc035d0 100644 --- a/DirectumLogConverter/Converter.cs +++ b/DirectumLogConverter/Converter.cs @@ -259,11 +259,8 @@ private static string MergeArgumentsIntoMessage(string message, IJEnumerable Date: Mon, 6 Jun 2022 17:28:52 +0400 Subject: [PATCH 4/5] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=BE=D1=82=D1=81=D1=82=D1=83=D0=BF=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DirectumLogConverter/Converter.cs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/DirectumLogConverter/Converter.cs b/DirectumLogConverter/Converter.cs index dc035d0..7b214fc 100644 --- a/DirectumLogConverter/Converter.cs +++ b/DirectumLogConverter/Converter.cs @@ -256,15 +256,15 @@ private static string MergeArgumentsIntoMessage(string message, IJEnumerable Date: Tue, 7 Jun 2022 09:35:32 +0400 Subject: [PATCH 5/5] =?UTF-8?q?=D0=9F=D0=BE=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=20README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index cd6f8cc..cc8722b 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ По умолчанию конвертация происходит в текстовый формат, если нужно сконвертировать в формат csv, то нужно добавить ключ `-с`. +Добавленный ключ `-m` развернёт аргументы строки сообщения(args) в его текст. + Второй аргумент можно не указывать, тогда имя сконвертированного файла будет сформировано из имени исходного файла.
Например, `WebServer.log` будет сконвертирован в файл `WebServer_converted.log`, либо в `WebServer_converted.csv` если выбран формат csv. Если выходной файл уже существует, то будет сделан запрос перед тем, как его перезаписать.