about_Logging_Non-Windows
簡単な説明
PowerShell は、エンジン、プロバイダー、コマンドレットからの内部操作をログに記録します。
詳細な説明
PowerShell では、エンジンの開始と停止、プロバイダーの起動と停止など、PowerShell 操作の詳細がログに記録されます。 また、PowerShell コマンドに関する詳細もログに記録されます。
Windows PowerShell 5.1 でのログ記録の詳細については、 about_Loggingを参照してください。
PowerShell ログの場所は、ターゲット プラットフォームによって異なります。
- Linux では、PowerShell は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, LogPipelineExecutionDetails
Name LogPipelineExecutionDetails ---- --------------------------- PSReadLine True
スクリプト ブロックのログ記録 - 対話形式で呼び出された場合でも、自動化を介して呼び出された場合でも、コマンド、スクリプト ブロック、関数、スクリプトの処理を記録します。
スクリプト ブロック ログを有効にすると、PowerShell は処理するすべてのスクリプト ブロックの内容を記録します。 有効にすると、新しい PowerShell セッションによってこの情報がログに記録されます。
Note
診断以外の目的でスクリプト ブロック ログを使用する場合は、保護されたイベント ログを有効にすることをお勧めします。 詳細については、「 about_PowerShell_Config」を参照してください。
Linux または macOS でのログ記録の構成
Linux および macOS でのログ記録の構成は、 powershell.config.json
ファイルに格納されます。 powershell.config.json
ファイルは、PowerShell $PSHOME
ディレクトリに存在する JSON 形式のファイルです。 この構成ファイルが存在しない場合は、既定の設定を変更するために作成する必要があります。 PowerShell の各インストールでは、このファイルの独自のコピーが使用されます。
既定では、PowerShell では、Operational
チャネルへのInformational
ログ記録が有効になります。 詳細ログ出力や分析ログ出力の有効化など、追加のログ出力が必要な場合は、構成を変更できます。
次のコードは、構成の例です。
{
"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 オプションが含まれています。 詳細については、「 Common 構成設定」を参照してください。
Linux でジャーナル処理された PowerShell ログ データの表示
PowerShell は、Ubuntu や Red Hat Enterprise Linux (RHEL) などの Linux ディストリビューション上の journald デーモンを使用してシステム ジャーナルにログを記録します。
journald デーモンは、ログ メッセージをバイナリ形式で格納します。 journalctl
ユーティリティを使用して、PowerShell エントリのジャーナル ログを照会します。
journalctl --grep powershell
journald デーモンは、システム ログ プロトコル (syslog) サーバーにログ メッセージを転送できます。 Linux システムでログ記録を使用する場合は、/etc/systemd/journald.conf
journald 構成ファイルでForwardToSysLog
オプションsyslog有効にします。 これは、多くの Linux ディストリビューションの既定の構成です。
Linux での Syslog での PowerShell ログ データの表示
Linux ディストリビューションのパッケージ マネージャーを使用して、linux システムで syslog ログを使用する場合は rsyslog などのsyslog サーバーをインストールします。 Ubuntu プレインストール rsyslog など、一部の Linux ディストリビューション。
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 コミット 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 ログ エントリを構成します。
nano
などのテキスト ファイル エディターを使用して、/etc/rsyslog.d
ディレクトリに PowerShell ログ構成の構成 (conf
) ファイルを作成します。 ファイル名の前に、既定値より小さい数値を付けます。 たとえば、既定値が50-default.conf
されている場所を40-powershell.conf
します。sudo nano /etc/rsyslog.d/40-powershell.conf
40-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.conf
40-powershell.conf
ファイルの所有権またはアクセス許可が異なる場合は、次の手順を実行します。所有権を root に設定します。
sudo chown root:root /etc/rsyslog.d/40-powershell.conf
アクセス許可の設定: root には読み取り/書き込み、 ユーザー 読み取りがあります。
sudo chmod 644 /etc/rsyslog.d/40-powershell.conf
rsyslog サービスを再起動します。
sudo systemctl restart rsyslog.service
pwsh
を実行して、ログに記録する PowerShell 情報を生成します。pwsh
Note
/var/log/powershell.log
ファイルは、rsyslog サービスが再起動され、PowerShell によってログに記録される情報が生成されるまで作成されません。powershell.log
ファイルにクエリを実行して、PowerShell 情報が新しいファイルに記録されていることを確認します。cat /var/log/powershell.log
macOS での PowerShell ログ データの表示
PowerShell は、Apple の統合ログ システムにログを記録します。これは macOS の機能であり、システムログとアプリケーション ログを 1 か所で収集および保存できます。
Apple の統合ログ システムでは、ログ メッセージがバイナリ形式で格納されます。 log
ツールを使用して、PowerShell ログ イベントの統合ログ システムに対してクエリを実行する必要があります。 PowerShell ログ イベントは、macOS の Console アプリケーションには表示されません。 コンソール アプリは、統合ログ システムより前の古い syslog ベース ログ記録用に設計されています。
macOS でのコマンド ラインからの PowerShell ログ データの表示
macOS 上のコマンド ラインから PowerShell ログ データを表示するには、Terminal またはその他のシェル ホスト アプリケーションで 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
コマンドのヘルプを表示します。
ログ データを JSON 形式で出力することもできます。これにより、イベント データを PowerShell オブジェクトに変換できます。 次の例では、JSON 形式でイベントを出力します。 ConvertFrom-Json
コマンドレットは、JSON データを PowerShell オブジェクトに変換するために使用され、$logRecord
変数に格納されます。
log show --predicate "subsystem == 'com.microsoft.powershell'" --style json |
ConvertFrom-Json | Set-Variable logRecord
また、 Security Information and Event Management (SIEM) アグリゲーターなど、より安全な場所にログを保存することを検討することもできます。 Microsoft Defender for Cloud Apps を使用して、Azure で SIEM を設定できます。 詳細については、 Generic 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