[PowerShell] ログ出力専用クラスを利用し、ログ出力を容易にする


はじめに

ログの出力はどのプログラムで必要な処理の一つです。
今回はPowerShellでログを出力する際に毎回 Out-File などを利用して出力していたのを
ログ出力クラスを作り、標準出力とファイル出力を同時にし、エラーなどで色分けして出力できるようにしました。

ログ出力クラス

Logger.ps1

class Logger {
    [string]$LogFile

    # Constructor
    Logger($logPath, $logFile) {
        if((Test-Path $logPath) -ne $true) {
            New-Item -ItemType Directory $logPath | Out-Null
        }
        $this.LogFile = $logPath + "¥¥" + $logFile
    }

    # Logging
    [void] Log($level, $message){
        $dt = (Get-Date -Format "yyyy/MM/dd HH:mm:ss")
        [string]::Format("{0} [{1}] {2}", $dt, $level, $message) | Out-File $this.LogFile -Append -Force
    }

    # Logging anc console output with normal message
    [void] LogAndConsole($message) {
        Write-Host $message
        $this.Log("INFO", $message);
    }

    # Logging and console output with success message
    [void] LogAndConsoleSuccess($message) {
        Write-Host $message -foregroundcolor "Green"
        $this.Log("INFO", $message)
    }

    # Logging and console output with error message
    [void] LogAndConsoleError($message) {
        Write-Host $message -forgroundcolor "Red"
        $this.Log("ERROR", $message)
    }

    # Logging stack trace
    [void] LogStackTrace($e) {
        $msg = $e.Exception.Message
        $this.Log("ERROR", "[Exception] $msg")
        $traces = $e.ScriptStackTrace -Split "¥r¥n"
        foreach ($trace in $traces) {
            $this.Log("ERROR", "[Stack] $trace")
        }
    }
}

利用方法

上記で作成したクラスの読み込みから利用については下記の通りです。

sample.ps1

$LogPath = "$env:ProgramData¥Logs"
$LogFileName = "sample.log"

# Read class
$logger = [Logger]::new($LogPath, $LogFileName)

$logger.LogAndConsole("Sample output log.")

出力結果

Sample output log.

無事に、標準出力およびログファイルに出力されました。
是非使ってみてください。