PMPの流儀

我が家の流儀

我が家で気になったことを夫婦で取り上げていきます

MENU

PowerShell ログ出力クラス (前の行からの経過時間つき)

PowerShellで便利なログ出力クラスを紹介します。関数でも良かったのですが、ファイル名称を保持するためにクラス化してすっきりさせました。時間情報と合わせて前の行からの経過時間付きです。

クラスについて

PowerShellのクラスは public しかなかったり、プロパティがなかったりと、C#に比べてだいぶ機能的に縮小しています。
カプセル化を意識した設計で分かりやすさを優先にしていると感じます。
デストラクタが無いのが痛いです。

ロギングフォーマット

"時間情報 前の行からの経過時間 ログメッセージ" の形態としました。
例) 21/03/01 10:10:15.145 145 メッセージ 時間はmsまで記載します。 経過時間はボトルネックの個所を調べるときに便利だったので付けました。

コード

では早速コードです。

class Logging
{
    $old = $null;
    [string] $filename;

    Logging([string]$filename)
    {
        $this.filename = $filename;
    }

    [string] log([string] $mes)
    {
        [DateTime] $now = Get-Date
        [TimeSpan] $diff = 0;

        if($this.old -ne $null) {
            $diff = New-TimeSpan $this.old $now
        }
        if($diff.TotalMilliseconds -eq $null) {
            $ss = "000";
        } else {
            $ss = "{0:000}" -f [int]$diff.TotalMilliseconds
        }

        $s = $now.ToString("yy/MM/dd HH:mm:ss.fff") + " " + $ss + " " + $mes
        Write-Output $s | Out-File -FilePath $this.fileName -Encoding Default -append

        $this.old = $now
        Return $s
    }
}

[Logging] $l = New-Object Logging('c:\temp\test.log');
$l.log('test1');
$l.log('test2');

実行結果

21/03/25 00:45:40.242 000 test1
21/03/25 00:45:40.259 017 test2