Dot-Net
在 PowerShell 中進行 .NET 跟踪,無需創建 .config 文件
我知道我可以通過將元素添加到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();