2008-11-28 2 views
3

У меня проблема с некоторыми сообщениями, которые записываются в журнал событий Windows, используя классы C# и .Net EventLog.EventLog Прерывистое исключение

В основном, этот код работает изо дня в день прекрасно, но очень редко, мы начинаем получать ошибки, как это:

«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 EventLog заблокирован какой-то образом - просмотр свойств на конкретном EventLog показывает наиболее полную информацию неактивна-аут и неизменен, и другие процессы, по всей видимости, предотвратить вход в этот журнал слишком. Тем не менее, я вижу ошибку (которая использует тот же метод Log выше) с помощью try-catch, который регистрируется в журнале LB_Error и продолжает функционировать должным образом.

Я вызываю этот код из многопоточного приложения, но мне не удалось определить, является ли этот код потокобезопасным или нет.

Я также могу подтвердить, что вопрос с журналом снова работает после того, как он убил и перезапустил процесс ... и у него были соответствующие настройки для повторного использования записей, когда он был заполнен ... хотя я не думаю, что это было вопрос.

Я хотел бы услышать ваши мысли и предложения.

ответ

4

В documentation говорится, что:

Вы можете использовать только источник для записи на один журнал в то время

Так что я подозреваю, эту проблему вызван ваши многопоточные приложения вызова Log более того, один раз в данный момент времени и для одного и того же источника.

Я предлагаю вместо статического класса (или методов) использовать потоковый одноэлементный класс для регистрации этих событий.

EDIT:

Джон Скит имеет excellent article на одиночек.

Если вы не хотите, чтобы реализовать класс одноэлементных вы можете сделать что-то вроде этого:

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); 
      } 
     } 
    } 

Надеется, что это решает проблему.

+0

Спасибо за эту ссылку Бруно и последнее редактирование ... по иронии судьбы, я нашел эту статью сегодня, ища другие источники информации! Nij – Nij 2008-11-28 10:46:50

0

Благодаря Бруно,

Итак, я ошибаюсь, думая, что экземпляр EventLog в методе журнала отличается от экземпляра EventLog в одном вызове метода в другом потоке? Или я просто запутался в экземплярах объектов внутри статического метода?

ОК, поэтому у меня есть несколько методов обертки для метода Log (...). Если я переместил метод журнала в одноэлементный класс, изменил обертки (LogEmail, LogXxxx, LogYyy и т. Д., То я мог бы поддерживать мои интерфейсы Log.Zzzz одинаково, но использовать безопасность одноэлементного LogSingleton.Instance.Log (...) .? от текущих журналов или потому, что я хочу писать в разные журналы, что каждый из них требует своей собственной LogSingletonXxx

Вы можете сказать, что я запутался :) Да - я действительно ценю код синхронизации :)

Nij

+0

Nij, код ниже класса EventLog не знает, как обращаться с более чем одним запросом за время для одного и того же источника. Даже если вы создаете отдельные экземпляры EventLog, они должны конкурировать с одним и тем же статическим ресурсом, представленным свойством Source. – 2008-11-28 11:18:58

Смежные вопросы