web-dev-qa-db-fra.com

Comment déterminer si un EventLog existe déjà

J'utilise la ligne suivante pour créer un nouveau journal des événements

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

Je veux l'exécuter à chaque fois, car si j'exécute une version à partir d'un nouvel ordinateur, j'aimerais quand même voir les journaux des événements.

Le problème est que chaque fois que le script est exécuté après la création du journal, il génère une erreur.

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

Maintenant, je sais que je peux "rechercher" le journal des événements.

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

Mais maintenant, comment puis-je déterminer s'il existe?

31
Chase Florell

Donc, j'étais sur le bon chemin avec Get-EventLog.

Au lieu de simplement le lire, je l'ai stocké dans une variable. Ensuite, j'ai vérifié si la variable était null.

Cela a permis de réaliser ce que je cherchais à faire.

$logFileExists = Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"} 
if (! $logFileExists) {
    New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
}
24
Chase Florell
# 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");
34
Jonathan Donahue

Vérifiez la méthode Exists:

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

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

11
Sean Webb

Pour vérifier simplement si existe:

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

Mais pour créer le nouveau, vous aurez besoin du privilège "En tant qu'administrateur". Pour résoudre ce problème, j’appelais un sous-processus:

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

Avec CreateLog.ps1 simple:

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

Je pense que l'approche ci-dessous pourrait réduire la charge de travail du filtre avec where

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

Moins complexe:

 if (!(Get-Eventlog -LogName "Application" -Source "YourLog")){
      New-Eventlog -LogName "Application" -Source "YourLog"
 }
1
pwrshll
$SourceExists = [System.Diagnostics.Eventlog]::SourceExists("XYZ")
if($SourceExists -eq $false){
    [System.Diagnostics.EventLog]::CreateEventSource("XYZ", "Application")
}

Cela ne suffit pas. Même si vous avez créé la source d'événements, $SourceExists sera toujours false. Je l'ai également testé en exécutant CreateEventSource puis Remove-EventLog, et sa suppression a échoué. Après avoir créé une source d’événement, vous devez lui écrire quelque chose. Ajoutez ceci après avoir lancé CreateEventSource.

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

Merci à https://stackoverflow.com/users/361842/johnlbevan pour cela (dans les commentaires).

0
Tyler Montney