为什么我会丢失 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) 所需的代码,尽管我们超出了您的问题范围。