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

224

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

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

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

  • 0
    Это на самом деле будет идти к STDOUT рабочего процесса ASP.NET. Где это указано, я не уверен.
  • 0
    Вот в чем вопрос - куда идет STDOUT?
Показать ещё 3 комментария
Теги:
iis
console.writeline

11 ответов

158
Лучший ответ

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

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

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

  • 1
    Используйте System.Diagnostics.Debug.WriteLine (), если вы действительно хотите, чтобы что-то было записано в окне вывода, которое вы можете просмотреть при отладке.
532

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

  • 42
    Я бы задал тот же вопрос, что и Кевин, но это ответ, который я бы искал.
  • 11
    Еще один маленький намек; если вы печатаете отформатированную строку, используйте Debug.Print вместо Debug.WriteLine, чтобы избежать конфликта аргументов (см. social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… ).
Показать ещё 6 комментариев
22

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

Annd после этого: 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

  • 0
    Почему бы просто не использовать статическую оболочку, учитывая, что вы используете полностью статические методы? Зачем расширять TextWriter ?
  • 1
    Вы также можете использовать dc.Log = s => Debug.WriteLine(s); ,
Показать ещё 1 комментарий
8

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

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

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

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

3

System.Diagnostics.Debug.WriteLine(...); выводит его в окно Immediate в Visual Studio 2008.

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

Изображение 5975

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

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

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

2

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

0

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

В настоящее время вы можете просто добавить loggerFactory.AddDebug(LogLevel.Debug); в разделе "Конфигурация", и он по крайней мере покажет вам свои журналы в окне "Отладка".

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

0

Если вы посмотрите в окне отладки, вы увидите console.writelines.

0

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню