簡単な説明
PowerShell は、エンジン、プロバイダー、コマンドレットからの内部操作をログに記録します。
長い説明
PowerShell では、エンジンの開始と停止、プロバイダーの起動と停止など、PowerShell 操作の詳細がログに記録されます。 また、PowerShell コマンドに関する詳細もログに記録されます。
Windows PowerShell 5.1 のログについては、about_Logging を参照してください。
PowerShell ログの場所は、ターゲット プラットフォームによって異なります。
- Linux では、PowerShell は systemd ジャーナルにログを記録し、そのジャーナルは syslog サーバーに転送できます。 詳細については、Linux ディストリビューションの
manページを参照してください。 - macOS では、Apple の統合ログ システムが使用されます。 詳細については、Apple の開発者向けドキュメントのログ記録を参照してください。
PowerShell では、次の 2 つのログ カテゴリの構成がサポートされています。
モジュール ログ - 指定されたモジュールのメンバーに関するパイプライン実行イベントを記録します。 モジュール ログは、セッションと特定のモジュールの両方に対して有効にする必要があります。 このログの構成の詳細については、about_PowerShell_Config を参照してください。
構成によりモジュール ログが有効になっている場合は、モジュールの LogPipelineExecutionDetails プロパティの値を設定することで、セッション内の特定のモジュールのログを有効または無効にできます。
たとえば、PSReadLine モジュールのモジュール ログを有効にするには、次のようにします。
$psrl = Get-Module PSReadLine $psrl.LogPipelineExecutionDetails = $true Get-Module PSReadLine | Select-Object Name, LogPipelineExecutionDetailsName LogPipelineExecutionDetails ---- --------------------------- PSReadLine Trueスクリプト ブロックのログ記録 - 対話形式で呼び出された場合でも、自動化を介して呼び出された場合でも、コマンド、スクリプトブロック、関数、スクリプトの処理を記録します。
スクリプト ブロック ログを有効にすると、PowerShell は処理するすべてのスクリプト ブロックの内容を記録します。 有効にすると、新しい PowerShell セッションはこの情報のログを記録します。
メモ
診断以外の目的でスクリプト ブロック ログを使用する場合は、保護されたイベント ログを有効にすることをお勧めします。 詳細については、about_PowerShell_Config をご覧ください。
Linux または macOS でのログ記録の構成
Linux および macOS でのログの構成は、powershell.config.json ファイルに格納されます。
powershell.config.json ファイルは、PowerShell の ディレクトリにある $PSHOME 形式のファイルです。 この構成ファイルが存在しない場合、既定の設定を変更するには、ファイルを作成する必要があります。 PowerShell の各インストールでは、このファイルの独自のコピーが使用されます。
PowerShell では既定で Informational チャネルへの Operational のログが有効になっています。 追加のログ出力 (詳細や、分析ログ出力の有効化など) が必要な場合は、構成を変更できます。
次のコードは構成の例です。
{
"ModuleLogging": {
"EnableModuleLogging": false,
"ModuleNames": [
"PSReadLine",
"PowerShellGet"
]
},
"ScriptBlockLogging": {
"EnableScriptBlockInvocationLogging": true,
"EnableScriptBlockLogging": true
},
"LogLevel": "verbose"
}
PowerShell ログを構成するためのプロパティの一覧を次に示します。 プロパティが構成に一覧表示されていない場合、PowerShell では既定値が使用されます。
-
LogIdentity
- 値:
<string name>、powershell - 説明: ログの記録時に使用する名前。 既定の ID は
powershellです。 この値を使用すると、リリースやベータ版など、PowerShell インストールの 2 つのインスタンス間の違いを確認できます。 この値は、ログ出力を別のファイルにリダイレクトする場合にも使用されます。
- 値:
-
LogChannels
- 値:
Operational、Analytic - 説明: 有効にするチャネル。 複数の値を指定する場合は、値をコンマで区切ります。 既定値は
Operationalです。
- 値:
-
LogLevel
- 値:
Always、Critical、Error、Warning、Informational、Verbose、Debug - 説明: 1 つの値を指定します。 値は、詳細度の高い順に示されています。 選択した値は、その値自体とそれ以前のすべての値を有効にします。 既定値は
Informationalです。
- 値:
-
LogKeywords
- 値:
Runspace、Pipeline、Protocol、Transport、Host、Cmdlets、Serializer、Session、ManagedPlugin - 説明: キーワードを使用すると、PowerShell 内の特定のコンポーネントにログを制限することができます。 既定では、すべてのキーワードが有効になっています。この値の変更は、特殊なトラブルシューティングにのみ役立ちます。
- 値:
-
PowerShellPolicies
- 説明: PowerShellPolicies 設定には、ModuleLogging、ProtectedEventLogging、および ScriptBlockLogging というオプションが含まれています。 詳細については、「一般的な構成設定」を参照してください。
Linux でジャーナル処理された PowerShell ログ データの表示
PowerShell は、Ubuntu や Red Hat Enterprise Linux (RHEL) などの Linux ディストリビューションで、journald デーモンを使用して、systemd ジャーナル にログを記録します。
journald デーモンは、ログ メッセージをバイナリ形式で格納します。 PowerShell エントリのジャーナル ログのクエリを実行するには、journalctl ユーティリティを使用します。
journalctl --grep powershell
journald デーモンは、ログ メッセージをシステム ログ プロトコル (syslog) サーバーに転送できます。 Linux システムで ForwardToSysLog ログを使用する場合は、/etc/systemd/journald.confjournald 構成ファイルで オプションを有効にします。 これは、多くの Linux ディストリビューションの既定の構成です。
Linux での Syslog での PowerShell ログ データの表示
Linux ディストリビューションのパッケージ マネージャーを使用して、Linux システムで syslog ログを使用する場合は、rsyslog などの syslog サーバーをインストールします。 一部の Linux ディストリビューション (Ubuntu プレインストール rsyslog など)。
syslog プロトコルは、標準化されたテキスト形式でログ メッセージを格納します。 任意のテキスト処理ユーティリティを使用して、syslog コンテンツのクエリを実行したり表示したりできます。
既定では、syslog はログ エントリを次の場所に書き込みます。
- Ubuntu を含む Debian ベースのディストリビューションの場合:
/var/log/syslog - RHEL ベースのディストリビューションの場合:
/var/log/messages
次の例では、cat コマンドを使用して、Ubuntu で PowerShell syslog エントリのクエリを実行します。
cat /var/log/syslog | grep -i powershell
Syslog メッセージ形式
Syslog メッセージの形式は次のとおりです。
TIMESTAMP MACHINENAME powershell[PID]: (COMMITID:TID:CID)
[EVENTID:TASK.OPCODE.LEVEL] MESSAGE
- TIMESTAMP - ログ エントリが生成された日時。
- MACHINENAME - ログが生成されたシステムの名前。
- PID - ログ エントリを書き込んだプロセスのプロセス ID。
- COMMITID - ビルドの生成に使用された git commit ID またはタグ。
- TID - ログ エントリを書き込んだスレッドのスレッド ID。
-
CID - ログ エントリの 16 進チャネル識別子。
- 0x10 = 稼働中
- 0x11 = 分析
- EVENTID - ログ エントリのイベント識別子。
- TASK - イベント エントリのタスク識別子
- OPCODE - イベント エントリのオペコード
- LEVEL - イベント エントリのログ レベル
- MESSAGE - イベント エントリに関連付けられているメッセージ
EVENTID、TASK、OPCODE、および LEVEL は、Windows イベント ログにログを記録するときに使用される値と同じです。
PowerShell ログ メッセージを別のファイルに書き込む
PowerShell ログ エントリを別のファイルにリダイレクトすることもできます。 PowerShell ログ エントリが別のファイルにリダイレクトされると、既定の syslog ファイルにログが記録されなくなります。
次の手順では、powershell.log という名前のログ ファイルに書き込むよう、Ubuntu で PowerShell ログ エントリを構成します。
confなどのテキスト ファイル エディターを使用して、/etc/rsyslog.dディレクトリに PowerShell ログ構成の構成 (nano) ファイルを作成します。 ファイル名の前に、既定値より小さい数値を付けます。 たとえば、既定値が40-powershell.confである場所を50-default.confとします。sudo nano /etc/rsyslog.d/40-powershell.conf40-powershell.confファイルに次の情報を追加します。:syslogtag, contains, "powershell[" /var/log/powershell.log & stop/etc/rsyslog.confに新しいファイルの include ステートメントがあることを確認します。 次のような一般的なステートメントが含まれていることが考えられます。$IncludeConfig /etc/rsyslog.d/*.confそうでない場合は、include ステートメントを手動で追加する必要があります。
属性とアクセス許可が適切に設定されていることを確認します。
ls -l /etc/rsyslog.d/40-powershell.conf-rw-r--r-- 1 root root 67 Nov 28 12:51 40-powershell.conf40-powershell.confファイルの所有権またはアクセス許可が異なる場合は、次の手順を実行します。所有権を root に設定します。
sudo chown root:root /etc/rsyslog.d/40-powershell.confアクセス許可の設定: root には読み取り/書き込み、users には読み取りを設定します。
sudo chmod 644 /etc/rsyslog.d/40-powershell.conf
rsyslog サービスを再起動します。
sudo systemctl restart rsyslog.servicepwshを実行して、ログに記録する PowerShell 情報を生成します。pwshメモ
/var/log/powershell.logファイルは、rsyslog サービスが再起動され、PowerShell によってログに記録される情報が生成されるまで作成されません。powershell.logファイルのクエリを実行して、PowerShell 情報のログが新しいファイルに記録されていることを確認します。cat /var/log/powershell.log
macOS での PowerShell ログ データの表示
PowerShell は、Apple の統合ログ システムにログを記録します。統合ログ システムは、システム ログとアプリケーション ログを 1 か所に収集および保存できる、macOS の機能です。
Apple の統合ログ システムでは、ログ メッセージがバイナリ形式で格納されます。 PowerShell ログ イベントについて統合ログ システムのクエリを実行するには、log ツールを使用する必要があります。 PowerShell ログ イベントは、macOS のコンソール アプリケーションには表示されません。 コンソール アプリは、統合ログ システム以前の古い syslog ベースのログ用に設計されています。
macOS でコマンド ラインから PowerShell ログ データを表示する
macOS でコマンド ラインから PowerShell ログ データを表示するには、logまたはその他のシェル ホスト アプリケーションで コマンドを使用します。 これらのコマンドは、PowerShell、Z Shell、または Bash から実行できます。
次の例では、log コマンドを使用して、リアルタイムで発生しているログ データをシステムに表示します。
process パラメーターは、pwsh プロセスについてのみログ データをフィルター処理します。 複数の pwsh インスタンスが実行されている場合、process パラメーターも、その値としてプロセス ID を受け取ります。
level パラメーターは、指定したレベル以下のメッセージを示します。
log stream --predicate "subsystem == 'com.microsoft.powershell'" --level info
log show コマンドを使用して、ログ項目をエクスポートできます。
log show コマンドには、最後の N 個の項目、指定された時間以降の項目、または指定された期間内の項目をエクスポートするためのオプションがあります。
たとえば、次のコマンドは、9am on April 5, 2022 以降の項目をエクスポートします。
log show --start "2022-04-05 09:00:00" --predicate "subsystem == 'com.microsoft.powershell'"
詳細については、log show --help を実行して log show コマンドのヘルプを参照してください。
イベント データを PowerShell オブジェクトに変換できるように、ログ データを JSON 形式で出力することもできます。 次の例では、JSON 形式でイベントを出力します。
ConvertFrom-Json コマンドレットを使用して、JSON データを PowerShell オブジェクトに変換し、$logRecord 変数に格納します。
log show --predicate "subsystem == 'com.microsoft.powershell'" --style json |
ConvertFrom-Json | Set-Variable logRecord
また、セキュリティ情報イベント管理 (SIEM) アグリゲーターなど、より安全な場所にログを保存することも検討してください。 Microsoft Defender for Cloud Apps を使用すると、Azure で SIEM を設定できます。 詳細については、「汎用 SIEM の統合」を参照してください。
macOS での PowerShell ログ データのモードとレベル
既定では、PowerShell サブシステムは情報レベルのメッセージのログをメモリ (モード) に記録し、既定レベルのメッセージのログを macOS 上のディスク (永続化) に記録します。
log config コマンドを使用して別のモードとレベルのログ記録を有効にするために、この動作を変更できます。
次の例では、PowerShell サブシステムの情報レベルのログと永続化を有効にします。
sudo log config --subsystem com.microsoft.powershell --mode level:info,persist:info
reset パラメーターを使用して、ログ設定を PowerShell サブシステムの既定値に戻します。
sudo log config --subsystem com.microsoft.powershell --reset
こちらも参照ください
- Linux syslog と rsyslog.conf 情報については、Linux コンピューターのローカル
manページを参照してください。 - macOS ログ情報については、ログに関する Apple の開発者向けドキュメントを参照してください
- Windows の場合は、「about_Logging_Windows」を参照してください
- 汎用 SIEM 統合
PowerShell