为什么我会丢失40%的系统日志消息,除非我睡眠线程?

时间:2015-05-13 21:53:43

标签: c# syslog

我使用SyslogNet.Client向服务器发送syslog(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());
        }
    }

首先,为什么会发生这种情况?其次,&#34;最佳实践&#34;减慢循环的方法? Thread.Sleep(1)似乎不是一个非常干净的解决方案。

谢谢!

1 个答案:

答案 0 :(得分:1)

看起来操作系统在垃圾邮件过多时会拒绝某些日志,睡眠很可能会很好。但确实有一些更可靠的解决方案。您可以设置Timer对象并拨打记录器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),尽管我们超出了您的问题范围。