Как ограничить записи EventLog одним источником?

Я использую EventLog для поддержки класса ведения журнала в моем приложении C #. (Ранее ...) Вот сокращенная копия этого класса:

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 заполняется всем журналом, а не только журналами из указанного источника. Вот скриншот вывода:

http://img341.imageshack.us/img341/6185/entriesfromalllogs.png

(На этом изображении источник каждой записи указан в скобках после сообщения.)

Как мне заставить EventLog возвращать только эти записи из моего источника? Я полностью неправильно понял EventLog?


person Tom Wright    schedule 23.06.2010    source источник


Ответы (2)


Член EventLog.Source не работает как фильтр. Согласно документации MSDN для EventLog

Для чтения из журнала укажите имя журнала и MachineName (имя серверного компьютера) для журнала событий. Источник указывать не обязательно, поскольку источник требуется только для записи в журналы. Элемент Entries автоматически заполняется списком записей журнала событий.

Поскольку вы не указываете строку для 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.DeleteEventSource(), чтобы удалить имя источника SSD1 из журнала приложений (просто запустите это один раз для вашей системы). Приведенный выше код должен работать тогда (при условии, что у вас есть права администратора).

person Matt Davis    schedule 23.06.2010
comment
Привет, Мэтт, пытаясь использовать второй подход, я получаю следующую ошибку: Журнал событий «SSDAppLog» на компьютере ». не существует. Какие-либо предложения? - person Tom Wright; 23.06.2010

Я никогда не пробовал читать из журнала событий, поэтому не уверен, как это работает с их фильтрацией, но было бы предложение, чтобы вместо записи ваших событий в журнал Application вы могли создать свой собственный журнал, создать новый журнал с именем SSD или что-то в этом роде и тогда, когда вы его напишете / прочитаете, там будут только ваши события.

person Hans Olsson    schedule 23.06.2010