在使用C#和.NET的EventLog类写入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‘日志,并继续发挥预期的作用。
我从多线程应用程序调用这段代码,但是我无法识别上面的代码是否是线程安全的。
我还可以确认,在杀死并重新启动过程之后,所讨论的日志再次正常工作.当它满的时候,它有适当的设置来重用条目.虽然我不认为这是问题所在。
我很想听听你的想法和建议。
发布于 2008-11-28 09:45:42
文档指出:
只能使用源一次写入一个日志
因此,我怀疑这个问题是由您的多线程应用程序在给定的时间和同一源代码中多次调用Log方法造成的。
我建议您使用线程安全的单例类来记录这些事件,而不是静态类(或方法)。
编辑:
乔恩·斯基特( Jon )有一个关于单身汉的优秀文章。
如果不想实现单例类,可以这样做:
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);
}
}
}希望这能解决你的问题。
https://stackoverflow.com/questions/325325
复制相似问题