我正在使用EventLog来支持C#应用程序中的日志记录类。 (Previously...)以下是该课程的缩减副本:
class Logger
{
private EventLog eventLog;
private ListView listViewControl = null;
private String logSource = "SSD1";
public Logger(ListView _listViewControl = null, string _logFileName = null)
{
if (!EventLog.SourceExists("SSD1"))
EventLog.CreateEventSource(logSource, "Application");
eventLog = new EventLog();
eventLog.Source = logSource;
addListView(_listViewControl);
logFilename = _logFileName;
}
public void addListView(ListView newListView)
{
if (eventLog.Entries.Count > 0)
{
foreach (EventLogEntry entry in eventLog.Entries)
{
listViewControl.Items.Add(buildListItem(entry));
}
}
}
public void LogInformation(string message)
{
LogEntry(message, EventLogEntryType.Information);
}
private void LogEntry(string message, EventLogEntryType logType)
{
eventLog.WriteEntry(message, logType);
if (listViewControl != null)
{
updateListView();
}
}
private void updateListView()
{
listViewControl.Items.Add(buildListItem(eventLog.Entries[eventLog.Entries.Count-1]));
}
private ListViewItem buildListItem(EventLogEntry entry)
{
string[] eventArray = new string[3];
eventArray[0] = entry.Message + " (" + entry.Source +")";
eventArray[1] = entry.EntryType.ToString();
eventArray[2] = entry.TimeGenerated.ToString("dd/MM/yyyy - HH:mm:ss");
return new ListViewItem(eventArray);
}
问题是,ListView会填充整个日志 - 而不仅仅是来自指定源的日志。这是输出的屏幕截图:
Entries from all sources http://img341.imageshack.us/img341/6185/entriesfromalllogs.png
(在此图中,每个条目的来源都在消息后的括号内。)
如何让EventLog从我的源中仅返回 这些条目?我完全误解了EventLog吗?
答案 0 :(得分:2)
EventLog.Source
成员不能用作过滤器。根据{{3}}
要从日志中读取,请指定日志 name和MachineName(服务器计算机 nameLog用于EventLog。它不是 必须指定来源, 作为 只有写入时才需要源 日志 即可。参赛作品成员 自动填充事件 log的条目列表。
因为您没有为Log
实例的EventLog
成员指定字符串,所以它可以获得所有内容。
在我的头脑中,有几种方法可以解决这个问题。
首先,修改buildListItem()
以过滤您的来源名称。这是相对简单的。
其次,创建自己的日志。而不是记录到Application
日志,而是专门为您的应用程序创建日志。你可以通过改变你的构造函数来做到这一点:
public Logger(ListView _listViewControl = null, string _logFileName = null)
{
if (!EventLog.SourceExists("SSD1"))
EventLog.CreateEventSource("SSD1", "TomWrightApplication");
eventLog = new EventLog("TomWrightApplication", ".", "SSD1");
addListView(_listViewControl);
logFilename = _logFileName;
}
现在所有日志记录都将转到TomWrightApplication
日志,而不是通用Application
日志。
static void Main()
{
if (!EventLog.SourceExists("SSD1"))
EventLog.CreateEventSource("SSD1", "SSDAppLog");
EventLog log = new EventLog("SSDAppLog", ".", "SSD1");
log.WriteEntry("this is a test");
}
除非...... SSD1源名称已在另一个日志中注册,否则此操作成功。据我了解,源名称在所有事件日志中必须是唯一的。因此,如果您已经使用应用程序日志注册了SSD1,则在创建新的EventLog时上述代码将失败。尝试使用EventLog.DeleteEventSource()
从应用程序日志中删除SSD1源名称(只需为您的系统运行一次)。上面的代码应该适用(假设你有管理员权限)。
答案 1 :(得分:1)
我从来没有尝试过从事件日志中读取,所以不确定它如何过滤它们,但建议不是将事件写入Application
日志而是创建自己的日志创建一个新的日志称为SSD
或其他什么,然后当你写/读它时,它只会是你在那里的事件。