Настройка ведения журнала Powershell, которая поддерживает файлы, вывод на консоль и журналы событий - PullRequest
0 голосов
/ 19 февраля 2020

Есть ли способ выполнить регистрацию в скрипте Powershell, чтобы

  • можно было сделать один вызов для регистрации сообщения
  • , затем это сообщение перенаправляется на ноль / любой / несколько (в зависимости от конфигурации) следующих
    • стандартный вывод консоли
    • файл журнала
    • windows журналы событий

Вроде как python каркас ведения журнала или log4j в Java, где цели ведения журнала настраиваются отдельно от фактической регистрации сообщений.

1 Ответ

0 голосов
/ 19 февраля 2020

Вы можете использовать модуль логгера или скрипт.

<#
.Synopsis
   Write-Log writes a message to a specified log file with the current time stamp.
.DESCRIPTION
   The Write-Log function is designed to add logging capability to other scripts.
   In addition to writing output and/or verbose you can write to a log file for
   later debugging.  
   Changelog:
    * Code simplification and clarification
    * Added documentation.
    * Renamed LogPath parameter to Path to keep it standard.
    * Revised the Force switch to work as it should.

   To Do:
    * Add error handling if trying to create a log file in a inaccessible location.
    * Add ability to write $Message to $Verbose or $Error pipelines to eliminate
      duplicates.
.PARAMETER Message
   Message is the content that you wish to add to the log file.  
.PARAMETER Path
   The path to the log file to which you would like to write. By default the function will  
   create the path and file if it does not exist.  
.PARAMETER Level
   Specify the criticality of the log information being written to the log (i.e. Error, Warning, Informational)
.PARAMETER NoClobber
   Use NoClobber if you do not wish to overwrite an existing file.
.EXAMPLE
   Write-Log -Message 'Log message'  
   Writes the message to c:\Logs\PowerShellLog.log.
.EXAMPLE
   Write-Log -Message 'Restarting Server.' -Path c:\Logs\Scriptoutput.log
   Writes the content to the specified log file and creates the path and file specified.  
.EXAMPLE
   Write-Log -Message 'Folder does not exist.' -Path c:\Logs\Script.log -Level Error
   Writes the message to the specified log file as an error message, and writes the message to the error pipeline.  
#>
function Write-Log
{
    [CmdletBinding()]
    Param
    (
        [Parameter(Mandatory=$true,
                   ValueFromPipelineByPropertyName=$true)]
        [ValidateNotNullOrEmpty()]
        [Alias("LogContent")]
        [string]$Message,

        [Parameter(Mandatory=$false)]
        [Alias('LogPath')]
        [string]$Path='C:\Logs\PowerShellLog.log',

        [Parameter(Mandatory=$false)]
        [ValidateSet("Error","Warn","Info")]
        [string]$Level="Info",

        [Parameter(Mandatory=$false)]
        [switch]$NoClobber
    )

    Begin
    {
        # Set VerbosePreference to Continue so that verbose messages are displayed.
        $VerbosePreference = 'Continue'
    }
    Process
    {

        # If the file already exists and NoClobber was specified, do not write to the log.
        if ((Test-Path $Path) -AND $NoClobber) {
            Write-Error "Log file $Path already exists, and you specified NoClobber. Either delete the file or specify a different name."
            Return
            }

        # If attempting to write to a log file in a folder/path that doesn't exist create the file including the path.
        elseif (!(Test-Path $Path)) {
            Write-Verbose "Creating $Path."
            $NewLogFile = New-Item $Path -Force -ItemType File
            }

        else {
            # Nothing to see here yet.
            }

        # Format Date for our Log File
        $FormattedDate = Get-Date -Format "yyyy-MM-dd HH:mm:ss"

        # Write message to error, warning, or verbose pipeline and specify $LevelText
        switch ($Level) {
            'Error' {
                Write-Error $Message
                $LevelText = 'ERROR:'
                }
            'Warn' {
                Write-Warning $Message
                $LevelText = 'WARNING:'
                }
            'Info' {
                Write-Verbose $Message
                $LevelText = 'INFO:'
                }
            }

        # Write log entry to $Path
        "$FormattedDate $LevelText $Message" | Out-File -FilePath $Path -Append
    }
    End
    {
    }
}

Затем просто вызовите его, где вы хотите в скрипте:

Write-Log -Message "################ Script Started #############################" -Level Info

, и если вы хотите перенаправить ошибку, то вызовите ее в блоке catch:

try{ }
catch
{
    {Write-Log -Message $_.Exception.Message -Level Error}
}

Примечание: Убедитесь, что в этом случае вы скомпилируете функцию в начале, иначе PS не сможет использовать ее внутри блоков, потому что область действия будет отличаться.

Это даст вам вывод на консоль и в файл, и вы сможете написать сценарий даже для ведения журнала событий. Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...