Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions DirectumLogConverter/ConvertOptions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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 Методы
Expand Down
40 changes: 40 additions & 0 deletions DirectumLogConverter/Converter.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@ internal static class Converter
{
#region Поля и свойства

/// <summary>
/// Опции конвертации.
/// </summary>
private static ConvertOptions CurrentOptions;

/// <summary>
/// Количество потоков, которое будет использовано для конвертации.
/// </summary>
Expand All @@ -40,6 +45,7 @@ internal static class Converter
/// <param name="options">Опции конвертации.</param>
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);
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -233,6 +244,35 @@ private static string ConvertException(IJEnumerable<JToken> jTokens)
return result.ToString();
}

/// <summary>
/// Раскрыть параметры сообщения в его текст.
/// </summary>
/// <param name="message">Сообщение.</param>
/// <param name="args">Параметры.</param>
/// <returns>Строку с подставленными значениями аргументов в тексте сообщения.</returns>
private static string MergeArgumentsIntoMessage(string message, IJEnumerable<JToken> 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
}
}
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@

По умолчанию конвертация происходит в текстовый формат, если нужно сконвертировать в формат csv, то нужно добавить ключ `-с`.

Добавленный ключ `-m` развернёт аргументы строки сообщения(args) в его текст.

Второй аргумент можно не указывать, тогда имя сконвертированного файла будет сформировано из имени исходного файла.<br/>Например, `WebServer.log` будет сконвертирован в файл `WebServer_converted.log`, либо в `WebServer_converted.csv` если выбран формат csv.

Если выходной файл уже существует, то будет сделан запрос перед тем, как его перезаписать.
Expand Down