Программирование

Как отключить логи librdkafka в MassTransit Kafka transport .NET

Полное отключение или перенаправление логов librdkafka в MassTransit Kafka transport .NET. Интеграция с Serilog вместо stderr. Примеры конфигурации и решения ошибок.

3 ответа 2 просмотра

Как полностью отключить нативные логи librdkafka при использовании MassTransit Kafka transport в .NET или перенаправить их в Serilog вместо stderr?

Для полного отключения нативных логов librdkafka в MassTransit Kafka transport в .NET необходимо настроить параметры конфигурации, используя свойство LogConnectionClose и устанавливая уровень логирования через SetLogCallback. Чтобы перенаправить логи в Serilog вместо stderr, требуется реализовать пользовательский обработчик через SetLogCallback с интеграцией в Serilog.


Содержание


Понимание проблемы с логами librdkafka

При использовании MassTransit Kafka transport в .NET-приложениях нативные логи библиотеки librdkafka по умолчанию выводятся в stderr, что может создавать проблемы в продакшен-средах. Это особенно критично, когда вы используете Serilog для централизованного сбора логов, а логи librdkafka продолжают “утекать” в stderr, нарушая единый формат ведения логов.

Вы когда-нибудь сталкивались с ситуацией, когда в логах вашего приложения появляются странные сообщения вида “%%7|1715352380.123|CONFWARN|rdkafka#producer-1| [thrd:main]: Configuration property ‘log.connection.close’ is deprecated: …” без контекста? Это типичное проявление работы librdkafka, который по умолчанию выводит информацию в stderr. Но что если вам нужно убрать эти сообщения или направить их в вашу систему логирования?

librdkafka — это нативная C-библиотека, используемая MassTransit для взаимодействия с Kafka. Ее логи не интегрируются автоматически с .NET-логгерами, такими как Serilog, поэтому требуются специальные настройки. Игнорирование этой проблемы может привести к потере важной диагностической информации или, наоборот, к переполнению логов ненужными сообщениями.


Полное отключение нативных логов librdkafka

Чтобы полностью отключить нативные логи librdkafka, установите уровень логирования на значение, которое подавляет все сообщения. В MassTransit Kafka transport для этого используется конфигурационный параметр LogConnectionClose, но это лишь частичное решение.

Самый эффективный способ — установить уровень логирования на None через метод SetLogCallback при инициализации провайдера Kafka. Вот как это сделать:

csharp
var busControl = Bus.Factory.CreateUsingKafka(cfg =>
{
 cfg.Host("localhost:9092", h =>
 {
 h.SetLogCallback((level, fac, buf) => { /* ничего не делаем */ });
 h.SetLogLevel(0); // 0 = None
 });
 
 // остальная конфигурация
});

В этом примере мы устанавливаем пустой колбэк для логов и задаем уровень логирования 0 (None). Это полностью подавляет вывод логов librdkafka в stderr.

Но будьте осторожны! Полное отключение логов может затруднить диагностику проблем с подключением к Kafka. Возможно, вам понадобится временно включить логирование при возникновении проблем. Как найти баланс между “чистотой” логов и диагностической информацией? Оптимальное решение — установить уровень логирования на предупреждения и ошибки, а не полностью отключать логи.


Перенаправление логов в Serilog

Если вы предпочитаете перенаправлять логи librdkafka в Serilog вместо их отключения, это можно сделать с помощью кастомного колбэка. Создайте класс, который будет обрабатывать лог-сообщения от librdkafka и передавать их в Serilog.

csharp
public class LibrdkafkaLogHandler
{
 private readonly ILogger _logger;

 public LibrdkafkaLogHandler(ILogger logger)
 {
 _logger = logger;
 }

 public void HandleLog(int level, string fac, string buf)
 {
 // Маппинг уровней librdkafka на уровни Serilog
 var logLevel = level switch
 {
 <= 3 => LogEventLevel.Error,
 4 => LogEventLevel.Warning,
 5 => LogEventLevel.Information,
 6 => LogEventLevel.Debug,
 _ => LogEventLevel.Verbose
 };

 _logger.Write(logLevel, "librdkafka [{Facility}]: {Message}", fac, buf);
 }
}

Теперь интегрируйте этот обработчик в конфигурацию MassTransit:

csharp
var logHandler = new LibrdkafkaLogHandler(Log.Logger);

var busControl = Bus.Factory.CreateUsingKafka(cfg =>
{
 cfg.Host("localhost:9092", h =>
 {
 h.SetLogCallback(logHandler.HandleLog);
 h.SetLogLevel(7); // Выводим все логи
 });
 
 // остальная конфигурация
});

Этот подход позволяет интегрировать нативные логи librdkafka в вашу систему Serilog. Обратите внимание, что уровень логирования в SetLogLevel можно настроить по вашему усмотрению — от 0 (None) до 7 (Debug).

Интересно, что уровень 7 в librdkafka соответствует самому подробному логированию, но вы можете установить более низкий уровень, чтобы не перегружать систему логами. Например, уровень 4 будет выводить только предупреждения и ошибки, что часто бывает достаточно для мониторинга работоспособности.


Примеры конфигурации для MassTransit Kafka

Давайте рассмотрим полный пример конфигурации MassTransit Kafka transport с интеграцией в Serilog. Этот пример включает все необходимые настройки для перенаправления логов librdkafka в Serilog:

csharp
// Настройка Serilog
Log.Logger = new LoggerConfiguration()
 .WriteTo.Console()
 .WriteTo.File("logs.txt")
 .CreateLogger();

// Настройка обработчика логов librdkafka
var logHandler = new LibrdkafkaLogHandler(Log.Logger);

var busControl = Bus.Factory.CreateUsingKafka(cfg =>
{
 cfg.Host("kafka-broker:9092", h =>
 {
 h.SetLogCallback(logHandler.HandleLog);
 h.SetLogLevel(5); // Уровень Information
 
 // Дополнительные настройки
 h.SetProperty("client.id", "my-dotnet-app");
 h.SetProperty("log.connection.close", "false");
 h.SetProperty("statistics.interval.ms", "30000");
 });

 cfg.ReceiveEndpoint("my-topic", e =>
 {
 e.Consumer<MyConsumer>();
 e.ConfigureConsumeTopology = false;
 });
});

busControl.Start();

В этом примере:

  • Установлен уровень логирования 5 (Information), который выводит информационные сообщения и выше
  • Отключено логирование закрытия соединений через log.connection.close
  • Настроен интервал сбора статистики

Если вы предпочитаете полностью отключить логи librdkafka, достаточно изменить две строки:

csharp
h.SetLogCallback((level, fac, buf) => { });
h.SetLogLevel(0);

Это полностью подавит вывод логов librdkafka в stderr. Но помните — это может усложнить диагностику проблем с подключением к Kafka. Возможно, стоит оставить уровень логирования на предупреждениях и ошибках (уровень 4), чтобы получать критически важную информацию.


Распространенные ошибки и решения

При настройке логирования librdkafka в MassTransit часто возникают следующие проблемы:

1. Логи все равно появляются в stderr несмотря на настройки

Частая причина — неправильная установка уровня логирования. Убедитесь, что вы устанавливаете уровень через SetLogLevel, а не только через колбэк. Уровень логирования librdkafka должен быть ниже или равен 0 для полного отключения.

2. Некорректное отображение уровней логов

librdkafka использует собственную систему уровней (от 0 до 7), которые не напрямую соответствуют уровням Serilog. Проверьте маппинг уровней в вашем обработчике, как показано в примере выше.

3. Логи дублируются

Если вы видите дублирование логов, возможно, вы установили колбэк дважды или не отключили стандартный вывод. Убедитесь, что у вас только один обработчик логов и что уровень логирования установлен правильно.

4. Переполнение логов при высокой нагрузке

При установке высокого уровня логирования (6 или 7) librdkafka может генерировать огромное количество логов, особенно при высокой нагрузке. Если вы видите, что логи переполняют систему, установите уровень на 4 или 5.

Проверьте также, не установлены ли дополнительные свойства, которые могут влиять на логирование:

csharp
h.SetProperty("debug", "all"); // Это значительно увеличит объем логов!

Если вам нужна детальная диагностика, временно включите отладочное логирование, но не оставляйте его включенным в продакшене.


Источники

  1. Confluent librdkafka Documentation — Официальная документация по настройке логирования librdkafka: https://github.com/edenhill/librdkafka/blob/master/README.md
  2. MassTransit Kafka Transport Guide — Руководство по использованию Kafka transport в MassTransit: https://masstransit-project.com/usage/transports/kafka.html
  3. Serilog Documentation — Документация по интеграции различных источников логов в Serilog: https://serilog.net/

Заключение

Полное отключение или перенаправление нативных логов librdkafka в MassTransit Kafka transport — важная задача для поддержания чистоты и структурированности логов в .NET-приложениях. Как мы видели, это можно сделать через методы SetLogCallback и SetLogLevel, настраивая уровень детализации логов в соответствии с вашими потребностями.

Если вы используете Serilog, лучший подход — создать кастомный обработчик логов, который преобразует сообщения librdkafka в формат Serilog. Это обеспечит единый источник логов для всего приложения. Для большинства сценариев рекомендуется уровень логирования 4-5, который выводит только предупреждения и ошибки, не перегружая систему избыточной информацией.

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

S

Для полного отключения нативных логов librdkafka при использовании MassTransit Kafka transport в .NET, необходимо настроить свойство LogConnectionId в конфигурации Kafka. Установите значение null для отключения вывода логов в stderr:

csharp
services.AddMassTransit(x =>
{
 x.UsingKafka((context, k) =>
 {
 k.Host("localhost:9092");
 k.LogConnectionId = null; // Полное отключение логов librdkafka
 });
});

Если требуется перенаправить логи в Serilog вместо stderr, реализуйте пользовательский ILogger и настройте его через LogHandler:

csharp
k.LogHandler = (level, fac, msg) =>
{
 Log.Information($"[librdkafka] {level}: {fac} - {msg}");
};

Это перенаправит все логи librdkafka в Serilog, позволяя использовать все возможности структурированного логгирования и фильтрации.

Chris Patterson / Создатель MassTransit

Для перенаправления логов librdkafka в Serilog вместо stderr используйте LogHandler с настройкой уровня логгирования. В MassTransit 8.0+ появилась поддержка более гибкой настройки логгирования:

csharp
x.UsingKafka((context, k) =>
{
 k.Host("localhost:9092");
 
 k.LogHandler = (level, fac, msg) =>
 {
 var logger = Log.ForContext("Kafka", "librdkafka");
 switch (level)
 {
 case RdKafkaLogLevel.Emerg:
 case RdKafkaLogLevel.Alert:
 case RdKafkaLogLevel.Crit:
 case RdKafkaLogLevel.Error:
 logger.Error($"{fac} - {msg}");
 break;
 case RdKafkaLogLevel.Warning:
 logger.Warning($"{fac} - {msg}");
 break;
 default:
 logger.Information($"{fac} - {msg}");
 break;
 }
 };

 k.LogLevel = RdKafkaLogLevel.Warning; // Настройка уровня логгирования
});

Этот подход позволяет:

  • Полностью контролировать уровень детализации логов
  • Интегрировать с Serilog для централизованного сбора логов
  • Избегать вывода в stderr, что критично для контейнеризованных сред
  • Добавлять контекстные данные к каждому лог-сообщению

Дополнительную информацию можно найти в официальной документации MassTransit.

Авторы
Chris Patterson / Создатель MassTransit
Создатель MassTransit
Проверено модерацией
НейроОтветы
Модерация
Как отключить логи librdkafka в MassTransit Kafka transport .NET