Dot-Net

在 PowerShell 中進行 .NET 跟踪,無需創建 .config 文件

  • May 31, 2020

我知道我可以通過將元素添加到PowerShell 安裝文件夾中的 App config ( ) 來啟用.NET 跟踪。在 PowerShell 中的 System.Net 跟踪中有所介紹。<system.diagnostics>powershell.exe.config

事實上,我也想記錄System.Net跟踪源(例如FtpWebRequest

但是有沒有辦法在本地啟用跟踪?就像程式碼本身一樣?或者可能使用一些命令行開關?或者我至少可以將 App 配置文件放在本地文件夾中,而不必修改系統範圍的設置?

只需在程式碼中(因此在 Powershell 中)啟用預設跟踪源(Trace.Information等)相對容易。

System.Net跟踪源執行此操作更為複雜,因為它們不可公開訪問。

我以前在 C# 中看到過,呼叫System.Net例如方法Dns.Resolve是必要的,以便TraceSource創建要創建的方法,但在 Powershell 中似乎不需要。

所以不是一個很好的解決方案……但這取決於我猜你的替代方案:

$id = [Environment]::TickCount;
$fileName = "${PSScriptRoot}\Powershell_log_${id}.txt"
$listener1 = [System.Diagnostics.TextWriterTraceListener]::New($fileName, "text_listener")
$listener2 = [System.Diagnostics.ConsoleTraceListener]::New()
$listener2.Name = "console_listener"

[System.Diagnostics.Trace]::AutoFlush = $true
[System.Diagnostics.Trace]::Listeners.Add($listener1) | out-null
[System.Diagnostics.Trace]::Listeners.Add($listener2) | out-null

# Use reflection to enable and hook up the TraceSource
$logging = [System.Net.Sockets.Socket].Assembly.GetType("System.Net.Logging")
$flags = [System.Reflection.BindingFlags]::NonPublic -bor [System.Reflection.BindingFlags]::Static
$logging.GetField("s_LoggingEnabled", $flags).SetValue($null, $true)
$webTracing = $logging.GetProperty("Web", $flags);
$webTraceSource = [System.Diagnostics.Tracesource]$webTracing.GetValue($null, $null);
$webTraceSource.Switch.Level = [System.Diagnostics.SourceLevels]::Information
$webTracesource.Listeners.Add($listener1) | out-null
$webTracesource.Listeners.Add($listener2)  | out-null

[System.Diagnostics.Trace]::TraceInformation("About to do net stuff");
[System.Net.FtpWebRequest]::Create("ftp://www.google.com") | out-null
[System.Diagnostics.Trace]::TraceInformation("Finished doing net stuff");

#get rid of the listeners
[System.Diagnostics.Trace]::Listeners.Clear();
$webTraceSource.Listeners.Clear();
$listener1.Dispose();
$listener2.Dispose();

引用自:https://stackoverflow.com/questions/56220620