воскресенье, 28 декабря 2025 г.

25.12.29, Logging, DeepSeek

25.12.29, Logging, DeepSeek

https://chat.deepseek.com/share/a1hc98s2q2qdoxvano

Мы хотим видеть в консоли два типа логов:

  1. Старые логи (которые были изначально) в формате:
    [HH:mm:ss] Символ ↑/↓ Цена (+/-Изменение %)
    И строки по каждой стратегии для тикера в формате:
    HH:mm:ss | Символ | Цена: X | Поз: Y | Действие | Состояние | P&L: Z

  2. Новые логи от EventHubStrategy о публикации событий и логи от InMemoryTradingDatabase о получении событий.

Проблема: сейчас в консоль выводится много отладочной информации, которая может мешать видеть торговую информацию.

Решение: настроить уровни логирования для разных компонентов.

В коде Program.cs мы уже настроили логирование, но, возможно, не все категории отфильтрованы.

Давайте настроим логирование так, чтобы:

  • Для TradingPlatform.Services.EventHubStrategy оставляем только важные сообщения (например, Information или Warning, но не Debug)

  • Для TradingPlatform.Services.InMemoryTradingDatabase оставляем только важные сообщения (например, Information)

  • Для TradingPlatform.Services.StrategiesExecutionService оставляем только важные сообщения (например, Information)

  • Для TradingPlatform.Services.TradingMonitorService оставляем только важные сообщения (например, Information)

При этом для QuotesConsoleService оставляем вывод котировок и статистики.

Также, возможно, нужно отключить логирование для BusLibrary02, оставив только предупреждения и ошибки.

В текущей конфигурации:
builder.Logging.AddFilter("TradingPlatform", LogLevel.Debug);

Это значит, что для всего пространства имен TradingPlatform будут выводиться сообщения уровня Debug и выше.

Мы можем изменить это, указав для конкретных категорий более высокий уровень.

Давайте изменим конфигурацию логирования в Program.cs:

Заменим:
builder.Logging.AddFilter("TradingPlatform", LogLevel.Debug);

На:
builder.Logging.AddFilter("TradingPlatform", LogLevel.Information);
builder.Logging.AddFilter("TradingPlatform.Services.EventHubStrategy", LogLevel.Warning);
builder.Logging.AddFilter("TradingPlatform.Services.InMemoryTradingDatabase", LogLevel.Information);
builder.Logging.AddFilter("TradingPlatform.Services.StrategiesExecutionService", LogLevel.Warning);
builder.Logging.AddFilter("TradingPlatform.Services.TradingMonitorService", LogLevel.Warning);

Но тогда мы не увидим сообщения о публикации событий, которые сейчас выводятся как Debug.
Если мы хотим видеть только сообщения о публикации событий уровня Information, то в EventHubStrategy нужно изменить LogDebug на LogInformation.

Однако, судя по выводу, у нас есть два типа сообщений от EventHubStrategy:

  1. [03:03:43] dbug: TradingPlatform.Services.EventHubStrategy[0] ✅ Опубликовано событие PositionChanged: VVV VVV_05s NetQty=-2

  2. 03:03:43 | VVV | Цена: 1425,00 | Поз: -2 📉 | 🟢 ПОКУПКА ✓ | ⏳ Завершение (1) | P&L: 8,00

Первое - это отладочное сообщение о публикации события, второе - это вывод стратегии о своем состоянии (это не лог, а вывод в консоль, сделанный через Console.WriteLine?).

На самом деле, второе сообщение выводится в консоль, но не через логгер, а через Console.WriteLine в методе PrintQuote и PrintStats сервиса QuotesConsoleService.

Итак, чтобы убрать лишние отладочные сообщения, но оставить вывод котировок и стратегий, нужно:

  1. Повысить уровень логирования для EventHubStrategy, чтобы не выводить Debug сообщения.

  2. Оставить уровень Information для QuotesConsoleService, чтобы он выводил котировки.

Но у нас есть еще логи от InMemoryTradingDatabase и StrategiesExecutionService, которые тоже выводят Debug сообщения.

Предлагаю следующую конфигурацию:

builder.Logging.AddFilter("TradingPlatform", LogLevel.Information);
builder.Logging.AddFilter("TradingPlatform.Services.EventHubStrategy", LogLevel.Warning); // Debug не будет выводиться
builder.Logging.AddFilter("TradingPlatform.Services.InMemoryTradingDatabase", LogLevel.Warning);
builder.Logging.AddFilter("TradingPlatform.Services.StrategiesExecutionService", LogLevel.Warning);
builder.Logging.AddFilter("TradingPlatform.Services.TradingMonitorService", LogLevel.Warning);

Тогда Debug сообщения от этих сервисов не будут выводиться, а Information и выше - будут.

Однако, в QuotesConsoleService есть метод PrintQuote, который выводит котировки, и он вызывается при получении события QuoteGeneratedEvent.
Это событие обрабатывается в QuotesConsoleService, и там используется _logger.LogInformation для вывода статистики, но не для каждой котировки.

При этом сам вывод котировок в консоль сделан через Console.WriteLine, а не через логгер. Поэтому настройки логирования на него не влияют.

Вывод котировок и стратегий (который в формате "03:03:43 | VVV | Цена: 1425,00 ...") происходит в методе PrintQuote, который вызывается для каждой котировки.
Это Console.WriteLine, и он всегда будет выводиться.

Итак, чтобы убрать отладочные сообщения, но оставить вывод котировок, нужно:

  1. Изменить конфигурацию логирования, как указано выше.

  2. Убедиться, что в EventHubStrategy, InMemoryTradingDatabase, StrategiesExecutionService и TradingMonitorService не используется LogDebug, если мы хотим их видеть, или изменить на LogInformation.

Но, возможно, мы хотим видеть некоторые отладочные сообщения. Тогда можно оставить LogDebug для некоторых компонентов, но повысить уровень для других.

Давайте разделим:

  • EventHubStrategy: оставим только предупреждения и ошибки (LogLevel.Warning)

  • InMemoryTradingDatabase: возможно, мы хотим видеть информацию о получении событий, тогда оставим LogLevel.Information для этой категории, но тогда нужно в коде использовать _logger.LogInformation вместо _logger.LogDebug.

В коде InMemoryTradingDatabase мы используем _logger.LogDebug для вывода полученных событий. Если мы хотим их видеть, нужно изменить на _logger.LogInformation.

Однако, если мы не хотим менять код, то можно оставить LogLevel.Debug для InMemoryTradingDatabase, но тогда в консоли будет много сообщений.

Я предлагаю изменить в InMemoryTradingDatabase вывод о получении событий на уровень Information, а остальные отладочные сообщения оставить на уровне Debug.

Тогда конфигурация будет:

builder.Logging.AddFilter("TradingPlatform", LogLevel.Information);
builder.Logging.AddFilter("TradingPlatform.Services.EventHubStrategy", LogLevel.Warning);
builder.Logging.AddFilter("TradingPlatform.Services.InMemoryTradingDatabase", LogLevel.Information); // Debug не будет, Information будет
builder.Logging.AddFilter("TradingPlatform.Services.StrategiesExecutionService", LogLevel.Warning);
builder.Logging.AddFilter("TradingPlatform.Services.TradingMonitorService", LogLevel.Warning);

И в коде InMemoryTradingDatabase заменим:
_logger.LogDebug("📊 Получен PositionChangedEvent: {Symbol} {Strategy} Qty={Quantity}", ...);
на:
_logger.LogInformation("📊 Получен PositionChangedEvent: {Symbol} {Strategy} Qty={Quantity}", ...);

Аналогично для других событий.

Но тогда мы увидим все сообщения о получении событий в консоли, что может быть много.

Другой вариант: оставить как есть, но изменить конфигурацию для InMemoryTradingDatabase на LogLevel.Warning, и тогда мы не увидим эти сообщения.

Выбор за вами.

Если вы хотите видеть только вывод котировок и стратегий (через Console.WriteLine) и не видеть отладочные сообщения, то:

  1. В конфигурации логирования установите для всех сервисов, кроме QuotesConsoleService, уровень Warning.

  2. В коде InMemoryTradingDatabase и других сервисов, если хотим видеть некоторые сообщения, используем LogInformation.

Я думаю, что для EventHubStrategy, StrategiesExecutionService, TradingMonitorService и InMemoryTradingDatabase можно установить уровень Warning, чтобы не загромождать консоль.

Однако, если вы хотите видеть сообщения о получении событий в InMemoryTradingDatabase, то можно оставить Information, но тогда их будет много.

Давайте попробуем такой вариант:

В Program.cs:

text
  builder.Logging.AddFilter("TradingPlatform", LogLevel.Information);
  builder.Logging.AddFilter("TradingPlatform.Services.EventHubStrategy", LogLevel.Warning);
  builder.Logging.AddFilter("TradingPlatform.Services.InMemoryTradingDatabase", LogLevel.Warning); // не показывать Information сообщения
  builder.Logging.AddFilter("TradingPlatform.Services.StrategiesExecutionService", LogLevel.Warning);
  builder.Logging.AddFilter("TradingPlatform.Services.TradingMonitorService", LogLevel.Warning);
  builder.Logging.AddFilter("TradingPlatform.Services.QuotesConsoleService", LogLevel.Information);

Тогда:
- QuotesConsoleService будет выводить статистику (раз в 10 котировок) через LogInformation, а также через Console.WriteLine котировки.
- Остальные сервисы будут выводить только предупреждения и ошибки.

Но в InMemoryTradingDatabase мы используем LogDebug, которые не будут выводиться. Если мы хотим видеть какие-то сообщения от InMemoryTradingDatabase, нужно изменить их на LogInformation и установить для этой категории LogLevel.Information.

Я предлагаю оставить как есть, т.е. не видеть отладочные сообщения от InMemoryTradingDatabase, чтобы не загромождать консоль.

Если вы хотите видеть сообщения от InMemoryTradingDatabase, то измените в коде на LogInformation и установите для этой категории LogLevel.Information.

Давайте сделаем так:

  1. В Program.cs оставим конфигурацию, которая отфильтровывает Debug для всех, но оставляет Information для QuotesConsoleService.

  2. Для InMemoryTradingDatabase установим уровень Information, но в коде будем использовать LogInformation для важных сообщений.

Но тогда в консоли будет много сообщений от InMemoryTradingDatabase. Может, лучше оставить только ошибки и предупреждения?

Я думаю, что для работы важно видеть ошибки, а отладочные сообщения можно убрать.

Итак, план:

  • В Program.cs устанавливаем уровень Warning для всех сервисов, кроме QuotesConsoleService.

  • В QuotesConsoleService оставляем уровень Information, чтобы видеть статистику.

  • Вывод котировок и стратегий через Console.WriteLine останется.

В результате в консоли будут только:
- Вывод котировок и стратегий (через Console.WriteLine)
- Статистика от QuotesConsoleService (через LogInformation)
- Ошибки и предупреждения от всех компонентов.

Это можно сделать так:

text
  builder.Logging.AddFilter("TradingPlatform", LogLevel.Warning); // по умолчанию для TradingPlatform Warning
  builder.Logging.AddFilter("TradingPlatform.Services.QuotesConsoleService", LogLevel.Information); // для QuotesConsoleService Information

Но тогда для всех сервисов, кроме QuotesConsoleService, будет только Warning и выше.

Давайте так и сделаем.

Изменим конфигурацию логирования в Program.cs:

text
  builder.Logging.ClearProviders();
  builder.Logging.AddSimpleConsole(options =>
  {
      options.SingleLine = true;
      options.TimestampFormat = "[HH:mm:ss] ";
  });

  // Устанавливаем уровень по умолчанию для всех
  builder.Logging.SetMinimumLevel(LogLevel.Warning);

  // Для QuotesConsoleService разрешаем Information, чтобы видеть статистику
  builder.Logging.AddFilter("TradingPlatform.Services.QuotesConsoleService", LogLevel.Information);

  // Для пространства имен Microsoft и System устанавливаем Warning
  builder.Logging.AddFilter("Microsoft", LogLevel.Warning);
  builder.Logging.AddFilter("System", LogLevel.Warning);

Но тогда мы не увидим информационные сообщения от других сервисов, включая InMemoryTradingDatabase.

Если вы хотите видеть информационные сообщения от InMemoryTradingDatabase, то добавьте:

text
  builder.Logging.AddFilter("TradingPlatform.Services.InMemoryTradingDatabase", LogLevel.Information);

Но, повторюсь, это может привести к большому количеству сообщений.

Я предлагаю начать с минимального вывода: только котировки и стратегии (Console.WriteLine) и статистика (QuotesConsoleService), а также ошибки и предупреждения.

Тогда конфигурация:

text
  builder.Logging.ClearProviders();
  builder.Logging.AddSimpleConsole(options =>
  {
      options.SingleLine = true;
      options.TimestampFormat = "[HH:mm:ss] ";
  });

  // Устанавливаем уровень по умолчанию для всех источников
  builder.Logging.SetMinimumLevel(LogLevel.Warning);

  // Разрешаем Information для QuotesConsoleService, чтобы видеть статистику
  builder.Logging.AddFilter("TradingPlatform.Services.QuotesConsoleService", LogLevel.Information);

При этом убедитесь, что в QuotesConsoleService для вывода статистики используется LogInformation, а не LogDebug.

В QuotesConsoleService в методе PrintStats используется:
_logger.LogInformation("📊 Статистика: {TotalQuotes} котировок за {Elapsed:mm\:ss} ({Rate:F1}/сек)", ...);

Это будет выводиться.

Теперь о выводе котировок: они выводятся через Console.WriteLine в методе PrintQuote, и это не зависит от конфигурации логгера.

Итак, перезапустите приложение с такой конфигурацией и проверьте, что вы видите только:
- Котировки и стратегии (через Console.WriteLine)
- Статистику каждые 10 котировок
- Ошибки и предупреждения (если есть)

Если вы хотите видеть сообщения от InMemoryTradingDatabase, добавьте соответствующее правило.

Если вы хотите скрыть сообщения о публикации событий от EventHubStrategy (которые были Debug), то они не будут выводиться, так как мы установили уровень по умолчанию Warning.

Пробуем.

Если что, можно всегда добавить больше логов, изменив уровень для конкретного сервиса.

Дополнительно: если вы хотите видеть логи от BusLibrary02 только уровня Warning и выше, то оставьте как есть. Если хотите отключить, то:

text
  builder.Logging.AddFilter("BusLibrary02", LogLevel.Warning);

Но у нас уже установлен минимальный уровень Warning, так что все Debug и Information от BusLibrary02 не будут выводиться.

Итак, обновленная конфигурация логирования в Program.cs:

csharp
// ========== НАСТРОЙКА ЛОГГИНГА ==========

builder.Logging.ClearProviders();
builder.Logging.AddSimpleConsole(options =>
{
    options.SingleLine = true;
    options.TimestampFormat = "[HH:mm:ss] ";
});

// Устанавливаем уровень по умолчанию для всех источников
builder.Logging.SetMinimumLevel(LogLevel.Warning);

// Разрешаем Information для QuotesConsoleService, чтобы видеть статистику
builder.Logging.AddFilter("TradingPlatform.Services.QuotesConsoleService", LogLevel.Information);

// Для Microsoft и System оставляем Warning
builder.Logging.AddFilter("Microsoft", LogLevel.Warning);
builder.Logging.AddFilter("System", LogLevel.Warning);

После этого перезапустите приложение.

Если вы хотите видеть больше логов, добавьте правила для конкретных сервисов.

Например, чтобы видеть информационные сообщения от InMemoryTradingDatabase:

text
  builder.Logging.AddFilter("TradingPlatform.Services.InMemoryTradingDatabase", LogLevel.Information);

Но помните, что тогда в консоли будет много сообщений.

Удачи!

🎯 ПРАВИЛЬНАЯ КОНФИГУРАЦИЯ ЛОГГИНГА

Цель: Сохранить только чистый торговый вывод, убрать лишние debug-логи.

1. Измените настройки логирования в Program.cs:

csharp
// ========== НАСТРОЙКА ЛОГГИНГА ==========
builder.Logging.ClearProviders();
builder.Logging.AddSimpleConsole(options =>
{
    options.SingleLine = true;
    options.TimestampFormat = "[HH:mm:ss] ";
});

// Уровни логирования по умолчанию
builder.Logging.SetMinimumLevel(LogLevel.Warning); // Показываем только Warning и выше

// Исключения для конкретных категорий:
builder.Logging.AddFilter("Microsoft.AspNetCore", LogLevel.Warning);
builder.Logging.AddFilter("Microsoft.Hosting", LogLevel.Information);
builder.Logging.AddFilter("System", LogLevel.Warning);

// Для наших сервисов настраиваем нужные уровни:
builder.Logging.AddFilter("TradingPlatform.Services.QuotesConsoleService", LogLevel.Information); // Котировки
builder.Logging.AddFilter("TradingPlatform.Services.StrategiesExecutionService", LogLevel.Warning); // Стратегии
builder.Logging.AddFilter("TradingPlatform.Services.TradingMonitorService", LogLevel.Warning); // Монитор

// EventHubStrategy - только важные сообщения (покупки/продажи)
builder.Logging.AddFilter("TradingPlatform.Services.EventHubStrategy", LogLevel.Information);

// InMemoryTradingDatabase - только ошибки (чтобы не загромождать)
builder.Logging.AddFilter("TradingPlatform.Services.InMemoryTradingDatabase", LogLevel.Warning);

// BusLibrary02 - только ошибки
builder.Logging.AddFilter("BusLibrary02", LogLevel.Warning);

2. Обновите EventHubStrategy.cs - замените Debug на Information для важных действий:

csharp
// EventHubStrategy.cs - изменить логирование
private async void OnTradeExecutedHandler(ITrade trade)
{
    if (!IsRunning()) return;

    try
    {
        var tradeEvent = new TradeExecutedEvent(
            trade.Ticker,
            trade.Side.ToString(),
            trade.Price,
            trade.Qty,
            StrategyName,
            trade.DateTime
        );

        await _eventHub.PublishAsync(tradeEvent);
        
        // Важные действия логируем как Information
        _logger?.LogInformation("📊 TRADE: {Ticker} {Side} {Qty} @ {Price} ({Strategy})",
            trade.Ticker, trade.Side, trade.Qty, trade.Price, StrategyName);
    }
    catch (Exception ex)
    {
        _logger?.LogError(ex, "❌ Ошибка при публикации события TradeExecuted");
    }
}

private async void OnPositionChangedHandler(IPositionSummary position)
{
    if (!IsRunning()) return;

    try
    {
        var positionEvent = new PositionChangedEvent(
            position.Ticker,
            StrategyName,
            position.NetQuantity,
            position.UnrealizedProfit,
            position.Status.ToString(),
            DateTime.Now
        );

        await _eventHub.PublishAsync(positionEvent);
        
        // Важные позиции - как Information
        if (Math.Abs(position.NetQuantity) > 0)
        {
            _logger?.LogInformation("📈 POSITION: {Ticker} {Strategy}: NetQty={NetQty} | P&L={PnL:F2}",
                position.Ticker, StrategyName, position.NetQuantity, position.UnrealizedProfit);
        }
    }
    catch (Exception ex)
    {
        _logger?.LogError(ex, "❌ Ошибка при публикации события PositionChanged");
    }
}

3. Обновите InMemoryTradingDatabase.cs - только важные логи:

csharp
// InMemoryTradingDatabase.cs - уменьшаем уровень детализации
private async Task ProcessPositionEvent(PositionChangedEvent positionEvent, CancellationToken ct)
{
    if (string.IsNullOrEmpty(positionEvent.StrategyName)) return;

    var key = GetKey(positionEvent.Symbol, positionEvent.StrategyName);
    
    // Только если есть изменения
    if (_summaries.TryGetValue(key, out var summary) && 
        summary.Position == positionEvent.NetQuantity && 
        summary.OpenPnL == positionEvent.UnrealizedPnL)
    {
        return; // Нет изменений - не логируем
    }

    // Логируем только значительные изменения
    _logger.LogInformation("🔄 Position: {Ticker} {Strategy} → {Position} (PnL: {PnL:F2})",
        positionEvent.Symbol, positionEvent.StrategyName, 
        positionEvent.NetQuantity, positionEvent.UnrealizedPnL);
    
    // ... остальная логика обработки
}

4. Обновите StrategiesExecutionService.cs - только агрегированные логи:

csharp
// StrategiesExecutionService.cs - логировать только агрегированно
private async Task MonitorPerformance(CancellationToken ct)
{
    while (!ct.IsCancellationRequested)
    {
        await Task.Delay(30000, ct); // Каждые 30 секунд

        var elapsed = DateTime.UtcNow - _startTime;
        var ticksPerSecond = elapsed.TotalSeconds > 0
            ? _totalTicksProcessed / elapsed.TotalSeconds
            : 0;

        // Логируем как Information каждые 30 секунд
        _logger.LogInformation(
            "📈 Perf: {Ticks} тиков за {Time:mm\\:ss} ({Rate:F1}/сек), " +
            "Тикеров: {Tickers}, Стратегий: {Strategies}",
            _totalTicksProcessed,
            elapsed,
            ticksPerSecond,
            _processedCounts.Count,
            _tickerManager.GetTotalStrategiesCount());
    }
}

5. Обновите QuotesConsoleService.cs - сохранить красивый вывод:

csharp
// QuotesConsoleService.cs - оставляем как есть, это основной вывод
private void PrintQuote(QuoteGeneratedEvent quote)
{
    lock (_consoleLock)
    {
        var color = GetSymbolColor(quote.Symbol);
        var timestamp = DateTime.Now.ToString("HH:mm:ss");
        var change = GetChangeIndicator(quote);
        var percentChange = GetPercentChange(quote);

        Console.ForegroundColor = color;
        Console.Write($"[{timestamp}] {quote.Symbol} ");

        // Цвет для направления
        if (quote.Close > quote.Open)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write("↑");
        }
        else if (quote.Close < quote.Open)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write("↓");
        }
        else
        {
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.Write("→");
        }

        Console.ForegroundColor = color;
        Console.Write($" {quote.Close,8:F2}");

        // Процентное изменение
        if (quote.Close > quote.Open)
        {
            Console.ForegroundColor = ConsoleColor.Green;
            Console.Write($" (+{percentChange:F2}%)");
        }
        else if (quote.Close < quote.Open)
        {
            Console.ForegroundColor = ConsoleColor.Red;
            Console.Write($" ({percentChange:F2}%)");
        }
        else
        {
            Console.ForegroundColor = ConsoleColor.Gray;
            Console.Write($" (0.00%)");
        }

        Console.WriteLine();
        Console.ResetColor();
    }
}

6. Создайте файл appsettings.Development.json для тонкой настройки:

json
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning",
      "TradingPlatform.Services.QuotesConsoleService": "Information",
      "TradingPlatform.Services.EventHubStrategy": "Information",
      "TradingPlatform.Services.StrategiesExecutionService": "Warning",
      "TradingPlatform.Services.TradingMonitorService": "Warning",
      "TradingPlatform.Services.InMemoryTradingDatabase": "Warning",
      "BusLibrary02": "Warning"
    }
  }
}

7. Что будет в результате:

❌ УБЕРЕТСЯ:

  • [03:03:43] dbug: TradingPlatform.Services.EventHubStrategy[0] ✅ Опубликовано событие PositionChanged: VVV VVV_05s NetQty=-2

  • [03:03:43] dbug: TradingPlatform.Services.InMemoryTradingDatabase[0] 📊 Получен PositionChangedEvent: AAA AAA_05s Qty=1

  • [03:03:43] dbug: TradingPlatform.Services.InMemoryTradingDatabase[0] Position updated: AAA AAA_05s NetQty=1 PnL=-7

✅ ОСТАНЕТСЯ:

text
[03:03:43] VVV ↓  1425,00 (-0,35%)
03:03:43 | VVV | Цена: 1425,00 | Поз: -2 📉 | 🟢 ПОКУПКА ✓ | ⏳ Завершение (1) | P&L: 8,00
03:03:43 | VVV | Цена: 1425,00 | Поз: 1 📈 | 🟢 ПОКУПКА ✓ | ⏳ В процессе (6) | P&L: 13,00
03:03:43 | VVV | Цена: 1425,00 | Поз: 2 📈 | 🟢 ПОКУПКА ✓ | ⏳ В процессе (6) | P&L: -44,00
[03:03:43] WWW ↓  1288,00 (-0,92%)
03:03:43 | WWW | Цена: 1288,00 | Поз: 2 📈 | ⚪ УДЕРЖАНИЕ ✓ | ⏳ Завершение (1) | P&L: -69,00

✅ ПЛЮС важные события (если нужно):

text
[03:03:43] info: TradingPlatform.Services.EventHubStrategy[0] 📊 TRADE: VVV Buy 100 @ 1425.00 (VVV_05s)
[03:03:43] info: TradingPlatform.Services.EventHubStrategy[0] 📈 POSITION: VVV VVV_05s: NetQty=-2 | P&L=8.00

8. Дополнительная опция - создайте режим "Тихий" и "Подробный":

csharp
// В Program.cs
var isQuietMode = args.Contains("--quiet");

if (isQuietMode)
{
    builder.Logging.SetMinimumLevel(LogLevel.Warning);
    builder.Logging.AddFilter("TradingPlatform.Services.QuotesConsoleService", LogLevel.Information);
}
else
{
    builder.Logging.SetMinimumLevel(LogLevel.Information);
    // Полный вывод для отладки
}

Запускайте с флагом:

text
dotnet run -- --quiet

Итоговая таблица уровней логирования:

КомпонентУровеньЧто показывает
QuotesConsoleServiceInformationКотировки и статистика
EventHubStrategyInformationТолько сделки и позиции
InMemoryTradingDatabaseWarningТолько ошибки
StrategiesExecutionServiceWarningТолько ошибки и перфоманс
TradingMonitorServiceWarningТолько ошибки
BusLibrary02WarningТолько ошибки
Все остальноеWarningТолько ошибки

После этих изменений консоль будет чистой и информативной! 🎯

Комментариев нет:

Отправить комментарий