Трассировка .NET в PowerShell без создания файла .config - PullRequest
6 голосов
/ 20 мая 2019

Я знаю, что могу включить .NET tracing , добавив <system.diagnostics> элемент в конфигурацию приложения (powershell.exe.config) в папке установки PowerShell. Это описано в трассировке System.Net в Powershell .

На самом деле я тоже хочу зарегистрировать System.Net источник трассировки (например, FtpWebRequest) .

Но есть ли способ включить трассировку локально? Как в самом коде? Или, возможно, используя какой-то переключатель командной строки? Или я могу по крайней мере иметь файл конфигурации приложения в папке local , чтобы не изменять общесистемные настройки?

Ответы [ 2 ]

7 голосов
/ 24 мая 2019

Просто включить источники трассировки по умолчанию (Trace.Information и т. Д.) В коде (и, следовательно, в Powershell) относительно легко.

Сделать это для источников трассировки 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();
0 голосов
/ 23 мая 2019

Да, вы можете написать трассировку в коде.

Trace.Write("Hello world");

Если вы хотите что-то более продвинутое, попробуйте Log4Net , который генерирует файл конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...