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

基本上,这个代码工作一天到一天的完美,但很偶然,我们开始越来越象这样的错误:

  

“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事件日志被以某种方式锁定 - 特定事件日志观看属性表示大部分信息灰色显示的和不可改变的,和其它过程似乎是从记录到该日志也防止。然而,我看到的错误经由一个try-catch它记录到一个“LB_Error”日志(使用上述相同的Log方法),并且继续进行正常操作。

我打电话从多线程应用程序的代码,但我无法确定如果上述代码是线程安全与否。

我也可以证实,在日志中的问题是杀死并重新启动过程后再次合作很好...并且它有适当的设置重用条目时,它得到了全...虽然我不认为这是问题

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

有帮助吗?

解决方案

文档指出:

  

您只能使用源代码来写   到一个日志时间

所以我怀疑这个问题是由你的多线程应用程序调用Log方法的更多,一旦在给定的时间和相同的源引起的。

我建议,而不是一个静态类(或方法),你可以使用一个线程安全的单例类用于记录这些事件。

编辑:

乔恩斯基特对单身一个优良文章

如果您不希望实现一个单独的类,你可以做这样的事情:

    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);
            }
        }
    }

希望这能解决你的问题。

其他提示

感谢布鲁诺,

所以,是我错了思维,在登录方法的EventLog实例不同于EventLog实例在不同的线程相同的方法调用?还是我只是弄不清对象实例的静态方法里面?

行,所以我有几个包装方法的日志(...)方法。如果我感动的登录方法到一个单例类,改变了包装(LogEmail,LogXxxx,LogYyy等那么我可以保持我的Log.Zzzz接口相同,但充分利用单LogSingleton.Instance.Log的安全性(...)从目前的日志。还是因为我想写给不同的记录,将每一个需要自己LogSingletonXxx?

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

NIJ

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top