Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Kevin HakansonОтветов: 12

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

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

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

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

iis

Ответы

Ответ 1 · рейтинг 207 · Ruben

Если вы посмотрите на класс 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>

Ответ 2 · рейтинг 778 · Greg Bernhardt

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

Ответ 3 · рейтинг 29 · Artur Carvalho

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

Ответ 4 · рейтинг 18 · Chris

Если вы используете 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 или где-либо еще в вашем коде также будет отображаться здесь.

Ответ 5 · рейтинг 9 · Nik

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

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

Ответ 6 · рейтинг 6 · Craig Tyler

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

Ответ 7 · рейтинг 5 · Charles Graham

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

Ответ 8 · рейтинг 3 · Brian Griffin

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

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

Ответ 9 · рейтинг 1 · mickey

если вы использовали 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).

Ответ 10 · Chris Go

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

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

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

Ответ 11 · Thushara Buddhika

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

Ответ 12 · рейтинг -3 · Leon Tayson

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы