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?
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"
}
# 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");
Vérifiez la méthode Exists
:
[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"
}
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!"
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"
}
Moins complexe:
if (!(Get-Eventlog -LogName "Application" -Source "YourLog")){
New-Eventlog -LogName "Application" -Source "YourLog"
}
$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).