为什么我会丢失 40% 的系统日志消息,除非我让线程休眠?
Why am I losing 40% of syslog messages unless I sleep the thread?
我正在使用 SyslogNet.Client 将系统日志 (UDP) 消息发送到服务器。我循环遍历数据库中的错误集合并发送它们。只有约 40% 的消息到达。我知道使用 UDP 不能保证消息到达,但这是一个非常高的百分比。但是,如果我在循环的每次迭代之间调用 Thread.Sleep(1)
,则 100% 的消息都会到达。我无法理解为什么会这样。
这是循环:
private static void SyslogErrors(Dictionary<int, string> errorCol)
{
foreach (var error in errorCol)
{
SyslogMessage("AppName", error.Value);
Thread.Sleep(1);
}
}
这里是SyslogMessage
:
private static void SyslogMessage(string appName, string message)
{
using (_syslogSender = new SyslogUdpSender(Server, Port))
{
var msg = new SyslogMessage(DateTime.Now,
Facility.SecurityOrAuthorizationMessages1,
Severity.Informational,
Environment.MachineName,
appName,
message);
_syslogSender.Send(msg, new SyslogRfc3164MessageSerializer());
}
}
首先,为什么会这样?其次,"best practices" 减慢循环速度的方法是什么? Thread.Sleep(1) 似乎不是一个非常干净的解决方案。
谢谢!
看起来 OS 在垃圾邮件过多时会拒绝一些日志,睡眠很可能会很好。但确实有一些更可靠的解决方案。你可以设置一个Timer object and call your logger using the Elapsed event。
类似于:
//likely much longer than needed, I figure you dont need this to breeze anyway
aTimer = new System.Timers.Timer(50);
aTimer.Elapsed += timeToLog;
aTimer.Enabled = true;
那你登录时间:
private static void timeToLog(Object source, ElapsedEventArgs e)
{
var error = getNextError(); //Keep an iterator somewhere
SyslogMessage("AppName", error.Value);
}
我可以添加您创建和管理迭代器 (getNextError) 所需的代码,尽管我们超出了您的问题范围。
我正在使用 SyslogNet.Client 将系统日志 (UDP) 消息发送到服务器。我循环遍历数据库中的错误集合并发送它们。只有约 40% 的消息到达。我知道使用 UDP 不能保证消息到达,但这是一个非常高的百分比。但是,如果我在循环的每次迭代之间调用 Thread.Sleep(1)
,则 100% 的消息都会到达。我无法理解为什么会这样。
这是循环:
private static void SyslogErrors(Dictionary<int, string> errorCol)
{
foreach (var error in errorCol)
{
SyslogMessage("AppName", error.Value);
Thread.Sleep(1);
}
}
这里是SyslogMessage
:
private static void SyslogMessage(string appName, string message)
{
using (_syslogSender = new SyslogUdpSender(Server, Port))
{
var msg = new SyslogMessage(DateTime.Now,
Facility.SecurityOrAuthorizationMessages1,
Severity.Informational,
Environment.MachineName,
appName,
message);
_syslogSender.Send(msg, new SyslogRfc3164MessageSerializer());
}
}
首先,为什么会这样?其次,"best practices" 减慢循环速度的方法是什么? Thread.Sleep(1) 似乎不是一个非常干净的解决方案。
谢谢!
看起来 OS 在垃圾邮件过多时会拒绝一些日志,睡眠很可能会很好。但确实有一些更可靠的解决方案。你可以设置一个Timer object and call your logger using the Elapsed event。
类似于:
//likely much longer than needed, I figure you dont need this to breeze anyway
aTimer = new System.Timers.Timer(50);
aTimer.Elapsed += timeToLog;
aTimer.Enabled = true;
那你登录时间:
private static void timeToLog(Object source, ElapsedEventArgs e)
{
var error = getNextError(); //Keep an iterator somewhere
SyslogMessage("AppName", error.Value);
}
我可以添加您创建和管理迭代器 (getNextError) 所需的代码,尽管我们超出了您的问题范围。