PSFrameworkはPowerShell Galleryに公開されているPowerShellモジュールとなっており、Frameworkと名付けられているだけあって、各種便利機能が提供されています。
Prominent features:
Advanced message & logging functionality
Manage scripts & modules using DSC
Simple Tab Completion
Runspace-safe development
PowerShell Scheduled tasks
今回はこのフレームワークに含まれているloggingの機能利用してみます。
PowerShellでスクリプトを作成する際に、ログ出力をするためのその場限りのloggerを作成したりしますが。
こういうフレームワークを使うのも、一つの方法かと思います。
PSFrameworkのメンテナーはFriedrich Weinmannさん。
各種サイト
- PSFramework
- PSFramework Documentation
- PowerShell Framework
- Logging in a DevOps world by Friedrich Weinmann
- FriedrichWeinmann/P2019-PSSummit-Logging-in-a-DevOps-World
- PSConfAsia 2018: Logging in a DevOps world
今回利用する環境
- Windows 21H2
- PSFramework 1.6.214
インストール
# ユーザスコープにインストールする場合
Install-Module PSFramework -Scope CurrentUser
# インストールチェック
Get-Module PSFramework -ListAvailable
ログを書き込んでみる
PSFrameworkではWrite-PSFMessageコマンドレットを利用してログを書込みます。
Write-PSFMessage -Message "HelloWorld"
Write-PSFMessage -Message "HelloWorld" -Level Verbose
Write-PSFMessage -Message "HelloWorld" -Level Host
Write-PSFMessage -Message "HelloWorld" -Level Warning
Write-PSFMessage -Message "HelloWorld" -Level Error
Write-PSFMessage -Message "HelloWorld" -Level Debug
書き込まれたログについて
Getting Started with Logging
Logging to: Debuglog
PSFrameworkではWrite-PSFMessageでログを書き込む事がわかりましたが。
ここでは書き込まれたログがどう扱われているか確認します。
PSFrameworkではログをメモリと`ファイルシステム(AppDataフォルダ配下のファイル)`に保持します。
メモリ上のログを確認する Get-PSFMessage
PSFrameworkではGet-PSFMessageコマンドを利用して、Write-PSFMessageコマンドレってで書込みしたメモリ上のログを取得します。
APPDATA配下のログファイルを確認する(Logging Provider:FileSystem)
ログファイルはPSFrameworkのConfig psframework.logging.filesystem.logpath で設定された場所に出力されており。
Get-PSFConfigValueコマンドレットで設定値を確認できます。
# ログファイルの保存先確認
Get-PSFConfigValue -FullName psframework.logging.filesystem.logpath
# ログファイルの保存先を開く
Get-PSFConfigValue -FullName psframework.logging.filesystem.logpath | ii
上記のようにファイルに実行日時とメッセージが保存されています。
Logging Provider(Logfile)
PSFrameworkでは書き込まれたログはデフォルトで設定されたフォルダにファイルとして保持されます。
特定の処理のログを設定したい場合は、Logging Providerを定義して利用します。
ここではLogfileとして出力するLogginf Providerを定義します。
$paramSetPSFLoggingProvider = @{
Name = 'logfile'
InstanceName = '<taskname>'
FilePath = 'C:\Logs\TaskName-%Date%.csv'
Enabled = $true
}
Set-PSFLoggingProvider @paramSetPSFLoggingProvider
上記の例では、$paramSetPSFLoggingProviderというhashテーブルをSet-PSFLoggingProviderにスプラフティングで渡して、Logging Provider(Logfile)を定義している。
Logging Provider(Logfile)を定義した後に、Write-PSFMessageでログに書込みを行うと、Logging Provider(Logfile)で定義されたFilePathであるC:\LogsディレクトリにTaskName-%Date%.csvという形式でファイルが保存されます。
ログローテーションについて
先程、c:\Logsにログファイルを出力しましたが。
出力されたログをログローテーションしたい場合はLogging ProviderにLogRotatePathを指定します。
$paramSetPSFLoggingProvider = @{
Name = 'logfile'
InstanceName = '<taskname>'
FilePath = 'C:\Logs\TaskName-%Date%.csv'
Enabled = $true
LogRotatePath = 'C:\Logs\TaskName-*.csv'
}
Set-PSFLoggingProvider @paramSetPSFLoggingProvider
このように指定する事で、Logging Providerが実行されるたびにLogRetentionTime(既定値30日)でログローテーションされるようです。
注意したいのは、ログローテーションが実行されるのは、定義したLogging Providerが実行されたタイミングとなるため。
LogRetentionTimeを7日と設定しても、Logging Providerが30日に一度しか動かない場合は、ログローテーションが実行されるのは30日に一度となります。
FilePathで利用できるプレースホルダについて
Logging ProviderのFilePathで`&Date'というプレースホルダを利用していますが、利用できるプレースホルダについては上記ドキュメントに記載があります。
| Placeholder | Value |
|---|---|
| %date% | The current date in a yyyy-MM-dd format |
| %dayofweek% | The current day of the week (Monday, Tuesday, …) |
| %day% | The current day of the month |
| %hour% | The current hour of the day |
| %minute% | The current minute of the hour |
| %username% | The name of the current user, picked from environment variables. |
| %userdomain% | The domain of the user, picked from environment variables. |
| %computername% | The name of the current computer, picked from environment variables. |
| %processid% | ID of the current process |
| %logname% | The value of the setting/parameter.logname |
総評
本記事ではPSFrameworkでとあえすログファイルとして出力する所まで説明してみました。
Logfileについてもcsv以外の出力形式で出力できたり。
LogfileなLogging Provider以外にもWindows EventlogだったりSplunkなどなどのLogging Providerが用意されており、様々な出力に対応していたり。
奥深いログ機能が提供されています。
モジュール作成者の公演動画があるので、こちらを見るのがわかり易い?





