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.
Если выходной файл уже существует, то будет сделан запрос перед тем, как его перезаписать.