EventLog прерывистое исключение - PullRequest
3 голосов
/ 28 ноября 2008

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

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

"System.ArgumentException: только первые восемь символов пользовательского журнала имя значимо, и есть уже другой лог в системе используя первые восемь символов имя дано. Имя дано: «Приложение», название существующего журнала: 'Application'. "

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 28 ноября 2008

Документация гласит:

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

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

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

EDIT:

У Джона Скита есть отличная статья о синглетонах.

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

    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 голосов
/ 28 ноября 2008

Спасибо, Бруно,

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

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

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

Ния

...