Skip to content

Commit

Permalink
Сводка изменений:
Browse files Browse the repository at this point in the history
Логирование:

Добавлен логгер для записи ошибок в файл.

Логирование ошибок в методах HandleInitializationErrorAsync и HandleGraphUpdateErrorAsync.

Асинхронная обработка:

Внедрена асинхронная обработка ошибок в методах UpdateGraph, HandleInitializationErrorAsync, и HandleGraphUpdateErrorAsync.

Проверка существования файла:

Добавлена проверка на существование файла перед его очисткой в методе ClearLogFile.

Обработка исключений:

Добавлена обработка исключений в обработчике события FlushLogs.

Добавлен метод WriteLogBatchAsync для асинхронной записи пакета логов.

Использование WriteLogBatchAsync в методе WriteLogsFromQueueAsync для записи логов из очереди.
  • Loading branch information
diqezit committed Oct 26, 2024
1 parent d4c4df2 commit a0584fc
Show file tree
Hide file tree
Showing 15 changed files with 696 additions and 373 deletions.
Binary file modified .vs/Пингалятор/v17/.suo
Binary file not shown.
124 changes: 63 additions & 61 deletions .vs/Пингалятор/v17/DocumentLayout.backup.json

Large diffs are not rendered by default.

149 changes: 77 additions & 72 deletions .vs/Пингалятор/v17/DocumentLayout.json

Large diffs are not rendered by default.

24 changes: 15 additions & 9 deletions GraphWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
Expand All @@ -29,11 +30,12 @@ public partial class GraphWindow : Window
private readonly int _maxVisiblePoints;
private bool _isSmoothingEnabled;

private readonly DispatcherTimer _updateTimer;
private DispatcherTimer _updateTimer;
private readonly LinearAxis _pingAxis;
private readonly LinearAxis _timeAxis;
private readonly LineSeries _errorSeries;
private readonly LineSeries _normalSeries;
private ILogger _logger;

#endregion

Expand Down Expand Up @@ -66,10 +68,13 @@ public GraphWindow(int pingInterval)
_updateTimer = InitializeTimer(pingInterval);

ConfigurePlotModel();

// Инициализируем Logger
_logger = new Logger("graph_window_log.txt", true);
}
catch (Exception ex)
{
HandleInitializationError(ex);
HandleInitializationErrorAsync(ex).GetAwaiter().GetResult();
throw;
}
}
Expand Down Expand Up @@ -148,7 +153,6 @@ private DispatcherTimer InitializeTimer(int pingInterval)
Interval = TimeSpan.FromMilliseconds(pingInterval)
};
timer.Tick += UpdateGraph;
timer.Start();
return timer;
}

Expand All @@ -172,7 +176,7 @@ private void ConfigurePlotModel()
/// </summary>
/// <param name="sender">Источник события.</param>
/// <param name="e">Аргументы события.</param>
private void UpdateGraph(object? sender, EventArgs e)
private async void UpdateGraph(object? sender, EventArgs e)
{
try
{
Expand All @@ -184,7 +188,7 @@ private void UpdateGraph(object? sender, EventArgs e)
}
catch (Exception ex)
{
HandleGraphUpdateError(ex);
await HandleGraphUpdateErrorAsync(ex).ConfigureAwait(false);
}
}

Expand Down Expand Up @@ -243,7 +247,7 @@ private void UpdateAxesRanges(IReadOnlyList<double> data)
}

var startIndex = Math.Max(0, data.Count - _maxVisiblePoints);
var visibleData = data.Skip(startIndex);
var visibleData = data.Skip(startIndex).ToList();

_timeAxis.Minimum = startIndex;
_timeAxis.Maximum = data.Count - 1;
Expand Down Expand Up @@ -295,8 +299,9 @@ private static void SetStatisticsText(TextBlock textBlock, double value) =>
/// Обрабатывает ошибки инициализации.
/// </summary>
/// <param name="ex">Исключение, возникшее при инициализации.</param>
private void HandleInitializationError(Exception ex)
private async Task HandleInitializationErrorAsync(Exception ex)
{
await _logger.LogAsync(LogLevel.ERROR, $"Ошибка инициализации графика: {ex.Message}").ConfigureAwait(false);
MessageBox.Show(
$"Ошибка инициализации графика: {ex.Message}",
"Ошибка",
Expand All @@ -308,8 +313,9 @@ private void HandleInitializationError(Exception ex)
/// Обрабатывает ошибки обновления графика.
/// </summary>
/// <param name="ex">Исключение, возникшее при обновлении.</param>
private void HandleGraphUpdateError(Exception ex)
private async Task HandleGraphUpdateErrorAsync(Exception ex)
{
await _logger.LogAsync(LogLevel.ERROR, $"Произошла ошибка при обновлении графика. Проверьте данные и повторите попытку. {ex.Message}").ConfigureAwait(false);
MessageBox.Show(
"Произошла ошибка при обновлении графика. Проверьте данные и повторите попытку.",
"Ошибка обновления",
Expand Down Expand Up @@ -349,7 +355,7 @@ public void SetPingData(List<int> pingData)
}
catch (Exception ex)
{
HandleGraphUpdateError(ex);
HandleGraphUpdateErrorAsync(ex).GetAwaiter().GetResult();
}
}

Expand Down
58 changes: 42 additions & 16 deletions Logger.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
using System.Timers;
Expand Down Expand Up @@ -56,7 +57,10 @@ private void ClearLogFile(string filePath)
{
try
{
File.WriteAllText(filePath, string.Empty);
if (File.Exists(filePath))
{
File.WriteAllText(filePath, string.Empty);
}
}
catch (Exception ex)
{
Expand Down Expand Up @@ -93,7 +97,14 @@ public async Task LogAsync(LogLevel level, string message, Exception ex = null)
/// <param name="e">Аргументы события.</param>
private void FlushLogs(object sender, ElapsedEventArgs e)
{
WriteLogsFromQueueAsync().ConfigureAwait(false);
try
{
WriteLogsFromQueueAsync().ConfigureAwait(false);
}
catch (Exception ex)
{
Console.WriteLine($"Ошибка при сбросе логов: {ex.Message}");
}
}

/// <summary>
Expand All @@ -103,34 +114,49 @@ private async Task WriteLogsFromQueueAsync()
{
try
{
using (FileStream fs = new FileStream(logFilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite, bufferSize: 4096, useAsync: true))
using (StreamWriter writer = new StreamWriter(fs))
var logMessages = new List<string>();
while (logQueue.TryDequeue(out string logMessage))
{
logMessages.Add($"{DateTime.Now}: {logMessage}");
}

if (logMessages.Count > 0)
{
while (logQueue.TryDequeue(out string logMessage))
await WriteLogBatchAsync(logFilePath, logMessages).ConfigureAwait(false);

if (combinedLogEnabled)
{
await writer.WriteLineAsync($"{DateTime.Now}: {logMessage}").ConfigureAwait(false);

if (combinedLogEnabled)
{
using (FileStream combinedFs = new FileStream(combinedLogFilePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite, bufferSize: 4096, useAsync: true))
using (StreamWriter combinedWriter = new StreamWriter(combinedFs))
{
await combinedWriter.WriteLineAsync($"{DateTime.Now}: {logMessage}").ConfigureAwait(false);
}
}
await WriteLogBatchAsync(combinedLogFilePath, logMessages).ConfigureAwait(false);
}
}
}
catch (IOException ioEx)
{
Console.WriteLine($"Ошибка записи в лог: {ioEx.Message}");
await LogAsync(LogLevel.ERROR, $"Ошибка записи в лог: {ioEx.Message}", ioEx).ConfigureAwait(false);
}
catch (Exception logEx)
{
await LogAsync(LogLevel.ERROR, $"Неизвестная ошибка при записи в лог: {logEx.Message}", logEx).ConfigureAwait(false);
}
}

/// <summary>
/// Асинхронно записывает пакет логов в файл.
/// </summary>
/// <param name="filePath">Путь к файлу лога.</param>
/// <param name="logMessages">Список сообщений для записи.</param>
private async Task WriteLogBatchAsync(string filePath, List<string> logMessages)
{
using (FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite, bufferSize: 4096, useAsync: true))
using (StreamWriter writer = new StreamWriter(fs))
{
foreach (var logMessage in logMessages)
{
await writer.WriteLineAsync(logMessage).ConfigureAwait(false);
}
}
}

#endregion
}

Expand Down
17 changes: 15 additions & 2 deletions MainWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public partial class MainWindow : Window
private IniFileSettings iniSettings;
private TraceWindow traceWindow;
private PingService pingService;
private ILogger _logger;

#endregion

Expand All @@ -44,6 +45,9 @@ public MainWindow()
pingService.OnRoundtripTimeAdded += UpdateGraph;

this.Closed += MainWindow_Closed;

// Инициализируем Logger
_logger = new Logger("main_window_log.txt", true);
}

#endregion
Expand Down Expand Up @@ -94,15 +98,24 @@ private async void BtnPing_Click(object sender, RoutedEventArgs e)
}
catch (Exception ex)
{
await _logger.LogAsync(LogLevel.ERROR, $"Произошла ошибка: {ex.Message}", ex).ConfigureAwait(false);
MessageBox.Show($"Произошла ошибка: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
}
}

private async Task WriteLogFileAsync(string iniFilePath, string content)
{
using (var writer = new StreamWriter(iniFilePath))
try
{
using (var writer = new StreamWriter(iniFilePath))
{
await writer.WriteAsync(content);
}
}
catch (Exception ex)
{
await writer.WriteAsync(content);
await _logger.LogAsync(LogLevel.ERROR, $"Ошибка записи в лог-файл: {ex.Message}", ex).ConfigureAwait(false);
MessageBox.Show($"Ошибка записи в лог-файл: {ex.Message}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
}
}

Expand Down
6 changes: 3 additions & 3 deletions TraceWindow.xaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public partial class TraceWindow : Window
{
#region Поля

private readonly Logger logger;
private ILogger logger;
private CancellationTokenSource _cts;
private bool isTracing;
private readonly string traceUrl;
Expand Down Expand Up @@ -47,7 +47,7 @@ public TraceWindow(string url)
{
InitializeComponent();
CombinedLogEnabled = chkCombinedLog.IsChecked ?? false;
logger = new Logger("combined_log.txt", CombinedLogEnabled);
logger = new Logger("trace_window_log.txt", CombinedLogEnabled);
memoryCache = new MemoryCache(new MemoryCacheOptions());

TraceResults = CollectionViewSource.GetDefaultView(traceResultsInternal);
Expand Down Expand Up @@ -163,7 +163,7 @@ private async void BtnStartTrace_Click(object sender, RoutedEventArgs e)
}
catch (Exception ex)
{
await logger.LogAsync(LogLevel.WARNING, $"Ошибка: {ex.Message}\n{ex.StackTrace}");
await logger.LogAsync(LogLevel.ERROR, $"Ошибка: {ex.Message}\n{ex.StackTrace}", ex);
ShowMessage($"Ошибка: {ex.Message}\n{ex.StackTrace}", "Ошибка", MessageBoxButton.OK, MessageBoxImage.Error);
}
finally
Expand Down
4 changes: 2 additions & 2 deletions bin/Release/PingTestSettings.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[PingTestSettings]
URL=google.com
PingCount=2
Timeout=1000
PingCount=50
Timeout=500
LogFile=C:\ping_log.txt
Binary file modified bin/Release/app.publish/Пингалятор.exe
Binary file not shown.
Loading

0 comments on commit a0584fc

Please sign in to comment.