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