winevent query log eventlog event powershell event-log eventlog-source

powershell - query - Cómo determinar si un EventLog ya existe



get-winevent (8)

Estoy usando la siguiente línea para crear un nuevo registro de eventos

new-eventlog -LogName "Visual Studio Builds" -Source "Visual Studio"

Quiero ejecutar esto cada vez, porque si ejecuto una compilación desde una computadora nueva, aún me gustaría ver los registros de eventos.

El problema es que cada vez que se ejecuta el script después de que el registro ya está creado, arroja un error.

New-EventLog : The "Visual Studio" source is already registered on the "localhost" computer. At E:/Projects/MyApp/bootstrap.ps1:14 char:13 + new-eventlog <<<< -LogName "Visual Studio Builds" -Source "Visual Studio" + CategoryInfo : InvalidOperation: (:) [New-EventLog], InvalidOperationException + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.NewEventLogCommand

Ahora sé que puedo "buscar" el registro de eventos

Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"}

Pero ahora, ¿cómo puedo determinar si existe?


Así que estaba en el camino correcto con Get-EventLog .

En lugar de solo leerlo, lo almacené en una variable. Luego verifiqué si la variable era null .

Esto ha logrado lo que estaba buscando hacer.

$logFileExists = Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"} if (! $logFileExists) { New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio" }


Creo que a continuación el enfoque podría reducir la carga de trabajo de filtro con el lugar where

try { Get-EventLog -LogName "Visual Studio Builds" -ErrorAction Ignore| Out-Null } catch { New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio" }


Menos complejo:

if (!(Get-Eventlog -LogName "Application" -Source "YourLog")){ New-Eventlog -LogName "Application" -Source "YourLog" }


Para simplemente verificar si existe:

$EventLogName = "LogName" if ( !($(Get-EventLog -List).Log.Contains($EventLogName))) {}

Pero para crear el nuevo necesitarás el privilegio "Como administrador". Para resolver esto solía llamar a un subproceso:

Start-Process -verb runAs powershell.exe -ArgumentList "-file $PSScriptRoot/CreateLog.ps1" -wait

Con simple CreateLog.ps1:

New-EventLog -LogName ScriptCheck -Source ScriptCheck Write-EventLog –LogName ScriptCheck ` –Source ScriptCheck –EntryType Information –EventID 100 ` –Message "Start logging!"


Verifique el método existente:

[System.Diagnostics.EventLog]::Exists(''Visual Studio Builds'')


if ([System.Diagnostics.EventLog]::SourceExists("Visual Studio") -eq $False) { New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio" }


# Check if Log exists # Ref: http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.exists(v=vs.110).aspx [System.Diagnostics.EventLog]::Exists(''Application''); # Ref: http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.sourceexists(v=vs.110).aspx # Check if Source exists [System.Diagnostics.EventLog]::SourceExists("YourLogSource");


$SourceExists = [System.Diagnostics.Eventlog]::SourceExists("XYZ") if($SourceExists -eq $false){ [System.Diagnostics.EventLog]::CreateEventSource("XYZ", "Application") }

Simplemente hacer esto no es suficiente. Aunque haya creado el origen del evento, $SourceExists siempre será false . También lo probé ejecutando CreateEventSource luego Remove-EventLog , y lo CreateEventSource . Después de crear un origen de evento, debe escribirle algo. Añada esto después de ejecutar CreateEventSource .

Write-EventLog -LogName "Application" -Source "XYZ" -EventID 0 -EntryType Information -Message "XYZ source has been created."

Gracias a JohnLBevan señalando esto (en los comentarios).