如何防止 RabbitMQ 命名线程?
How do I prevent RabbitMQ from naming threads?
在我们项目升级的某个时候,我们开始注意到名称被分配给了我们的 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] Console INFO - About to receive messages...
2020-01-31 16:13:43,807 [WorkPool-Session#1:Connection(aa8913fd-aec2-4bd8-9cdc-2efc4f484363,amqp://127.0.0.1:5672)] Console INFO - Message Received!
2020-01-31 16:13:43,807 [WorkPool-Session#1:Connection(aa8913fd-aec2-4bd8-9cdc-2efc4f484363,amqp://127.0.0.1:5672)] Console INFO - Message Received!
注意 RabbitMq 消费者的线程 ID 是如何命名的。如果可能,我想恢复到以前的行为(数字线程 ID)。
我找到了违规代码。实际上,观察到的行为是由于将我们的 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
如果在 log4net 的 PatternLayout 中指定 "threadid",如果 未指定线程名称,则只会获得线程 ID 。要回答我自己的问题,似乎没有办法轻松改变这种行为。
在我们项目升级的某个时候,我们开始注意到名称被分配给了我们的 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] Console INFO - About to receive messages...
2020-01-31 16:13:43,807 [WorkPool-Session#1:Connection(aa8913fd-aec2-4bd8-9cdc-2efc4f484363,amqp://127.0.0.1:5672)] Console INFO - Message Received!
2020-01-31 16:13:43,807 [WorkPool-Session#1:Connection(aa8913fd-aec2-4bd8-9cdc-2efc4f484363,amqp://127.0.0.1:5672)] Console INFO - Message Received!
注意 RabbitMq 消费者的线程 ID 是如何命名的。如果可能,我想恢复到以前的行为(数字线程 ID)。
我找到了违规代码。实际上,观察到的行为是由于将我们的 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
如果在 log4net 的 PatternLayout 中指定 "threadid",如果 未指定线程名称,则只会获得线程 ID 。要回答我自己的问题,似乎没有办法轻松改变这种行为。