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

313

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

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

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

Кевин Хакансон
источник
Это на самом деле будет идти к STDOUT рабочего процесса ASP.NET. Где это указано, я не уверен.
FlySwat
2
Вот в чем вопрос - куда идет STDOUT?
Кевин Хакансон
35
видимо никто не знает, но каждый использует это в своих примерах. wtf
Джейсон
если бы вы искали отладку, я бы сослался на ответ @Greg Bernhardt ниже.
Рам
1
@KevinHakanson FWIW все эти годы спустя, выход для любого процесса выбирается его родителем, процессом, который его запустил. В этом случае родителем будет IIS. Это может указать вам правильное направление .
jpaugh

Ответы:

197

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

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

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

Ruben
источник
18
Используйте System.Diagnostics.Debug.WriteLine (), если вы действительно хотите, чтобы что-то было записано в окне вывода, которое вы можете просмотреть при отладке.
Ε Г И І И О
743

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

Грег Бернхардт
источник
45
Я бы задал тот же вопрос, что и Кевин, но это ответ, который я бы искал.
Zasz
11
Еще один маленький намек; если вы печатаете отформатированную строку, используйте Debug.Print вместо Debug.WriteLine, чтобы избежать конфликта аргументов (см. social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… ).
Николас Райли
12
Обратите внимание, что отладчик необходимо подключить, чтобы сообщения отображались в окне «Вывод».
Космин
4
Это не работает для локального IIS или что-то? Кажется, я не могу писать в вывод всю жизнь, несмотря на то, что я начинаю это с F5 (поэтому отладчик подключен). Я знаю, что мой код выполняется, потому что я могу записать в файл нормально.
Кат
@Cosmin Какой именно .exe, который я должен присоединить в VS?
Благодать
26

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

Артур Карвалью
источник
Почему бы просто не использовать статическую оболочку, учитывая, что вы используете полностью статические методы? Зачем расширяться TextWriter?
Кат
1
Вы также можете использовать dc.Log = s => Debug.WriteLine(s);.
Руди
1
Application_Start: System.Console.SetOut (new DebugTextWriter ());
Стефан Штайгер,
Еще лучше, Console.SetOut (новый DebugTextWriter ());
Alde
18

Если вы используете 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

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

Крис
источник
+1 Я всегда использую IIS Express при разработке по этой причине. Вывод на консоль бесценен, используется на заднем конце, как консоль javascript на переднем. Экономит кучу времени на отладку, в отличие от использования файлового журнала сервера. Вам не нужно переопределять «дружественную» обработку исключений - сохраните приятную страницу браузера «упс» и просто выведите исключение на консоль, чтобы было легко увидеть.
ингридиент_15939
9

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

Зайдите в меню Debug -> Windows -> Немедленно :

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

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

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

Крейг Тайлер
источник
5

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

Чарльз Грэм
источник
Да, вот это хорошее место , чтобы начать: msdn.microsoft.com/en-us/library/x5952w0c.aspx
Zhaph - Бен Duguid
3

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

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

Брайан Гриффин
источник
1

если вам довелось использовать 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

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

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

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

Крис Го
источник
0

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

Сохара Буддика
источник
-3

Я думаю, что в приложении ASP.NET оно идет в окно «Вывод» или «Консоль», которое отображается во время отладки.

Леон Тайсон
источник