【问题标题】:How do I prevent RabbitMQ from naming threads?如何防止 RabbitMQ 命名线程?
【发布时间】:2019-10-22 10:06:19
【问题描述】:

在我们的项目升级过程中,我们开始注意到名称被分配给我们的 RabbitMq 客户端线程。这会导致我们的日志文件中出现大量不需要的垃圾邮件。

例如一条典型的日志消息来自此

2019-10-22 10:56:17,981 [7] INFO - Publishing 440d9474-7c96-4226-8023-ca086dc0e143.product.001 to 127.0.0.1:5672. 

到这里:

2019-10-22 10:56:17,981 [WorkPool-Session#1:Connection(a0437bf5-25c9-44f7-9a66-d3173e692fb2,amqp:/127.0.0.1:5672)] INFO - Publishing 440d9474-7c96-4226-8023-ca086dc0e143.product.001 to 127.0.0.1:5672. 

是什么原因造成的,有没有办法将此行为恢复到以前的状态?没有更改任何逻辑,但项目已升级到 .NET 472,某些 Nuget 包也已升级。

我们对 RabbitMq 客户端的线程名称不感兴趣 - 我们只关心数字线程 ID。

编辑:

这是一个演示该问题的小程序。您需要一个 RabbitMQ 服务器来连接相关详细信息。当客户端从队列中读取消息时,消息将被记录:

    public static void Main(string[] args)
    {
        var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly());
        XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config"));
        var logger = LogManager.GetLogger(Assembly.GetEntryAssembly(), "Console");
        
        var fact = new ConnectionFactory {HostName = "127.0.0.1", UserName = "guest", Password = "guest", Port = 5672 };
        var conn = fact.CreateConnection();

        var channel = conn.CreateModel();
        channel.ExchangeDeclare("demo", "topic");
        var queue = channel.QueueDeclare();
        channel.QueueBind(queue.QueueName, "demo", "*");
        var consumer = new EventingBasicConsumer(channel);

        consumer.Received += (sender, message) =>
        {
           logger.Info("Message Received!");
        };

        logger.Info("About to receive messages...");
        channel.BasicConsume(queue.QueueName, true, consumer);

        Console.ReadLine();
    }

log4net.config:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <root>
    <level value="DEBUG" />
    <appender-ref ref="Console" />
  </root>
  <appender name="Console" type="log4net.Appender.ConsoleAppender" >
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date [%thread] %c %-5level - %message%newline" />
    </layout>
  </appender>
</log4net>

Nuget 版本:

log4net 2.0.8

RabbitMQ.Client 5.1.2

日志输出:

2020-01-31 16:13:43,556 [1] 控制台信息 - 即将接收消息...

2020-01-31 16:13:43,807 [WorkPool-Session#1:Connection(aa8913fd-aec2-4bd8-9cdc-2efc4f484363,amqp://127.0.0.1:5672)] 控制台信息 - 收到消息!

2020-01-31 16:13:43,807 [WorkPool-Session#1:Connection(aa8913fd-aec2-4bd8-9cdc-2efc4f484363,amqp://127.0.0.1:5672)] 控制台信息 - 收到消息!

注意来自 RabbitMq Consumer 的线程 ID 是如何命名的。如果可能,我想恢复到以前的行为(数字线程 ID)。

【问题讨论】:

  • “Nuget 包也升级了” - 听起来像是默认日志格式或您正在使用的日志格式已更改。 “WorkPool-Session”建议您使用构建在 RabbitMQ .NET 客户端之上的库。如果有一个可运行的项目来演示您所看到的内容,或者至少是您正在使用的库和版本的完整列表,将会很有帮助。
  • 听起来您要求我们为您调试 NuGet 包升级。听起来那是你的工作,不是我们的。

标签: .net rabbitmq log4net


【解决方案1】:

我找到了有问题的代码。实际上,观察到的行为是由将我们的 RabbitMq 客户端版本升级到 5.x 引起的(此代码在 master 分支上有所不同)。

#if NETFX_CORE
            System.Threading.Tasks.Task.Factory.StartNew(Loop, System.Threading.Tasks.TaskCreationOptions.LongRunning);
#else
            var thread = new Thread(Loop)
            {
                Name = "WorkPool-" + name,
                IsBackground = true
            };
#endif

https://github.com/rabbitmq/rabbitmq-dotnet-client/blob/5.x/projects/client/RabbitMQ.Client/src/client/impl/ConsumerWorkService.cs

如果您在 log4net 的 PatternLayout 中指定“threadid”,您将仅获得线程 ID 如果未指定线程名称。要回答我自己的问题,似乎没有办法轻松改变这种行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-10
    • 2014-03-31
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多