Куда идет Console.WriteLine в ASP.NET?

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

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

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


person Kevin Hakanson    schedule 26.09.2008    source источник
comment
Фактически он перейдет в STDOUT рабочего процесса ASP.NET. Где это указано, я не уверен.   -  person FlySwat    schedule 26.09.2008
comment
Вот вопрос - куда девается STDOUT?   -  person Kevin Hakanson    schedule 24.08.2009
comment
видимо никто не знает, но все используют это в своих примерах. wtf   -  person Jason    schedule 26.08.2009
comment
Если вы искали цели отладки, я бы сослался на ответ @Greg Bernhardt ниже.   -  person Ram    schedule 09.10.2015
comment
@KevinHakanson FWIW все эти годы спустя stdout для любого процесса выбирается его родительским процессом, процессом, который его запустил. В этом случае родителем будет IIS. Это может указать вам правильное направление.   -  person jpaugh    schedule 25.10.2018


Ответы (12)


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

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

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

Обновление 2020-11-02: поскольку этот ответ все еще набирает голоса в 2020 году, вероятно, следует отметить, что в ASP.NET Core обычно есть прикрепленная консоль. Вы можете настроить ASP.NET Core IIS Модуль для перенаправления всего вывода stdout и stderr в файл журнала с помощью настроек stdoutLogEnabled и stdoutLogFile:

<system.webServer>
  <aspNetCore processPath="dotnet"
              arguments=".\MyApp.dll"
              hostingModel="inprocess"
              stdoutLogEnabled="true"
              stdoutLogFile=".\logs\stdout" />
<system.webServer>
person Ruben    schedule 16.09.2009
comment
Используйте System.Diagnostics.Debug.WriteLine (), если вы действительно хотите, чтобы что-то было записано в окно вывода, которое вы можете просмотреть при отладке. - person Ε Г И І И О; 20.02.2019

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

person Greg Bernhardt    schedule 18.05.2009
comment
Я бы задал тот же вопрос, что и Кевин, но это ответ, который я бы искал. - person Zasz; 11.06.2011
comment
Еще одна маленькая подсказка; если вы печатаете отформатированную строку, используйте Debug.Print вместо Debug.WriteLine, чтобы избежать конфликта аргументов (см. social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/). - person Nicholas Riley; 10.01.2012
comment
Обратите внимание, что отладчик должен быть прикреплен, чтобы сообщения отображались в окне вывода. - person Cosmin; 28.08.2013
comment
Это не работает для локального IIS или чего-то в этом роде? Кажется, я не могу писать в вывод на всю жизнь, несмотря на то, что я начинаю это с F5 (поэтому отладчик прикреплен). Я знаю, что мой код выполняется, потому что я могу нормально писать в файл. - person Kat; 19.05.2015
comment
@Kat Убедитесь, что изменение, которое вы пытаетесь увидеть, действительно отправляется обратно на сервер, когда вы этого ожидаете. У меня была такая же проблема, пока я не понял, что в моем раскрывающемся списке не было установлено значение autopostback="true", когда я пытался записать ddl.selectedvalue в окно вывода. - person TylerH; 23.05.2019
comment
Полезно использовать Console.WriteLine, если вы используете одну и ту же DLL как в IIS, так и в консольных приложениях. Вот так я и оказался здесь;) - person Adam; 18.06.2020

Я нашел этот вопрос, пытаясь изменить вывод журнала 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 < / а>

person Artur Carvalho    schedule 09.10.2010
comment
Почему бы просто не использовать статическую оболочку, учитывая, что вы обертываете полностью статические методы? Зачем продлевать TextWriter? - person Kat; 19.05.2015
comment
Вы также можете использовать dc.Log = s => Debug.WriteLine(s);. - person Rudey; 16.02.2016
comment
Application_Start: System.Console.SetOut (новый DebugTextWriter ()); - person Stefan Steiger; 23.11.2016
comment
Еще лучше, Console.SetOut (новый DebugTextWriter ()); - person Alde; 01.10.2019

Если вы используете 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/. Вы увидите Hello! на веб-странице, но в командном окне вы увидите что-то вроде

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

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

person Chris    schedule 22.10.2013
comment
+1 По этой причине я всегда использую IIS Express при разработке. Вывод на консоль неоценим, он используется в задней части, как консоль javascript в передней части. Экономит массу времени на отладку, в отличие от использования журнала сервера на основе файлов. Вам не нужно переопределять дружественную обработку исключений - сохраните красивую страницу браузера oops и просто выведите исключение в консоль, чтобы его было легко увидеть. - person ingredient_15939; 21.08.2017

System.Diagnostics.Debug.WriteLine(...); помещает его в непосредственное окно в Visual Studio 2008.

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

Введите описание изображения здесь

person Nik    schedule 19.09.2013
comment
В моей Visual Studio 2012 я следовал тому, что вы сказали, но строка появилась в Output только после Immediate Window Спасибо! - person WTFZane; 14.03.2017

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

person Craig Tyler    schedule 26.09.2008

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

person Charles Graham    schedule 26.09.2008
comment
Да, вот хорошее место для начала: msdn.microsoft.com/en-us /library/x5952w0c.aspx - person Zhaph - Ben Duguid; 19.05.2009

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

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

person Brian Griffin    schedule 02.03.2012


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

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

Хорошие новости CORE 2.0: все изменится: https://github.com/aspnet/Announcements/issues/255

person Chris Go    schedule 04.08.2017

Mac, в режиме отладки есть вкладка для вывода. введите здесь описание изображения

person Thushara Buddhika    schedule 05.03.2020

В приложении ASP.NET, я думаю, он переходит в окно вывода или консоли, которое видно во время отладки.

person Leon Tayson    schedule 26.09.2008