bestsource

이벤트 로그가 이미 있는지 확인하는 방법

bestsource 2023. 7. 28. 22:28
반응형

이벤트 로그가 이미 있는지 확인하는 방법

다음 줄을 사용하여 새 이벤트 로그를 만드는 중입니다.

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

새 컴퓨터에서 빌드를 실행하는 경우에도 이벤트 로그를 보고 싶기 때문에 매번 이 작업을 실행하려고 합니다.

문제는 로그가 이미 생성된 후 스크립트가 실행될 때마다 오류가 발생한다는 것입니다.

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

이제 이벤트 로그를 "검색"할 수 있음을 알게 되었습니다.

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

하지만 이제 그것이 존재하는지 어떻게 결정합니까?

# 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");

그래서 저는 옳은 길을 가고 있었습니다.Get-EventLog.

그냥 읽는 대신 변수에 저장했습니다.그런 다음 변수가null.

이것은 제가 하고 싶었던 일을 성취했습니다.

$logFileExists = Get-EventLog -list | Where-Object {$_.logdisplayname -eq "Visual Studio Builds"} 
if (! $logFileExists) {
    New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
}
if ([System.Diagnostics.EventLog]::SourceExists("Visual Studio") -eq $False) {
    New-EventLog -LogName "Visual Studio Builds" -Source "Visual Studio"
}

확인:Exists방법:

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

존재 여부를 간단히 확인하는 방법

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

그러나 새 항목을 만들려면 "관리자 권한"이 필요합니다.이 문제를 해결하기 위해 하위 프로세스를 호출했습니다.

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

단순 CreateLog.ps1을 사용하여:

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

저는 아래의 접근법이 필터의 작업 부하를 줄일 수 있다고 생각합니다.where

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

덜 복잡함:

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

이건 저한테 효과가 있었어요.누군가에게 도움이 되길 바랍니다.

$EventLog = "SLAPS"
If ([System.Diagnostics.EventLog]::SourceExists("$EventLog") -eq $false) {
    New-EventLog -LogName "SLAPS_PasswordRotation" -Source "$EventLog"
    Write-EventLog -LogName "SLAPS_PasswordRotation" -Source "$EventLog" -Message "EventLog Succesfully Created" -EventId 10000 -EntryType SuccessAudit
}
Else {
    Write-EventLog -LogName "SLAPS_PasswordRotation" -Source "$EventLog" -Message "New Rotation Started Succesfully" -EventId 1 -EntryType SuccessAudit
}

Get-/Test-Event 로그 소스

System.Diagnostics방법이 제한적입니다.컴퓨터에는 소스가 하나만 있을 수 있습니다.서로 다른 시스템은 동일한 원본을 가질 수 있지만 로그는 다를 수 있습니다.제 경험으로는 이러한 방법으로 작업하고 로그 및 소스를 생성/제거한 후 문제가 발생하기 시작했습니다.사용자 정의 로그/소스를 확인하기 위해 다음과 같이 작성했습니다.

Set-StrictMode -Version Latest

function Get-EventLogSource {
    [CmdletBinding()]
    param(
        [string]$LogFile = '*',
        [string]$Source = '*'
    )

    Get-CimInstance -Class Win32_NTEventLOgFile -Verbose:$false | ForEach-Object {

        $_logName = $PSItem.FileName
 
        $PSItem.Sources | ForEach-Object {
 
            $oResult = New-Object PSCustomObject -Property @{
                Source  = $PSItem
                LogName = $_logName
            } | Select-Object  -Property Source, LogName

            Write-Output $oResult
        }
    } | Sort-Object -Property Source | Where-Object { $PSItem.Source -like $Source -and $PSItem.LogName -like $LogFile }    
}

function Test-EventLogSource {
    [CmdletBinding()]
    param(
        [string]$LogFile = '*',
        [Parameter(Mandatory)]
        [string]$Source
    )
    $_result = Get-EventLogSource -LogFile $LogFile -Source $Source
    return ($null -ne $_result)
}

Clear-Host

#Test-EventLogSource -LogFile 'System' -Source '.NET*' -Verbose
#Test-EventLogSource -LogFile 'Application' -Source '.NET*' -Verbose
#Test-EventLogSource -LogFile 'dummy' -Source '.NET*' -Verbose
#Test-EventLogSource -LogFile '*' -Source '.NET*' -Verbose
#Test-EventLogSource -Source '.NET*' -Verbose

#Test-EventLogSource -LogFile 'Application' -Source 'vs' -Verbose
#Test-EventLogSource -LogFile '*' -Source 'vss' -Verbose

#Test-EventLogSource -Source '*power*'


#Get-EventLogSource
#Get-EventLogSource -LogFile 'System' -Source '.NET*' -Verbose | Format-Table
#Get-EventLogSource -LogFile 'Application' -Source '.NET*' -Verbose | Format-Table
#Get-EventLogSource -LogFile 'dummy' -Source '.NET*' -Verbose | Format-Table
#Get-EventLogSource -LogFile '*' -Source '.NET*' -Verbose | Format-Table
#Get-EventLogSource -Source '.NET*' -Verbose | Format-Table

#Get-EventLogSource -LogFile 'Application' -Source 'vs' -Verbose | Format-Table
#Get-EventLogSource -LogFile '*' -Source 'vss' -Verbose | Format-Table

#Get-EventLogSource -Source '*power*'| Format-Table

Get-Win 이벤트 사용

Get-WinEvent -ListProvider * -ErrorAction SilentlyContinue |
    Select-Object -Property Name -ExpandProperty LogLinks | 
    Select-Object -Property Name, LogName |
    Sort-Object -Property Name
$SourceExists = [System.Diagnostics.Eventlog]::SourceExists("XYZ")
if($SourceExists -eq $false){
    [System.Diagnostics.EventLog]::CreateEventSource("XYZ", "Application")
}

이렇게 하는 것만으로는 충분하지 않습니다.이벤트 소스를 만들었지만,$SourceExists항상 그럴 것입니다.false나는 또한 그것을 실행함으로써 테스트했습니다.CreateEventSource그리고나서Remove-EventLog제거하지 못했습니다.이벤트 소스를 생성한 후에는 이벤트 소스에 무언가를 기록해야 합니다.실행 후 추가CreateEventSource.

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

(댓글에) 이것을 지적해 준 https://stackoverflow.com/users/361842/johnlbevan 덕분입니다.

언급URL : https://stackoverflow.com/questions/13851577/how-to-determine-if-an-eventlog-already-exists

반응형