3

EventLog我有一些使用 C# 和 .Net类写入 Windows 事件日志的代码的间歇性问题。

基本上,这段代码每天都能完美运行,但我们偶尔会开始遇到如下错误:

“System.ArgumentException:只有自定义日志名称的前八个字符有意义,并且系统上已经有另一个使用给定名称的前八个字符的日志。给定的名称:'应用程序',现有日志的名称:'应用'。”

我可以从我们日志上的其他信息中确定受影响的调用堆栈是这样的 - 您可以清楚地看到我实际上正在尝试写入现有LB_Email日志(LogEmail首先调用):

public static void LogEmail(string to, string type)
{
    string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
    Log(message, "LB_Email", EventLogEntryType.Information);
}

private static void Log(string message, string logName, EventLogEntryType type)
{
    using (EventLog aLog = new EventLog())
    {
        aLog.Source = logName;
        aLog.WriteEntry(message, type);
    }
}

一旦错误开始发生,似乎对我们的事件日志的访问以LB_Email某种方式被锁定 - 查看特定事件日志上的属性显示大多数信息灰显且不可更改,并且其他进程似乎也被阻止记录到该日志。但是,我通过记录到“LB_Error”日志的 try-catch 看到错误(使用上述相同的 Log 方法),并且继续按预期运行。

我正在从多线程应用程序调用此代码,但我无法确定上面的代码是否是线程安全的。

我还可以确认有问题的日志在终止并重新启动进程后再次正常工作......并且它具有适当的设置以在它满时重用条目......虽然我不认为这是问题所在。

我很想听听您的想法和建议。

4

2 回答 2

4

文件指出:

您一次只能使用 Source 写入一个日志

所以我怀疑这个问题是由于您的多线程应用程序Log在给定时间多次调用该方法并为同一个源引起的。

我建议您使用线程安全的单例类来记录这些事件,而不是静态类(或方法)。

编辑:

Jon Skeet 有一篇关于单例的优秀文章

如果您不想实现单例类,可以执行以下操作:

    static readonly object lockObj = new object();

    public static void LogEmail(string to, string type)
    {
        string message = String.Format("{0}\t{1}\t{2}", DateTime.Now, to, type);
        Log(message, "LB_Email", EventLogEntryType.Information);
    }

    private static void Log(string message, string logName, EventLogEntryType type)
    {
        lock (lockObj)
        {
            using (EventLog aLog = new EventLog())
            {
                aLog.Source = logName;
                aLog.WriteEntry(message, type);
            }
        }
    }

希望这能解决您的问题。

于 2008-11-28T09:45:42.053 回答
0

谢谢布鲁诺,

那么,我是否误以为 Log 方法中的 EventLog 实例与不同线程中同一方法调用中的 EventLog 实例不同?还是我只是对静态方法中的对象实例感到困惑?

好的,所以我对 Log(...) 方法有几个包装器方法。如果我将 Log 方法移动到单例类中,更改了包装器(LogEmail、LogXxxx、LogYyy 等),那么我可以保持我的 Log.Zzzz 接口相同,但利用单例 LogSingleton.Instance.Log(...)从当前日志。或者因为我想写入不同的日志,每个日志都需要自己的 LogSingletonXxx 吗?

你可以说我很困惑 :) 是的 - 我真的很感激一些同步代码 :)

尼日

于 2008-11-28T10:43:51.453 回答