about_Logging_Non-Windows
簡短描述
PowerShell 會記錄引擎、提供者和 Cmdlet 的內部作業。
詳細描述
PowerShell 會記錄 PowerShell 作業的詳細數據,例如啟動和停止引擎和啟動和停止提供者。 它也會記錄PowerShell命令的詳細數據。
如需有關在 Windows PowerShell 5.1 中記錄的資訊,請參閱 about_Logging。
PowerShell 記錄的位置取決於目標平臺。
- 在 Linux 上,PowerShell 會記錄至可以轉送至 syslog 伺服器的 systemd 日誌。 如需詳細資訊,請參閱
man
Linux 發行版的頁面。 - 在macOS上,會使用Apple的統一記錄系統。 如需詳細資訊,請參閱 Apple關於記錄的開發人員檔。
PowerShell 支援設定兩種記錄類別:
模組記錄 - 記錄指定模組成員的管線執行事件。 會話和特定模組都必須啟用模組記錄。 如需設定此記錄的詳細資訊,請參閱 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工作會記錄這項資訊。
注意
建議在針對診斷用途以外的任何專案使用腳本區塊記錄時,啟用受保護的事件記錄。 如需詳細資訊,請參閱 about_PowerShell_Config。
在 Linux 或 macOS 上設定記錄
Linux 和 macOS 上記錄的組態會儲存在 檔案中 powershell.config.json
。 檔案powershell.config.json
是位於PowerShell $PSHOME
目錄中的JSON格式檔案。 如果此組態檔不存在,您必須建立它來變更預設設定。 PowerShell 的每個安裝都會使用此檔案的專屬複本。
根據預設,PowerShell 會啟用 Informational
對通道的 Operational
記錄。 如果您需要其他記錄輸出,例如詳細資訊或啟用分析記錄輸出,您可以變更設定。
下列程式代碼是範例組態:
{
"ModuleLogging": {
"EnableModuleLogging": false,
"ModuleNames": [
"PSReadLine",
"PowerShellGet"
]
},
"ScriptBlockLogging": {
"EnableScriptBlockInvocationLogging": true,
"EnableScriptBlockLogging": true
},
"LogLevel": "verbose"
}
以下是設定 PowerShell 記錄的屬性清單。 如果屬性未列在組態中,PowerShell 會使用預設值。
- LogIdentity
- 值:
<string name>
、powershell
- 描述:記錄時要使用的名稱。 預設身分識別為
powershell
。 這個值可用來判斷 PowerShell 安裝兩個實例之間的差異,例如版本和 Beta 版本。 這個值也可用來將記錄輸出重新導向至個別的檔案。
- 值:
- LogChannels
- 值:
Operational
、Analytic
- 描述:要啟用的通道。 指定多個值時,請以逗號分隔值。 預設值是
Operational
。
- 值:
- LogLevel
- 值:
Always
、、、Critical
、Warning
Error
、Informational
、Verbose
、Debug
- 描述:指定單一值。 這些值會以遞增的順序列出。 您選擇的值會自行啟用,以及它之前的所有值。 預設值是
Informational
。
- 值:
- LogKeywords
- 值:
Runspace
、、Pipeline
、、Host
Transport
Protocol
、Cmdlets
、Serializer
Session
ManagedPlugin
- 描述:關鍵詞可讓您將記錄限制在PowerShell內的特定元件。 根據預設,所有關鍵詞都會啟用,而且變更此值只適用於特製化疑難解答。
- 值:
- PowerShellPolicies
- 描述:PowerShellPolicies 設定包含 ModuleLogging、ProtectedEventLogging 和 ScriptBlockLogging 選項。 如需詳細資訊,請參閱 一般組態設定。
在 Linux 上檢視紀錄中的 PowerShell 記錄數據
PowerShell 會使用 Linux 散發套件上的日誌精靈,例如 Ubuntu 和 Red Hat Enterprise Linux (RHEL) 等日誌精靈,記錄至 systemd 日誌。
日誌精靈會以二進位格式儲存記錄訊息。 journalctl
使用 公用程式來查詢 PowerShell 專案的記錄。
journalctl --grep powershell
日誌精靈可以將記錄訊息轉送至系統記錄通訊協定 (syslog) 伺服器。 ForwardToSysLog
如果您想要在 Linux 系統上使用 syslog 記錄,請在日誌組態檔中啟用 選項/etc/systemd/journald.conf
。 這是許多 Linux 發行版的預設組態。
在 Linux 上的 syslog 中檢視 PowerShell 記錄數據
如果您想要在Linux系統上使用 syslog 記錄,請使用Linux發行版的套件管理員來安裝 syslog 伺服器,例如 rsyslog 。 某些 Linux 發行版,例如 Ubuntu 預安裝 rsyslog。
syslog 通訊協定會以標準化文字格式儲存記錄訊息。 您可以使用任何文字處理公用程式來查詢或檢視 syslog 內容。
根據預設, syslog 會將記錄專案寫入下列位置:
- 在 Debian 型散發套件上,包括 Ubuntu:
/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 - 寫入記錄專案之進程的進程識別碼。
- COMMITID - 用來產生組建的 Git 認可 識別碼或標記。
- TID - 寫入記錄專案之線程的線程識別碼。
- CID - 記錄專案的十六進位通道識別碼。
- 0x10 = 操作
- 0x11 = Analytic
- EVENTID - 記錄專案的事件識別碼。
- TASK - 事件專案的工作識別碼
- OPCODE - 事件專案的 opcode
- LEVEL - 事件項目的記錄層級
- MESSAGE - 與事件專案相關聯的訊息
EVENTID、 TASK、 OPCODE 和 LEVEL 與登入 Windows 事件記錄檔時所使用的值相同。
將 PowerShell 記錄訊息寫入個別的檔案
您也可以將 PowerShell 記錄專案重新導向至個別的檔案。 當 PowerShell 記錄專案重新導向至個別的檔案時,它們就不會再記錄到預設的 syslog 檔案。
下列步驟會將Ubuntu上的PowerShell記錄專案設定為寫入名為的 powershell.log
記錄檔。
使用文字文件編輯器,在目錄中建立 PowerShell 記錄組態
/etc/rsyslog.d
的組態檔 (conf
) 檔案,例如nano
。 在檔名前面加上小於預設值的數位。 例如,40-powershell.conf
預設值為50-default.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
注意
/var/log/powershell.log
在重新啟動 rsyslog 服務之前,不會建立檔案,且 PowerShell 會產生要記錄的資訊。powershell.log
查詢檔案,以確認 PowerShell 資訊正在記錄到新檔案。cat /var/log/powershell.log
在macOS上檢視PowerShell記錄數據
PowerShell 會記錄至 Apple 的統一記錄系統,這是 macOS 的功能,可讓您在單一集中式位置收集及儲存系統和應用程式記錄。
Apple 的統一記錄系統會以二進位格式儲存記錄訊息。 您必須使用 此工具 log
來查詢 PowerShell 記錄事件的整合記錄系統。 PowerShell 記錄事件不會出現在 macOS上的控制台 應用程式中。 控制台應用程式是針對舊 版的 syslog 型 記錄所設計,其前置於統一記錄系統。
從 macOS 上的命令行檢視 PowerShell 記錄數據
若要從 macOS 上的命令行檢視 PowerShell 記錄數據,請使用log
終端機或其他殼層主機應用程式中的 命令。 這些命令可以從 PowerShell、Z Shell 或 Bash 執行。
在下列範例中, log
命令會用來顯示系統上的記錄數據,因為其會實時發生。 進程參數只會pwsh
篩選進程的記錄數據。 如果您有一個以上的實例執行 pwsh
, 進程參數也會接受進程 標識碼作為其值。 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 格式的事件。 Cmdlet ConvertFrom-Json
用來將 JSON 資料轉換成 PowerShell 物件,會儲存在變數中 $logRecord
。
log show --predicate "subsystem == 'com.microsoft.powershell'" --style json |
ConvertFrom-Json | Set-Variable logRecord
您也可以考慮將記錄儲存到更安全的位置,例如 安全性資訊和事件管理 (SIEM) 匯總工具。 使用 適用於雲端的 Microsoft Defender 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 整合