EventSource не записывает логи в окне просмотра событий Windows - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь написать журнал в средстве просмотра событий Windows.Я создал класс и создал метод для ловли исключений.Вот мой код:

[EventSource(Name = "Samples-EventSourceDemos-EventLog")]
public sealed class MinimalEventSource : EventSource
{
    public static MinimalEventSource Log = new MinimalEventSource();
    [NonEvent]
    public void WriteLog(Exception exception)
    {
        UnhandledException(exception.Message);
    }

    [Event(601, Message = "Unhandled exception occurred. Details: {0}", Keywords = EventKeywords.None, Level = EventLevel.Critical)]
    private void UnhandledException(string exceptionMsg)
    {
        this.WriteEvent(601, exceptionMsg);
    }
}

static void Main(string[] args)
{
    AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException;
    throw new Exception("TestException");
}

private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    MinimalEventSource.Log.WriteLog(e.ExceptionObject as Exception);
    Process.GetCurrentProcess().Kill();
}

В средстве просмотра событий Windows я не смог найти этот журнал

Windows event viewer

Я установил Microsoft.Diagnostics.Tracing.EventSource от nuget.Это создает манифесты после восстановления.Вот папка отладки Debug folder

Я решил зарегистрировать ее по коду:

string commandOfRegistringEventSource = "";
using (Process process = new Process())
{
    ProcessStartInfo startInfo = new ProcessStartInfo
    {
        WindowStyle = ProcessWindowStyle.Hidden,
        FileName = "cmd.exe",
        Arguments = commandOfRegistringEventSource
    };
    process.StartInfo = startInfo;
    process.Start();
}

Я попытался выполнить, используя wevtutil.exe im <EtwManifestManFile> /rf:"<EtwManifestDllFile>" /mf:"<EtwManifestDllFile>", но он показывает ошибки типа The system cannot find the file specified., ... Помогите, пожалуйста, написать команду cmd для регистрации EventSource.Вот манифест

 C:\Users\dilshodk\source\repos\ETW loggiing\ETW loggiing\bin\Debug\ETW loggiing.Samples-EventSourceDemos-EventLog.etwManifest.dll
C:\Users\dilshodk\source\repos\ETW loggiing\ETW loggiing\bin\Debug\ETW loggiing.Samples-EventSourceDemos-EventLog.etwManifest.man

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Вам нужно еще несколько шагов, чтобы это заработало.Прежде всего, вам нужно установить свойство Channel атрибута Event следующим образом:

[EventSource(Name = "Samples-EventSourceDemos-EventLog")]
public sealed class MinimalEventSource : EventSource
{
    public static MinimalEventSource Log = new MinimalEventSource();
    [NonEvent]
    public void WriteLog(Exception exception)
    {
        UnhandledException(exception.Message);
    }

    [Event(601, Channel = EventChannel.Admin,  Message = "Unhandled exception occurred. Details: {0}", Keywords = EventKeywords.None, Level = EventLevel.Critical)]
    private void UnhandledException(string exceptionMsg)
    {
        this.IsEnabled().Dump();
        this.WriteEvent(601, exceptionMsg);
    }
}

Во-вторых, ваш EventSource должен быть зарегистрирован.Шаги являются набросками здесь :

Одним из требований, предъявляемых поддержкой канала, является необходимость статической регистрации манифеста провайдера ETW.Пакет NuGet поддерживает создание файлов, необходимых для статической регистрации, как часть вашей сборки.После завершения вашей сборки запускается новый шаг, который генерирует пару файлов для каждого из типов источников событий, определенных в проекте: ..etwManifest.man и ..etwManifest.dll

Первый файл содержит ETWманифест, в то время как второй содержит двоичную форму манифеста ETW плюс все необходимые собственные ресурсы (в частности, таблицы строк локализации).

Инструментом, который генерирует два вышеупомянутых файла, является «eventRegister.exe», и он выполняет двафункции: он обеспечивает создание файлов регистрации для всех типов источников событий, для которых требуется статическая регистрация, и выполняет ряд проверок достоверности для всех типов источников событий, определенных в выходной сборке.При развертывании компонента необходимо включить эти файлы и выполнить один шаг регистрации во время установки и один шаг отмены регистрации во время удаления.

Регистрация:

wevtutil.exe im <EtwManifestManFile> /rf:"<EtwManifestDllFullPathName>" /mf:"<EtwManifestDllFullPathName>"

Отмена регистрации:

wevtutil.exe um <EtwManifestManFile>

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

Обратите внимание, что вы увидите, что в файле .etwManfest.man, сгенерированном сборкой,в этом файле есть пути к файлу ресурса и файлу манифеста.Это пути, которые существовали во время сборки.Эти пути НЕ используются, если вы используете параметры / rf и / mf.Таким образом, вы всегда должны указывать параметры / rf: и / mf (если вы не изменяете вручную файл .etwManifest.man, чтобы указать пути к файлу времени развертывания для DLL).Наконец, важно, чтобы вы использовали ПОЛНОСТЬЮ полные имена для параметров / mf: и / rf :.Вы можете использовать переменные окружения, которые доступны всем процессам (например,% SystemRoot% или% ProgramFiles%), но вы не должны использовать относительные пути (неясно, к чему они относятся, вероятно, System32, но не рассчитывайте на это).Общая рекомендация - скопировать ваши etwManifest.dll и .etwManifest.man в каталог в% ProgramFiles%, а затем использовать wevtutil, чтобы зарегистрировать их в этом месте.

Самый простой способ создания описанных файловвыше добавьте этот пакет NuGet , так как он создаст эти файлы при сборке вашего проекта.Поставляется с документами в формате .docx.

0 голосов
/ 15 декабря 2018

Я делал это в прошлом, пишу в журнал событий Application:

using (EventLog eventLog = new EventLog("Application")) 
{
    eventLog.Source = "Application"; 
    eventLog.WriteEntry("Log message test", EventLogEntryType.Information, 101, 1); 
}
...