Multithreading 事件日志间歇性异常
我在使用C#和.Net的Multithreading 事件日志间歇性异常,multithreading,event-log,Multithreading,Event Log,我在使用C#和.Net的EventLog类写入Windows事件日志的一些代码中遇到了间歇性问题 基本上,这段代码每天都能正常工作,但偶尔会出现如下错误: static readonly object lockObj = new object(); public static void LogEmail(string to, string type) { string message = String.Format("{0}\t{1}\t{2}", Da
EventLog
类写入Windows事件日志的一些代码中遇到了间歇性问题
基本上,这段代码每天都能正常工作,但偶尔会出现如下错误:
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);
}
}
}
“System.ArgumentException:只有
自定义日志的前八个字符
名字是有意义的,而且是有意义的
系统上已存在另一个日志
使用
给定的名称。给定的名称:
“应用程序”,现有日志的名称:
“应用程序”
我可以从我们日志上的其他信息中看出,受影响的调用堆栈是这样的-您可以清楚地看到,我实际上正在尝试写入现有的LB_电子邮件
log(LogEmail
首先被调用):
一旦错误开始发生,对我们的LB_电子邮件
eventlog的访问似乎以某种方式被锁定-查看特定eventlog上的属性显示大多数信息变灰且不可更改,其他进程似乎也无法登录到该日志。然而,我通过一个try-catch看到了这个错误(它使用了上面相同的日志方法),这个try-catch记录到一个“LB_error”日志中,并按照预期继续工作
我从多线程应用程序调用此代码,但我无法确定上面的代码是否是线程安全的
我还可以确认,在终止并重新启动进程后,有问题的日志再次正常工作。。。而且它有适当的设置,当它满的时候可以重用条目。。。虽然我不认为这是问题所在
我很想听听你的想法和建议。声明:
您只能使用源代码进行写入
一次复制一个日志
因此,我怀疑这个问题是由多线程应用程序在给定时间对同一源多次调用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);
}
}
}
希望这能解决您的问题。谢谢布鲁诺
那么,我是否错误地认为Log方法中的EventLog实例与不同线程中相同方法调用中的EventLog实例不同?或者我只是对静态方法中的对象实例感到困惑
好的,我有几个到Log(…)方法的包装器方法。如果我将Log方法移动到一个singleton类中,更改了包装器(LogEmail、LogXxxx、LogYyy等),那么我可以保持我的Log.Zzzz接口不变,但利用当前日志中singleton LogSingleton.Instance.Log(…)的安全性。或者因为我想写入不同的日志,每个日志是否都需要自己的LogSingletonXxx
你可以看出我很困惑:)是的-我真的很感激一些同步代码:)
Nij感谢Bruno的链接和最近的编辑。。。具有讽刺意味的是,我今天在寻找其他信息来源时发现了这篇文章!在NijNij中,EventLog类下面的代码不知道如何每次处理同一源的多个请求。即使创建不同的EventLog实例,它们也必须与Source属性表示的相同静态资源竞争。