如何将EventLog条目限制为一个源?

时间:2010-06-23 16:49:24

标签: c# listview event-log

我正在使用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吗?

2 个答案:

答案 0 :(得分:2)

EventLog.Source成员不能用作过滤器。根据{{​​3}}

的MSDN文档
  

要从日志中读取,请指定日志   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或其他什么,然后当你写/读它时,它只会是你在那里的事件。