Куда Console.WriteLine идет в ASP.NET? - PullRequest
288 голосов
/ 26 сентября 2008

В приложении J2EE (например, запущенном в WebSphere), когда я использую System.out.println(), мой текст выходит на стандартный вывод, который отображается в файле консолью администратора WebSphere.

В приложении ASP.NET (например, запущенном в IIS), куда выводится Console.WriteLine()? Процесс IIS должен иметь stdin, stdout и stderr; но выводится ли стандартный вывод на версию / dev / null для Windows или здесь отсутствует ключевая концепция?

Я не спрашиваю , должен ли я войти туда (я использую log4net), но куда идет вывод? Моя лучшая информация пришла из этой дискуссии , где говорят, что Console.SetOut() может изменить TextWriter, но он все еще не ответил на вопрос о том, что является начальным значением Консоли или как его установить в конфигурации / вне кода времени выполнения.

Ответы [ 11 ]

683 голосов
/ 19 мая 2009

Если вы используете System.Diagnostics.Debug.WriteLine(...) вместо Console.WriteLine(), результаты можно увидеть в окне Вывод Visual Studio.

185 голосов
/ 16 сентября 2009

Если вы посмотрите на класс Console в .NET Reflector , вы обнаружите, что если процесс не имеет связанной консоли, Console.Out и Console.Error поддерживаются Stream.Null (обернутый в TextWriter), который является фиктивной реализацией Stream, которая в основном игнорирует все входные данные и не дает никаких выходных данных.

Так что это концептуально эквивалентно /dev/null, но реализация более упорядочена: с нулевым устройством не происходит никакого реального ввода-вывода.

Кроме того, кроме вызова SetOut, нет способа настроить значение по умолчанию.

24 голосов
/ 09 октября 2010

Я нашел этот вопрос, пытаясь изменить вывод журнала DataContext на окно вывода. Поэтому для всех, кто пытается сделать то же самое, я создал следующее:

class DebugTextWriter : System.IO.TextWriter {
   public override void Write(char[] buffer, int index, int count) {
       System.Diagnostics.Debug.Write(new String(buffer, index, count));
   }

   public override void Write(string value) {
       System.Diagnostics.Debug.Write(value);
   }

   public override Encoding Encoding {
       get { return System.Text.Encoding.Default; }
   }
}

И после этого: dc.Log = new DebugTextWriter (), и я могу видеть все запросы в окне вывода (dc - это DataContext).

Посмотрите на это для получения дополнительной информации: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

17 голосов
/ 22 октября 2013

Если вы используете IIS Express и запускаете его через командную строку, оно оставляет окно DOS открытым, и вы увидите там Console.Write операторы.

Например, откройте окно командной строки и введите:

"C:\Program Files (x86)\IIS Express\iisexpress" /path:C:\Projects\Website1 /port:1655

Предполагается, что у вас есть каталог сайта по адресу C: \ Projects \ Website1. Он запустит IIS Express и будет обслуживать страницы в каталоге вашего сайта. Он оставит командные окна открытыми, и вы увидите выходную информацию там. Допустим, у вас там был файл default.aspx с таким кодом:

<%@ Page Language="C#" %>
<html>
<body>
    <form id="form1" runat="server">
    Hello!

    <% for(int i = 0; i < 6; i++) %>
       <% { Console.WriteLine(i.ToString()); }%>

    </form>
</body>
</html>

Расположите ваш браузер и окна команд так, чтобы вы могли видеть их оба на экране. Теперь введите в свой браузер: http://localhost:1655/. Вы увидите Привет! на веб-странице, но в окне командной строки вы увидите что-то вроде

Request started: "GET" http://localhost:1655/
0
1
2
3
4
5
Request ended: http://localhost:1655/default.aspx with HTTP status 200.0

Я упростил задачу, имея код в блоке кода в разметке, но любые операторы консоли в вашем кодовом элементе или в любом другом месте вашего кода также будут отображаться здесь.

6 голосов
/ 19 сентября 2013

System.Diagnostics.Debug.WriteLine(...); получает его в Немедленное окно в Visual Studio 2008.

Перейти в меню Отладка -> Windows -> Немедленно :

Enter image description here

6 голосов
/ 26 сентября 2008

По умолчанию просто нет прослушивания консоли. При работе в режиме отладки подключена консоль, но в производственной среде, как вы и предполагали, сообщение просто никуда не отправляется, потому что ничего не прослушивается.

4 голосов
/ 26 сентября 2008

Если бы вы не были в строгом консольном приложении, я бы не использовал его, потому что вы не можете его увидеть. Я бы использовал Trace.WriteLine () для информации отладочного типа, которую можно включать и выключать в рабочей среде.

3 голосов
/ 03 марта 2012

Объект TraceContext в ASP.NET записывает в DefaultTraceListener, который выводит на хост-процесс стандартный вывод . Вместо использования Console.Write(), если вы используете Trace.Write, вывод перейдет к стандартному выводу процесса.

Вы можете использовать объект System.Diagnostics.Process, чтобы получить процесс ASP.NET для своего сайта и отслеживать стандартный вывод с помощью события OutputDataRecieved.

1 голос
/ 28 декабря 2018

если вы случайно использовали NLog в своем проекте ASP.net, вы можете добавить цель отладчика :

<targets>
    <target name="debugger" xsi:type="Debugger"
            layout="${date:format=HH\:mm\:ss}|${pad:padding=5:inner=${level:uppercase=true}}|${message} "/>

и записывает в эту цель логи для желаемых уровней:

<rules>
    <logger name="*" minlevel="Trace" writeTo="debugger" />

теперь у вас есть консольный вывод, как у Jetty в окне «Вывод» VS, и убедитесь, что вы работаете в режиме отладки (F5).

0 голосов
/ 05 августа 2017

Это сбивает с толку всех, когда речь идет о IISExpress. Там нет ничего, чтобы читать сообщения консоли. Например, в приложениях ASPCORE MVC он настраивается с помощью appsettings.json, который ничего не делает, если вы используете IISExpress.

На данный момент вы можете просто добавить loggerFactory.AddDebug (LogLevel.Debug); в разделе Configure, и он по крайней мере покажет вам ваши журналы в окне Debug Output.

Хорошие новости CORE 2.0, все это будет меняться: https://github.com/aspnet/Announcements/issues/255

...