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..7b214fc 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, argsJson); + break; default: value = Convert(jsonPair.Value); break; @@ -233,6 +244,35 @@ private static string ConvertException(IJEnumerable jTokens) return result.ToString(); } + /// + /// Раскрыть параметры сообщения в его текст. + /// + /// Сообщение. + /// Параметры. + /// Строку с подставленными значениями аргументов в тексте сообщения. + private static string MergeArgumentsIntoMessage(string message, IJEnumerable args) + { + try + { + var jsonArgs = JObject.Parse(Convert(args, "{", "}")); + foreach (var arg in jsonArgs) + { + var keyString = arg.Key.ToString(); + var valueString = arg.Value.ToString(); + var replacingString = string.IsNullOrEmpty(valueString) ? $"({keyString}:Empty)" : valueString; + message = message.Replace(keyString, replacingString, StringComparison.Ordinal); + } + + message = message.Replace("{", string.Empty).Replace("}", string.Empty); + } + catch (Exception) + { + // В случае ошибки вернётся сообщение без изменений. + } + + return message; + } + #endregion } } 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. Если выходной файл уже существует, то будет сделан запрос перед тем, как его перезаписать.