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


313

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

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

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


Це насправді переходитиме до STDOUT процесу ASP.NET Worker. Куди це вказується, я не впевнений.
FlySwat

2
Ось питання - куди йде STDOUT?
Кевін Хакансон

35
мабуть, ніхто не знає, але кожен використовує це у своїх прикладах. wtf
Джейсон

якщо ви шукали для налагодження цілі, я б посилався на відповідь @Greg Bernhardt нижче.
Рам

1
@KevinHakanson FWIW всі ці роки пізніше, stdout для будь-якого процесу вибирається батьком, процес, який його запустив. У цьому випадку батьком буде IIS. Це може вказувати на вас у правильному напрямку .
jpaugh

Відповіді:


197

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

Отже, це концептуально рівнозначно /dev/null , але реалізація є більш спрощеною: фактичного вводу-виводу не відбувається з нульовим пристроєм.

Крім того, крім виклику SetOut, немає способу налаштувати за замовчуванням.


18
Використовуйте System.Diagnostics.Debug.WriteLine (), якщо ви дійсно хочете, щоб щось було записано у вікно виводу, яке ви можете переглянути при налагодженні.
Ε Г І І І О

743

Якщо ви використовуєте System.Diagnostics.Debug.WriteLine(...)замість Console.WriteLine(), то результати можна побачити у вікні виводу Visual Studio.


45
Я б задав те саме питання, що і Кевін, але це відповідь, яку я шукав би.
Заш

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 = новий 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);.
Rudey

1
Application_Start: System.Console.SetOut (новий DebugTextWriter ());
Стефан Штайгер

Ще краще, Console.SetOut (новий DebugTextWriter ());
Олде

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.

Перейдіть у меню Налагодження -> Windows -> Негайно :

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


У своїй візуальній студії 2012 я дотримувався того, що ви сказали, але рядок з'явився Outputлише у Immediate Windowспасибі!
WTFZane

6

За замовчуванням прослуховування консолі просто немає. У режимі налагодження додається консоль, але у виробничих умовах це, як ви підозрювали, повідомлення просто нікуди не дінеться, тому що нічого не слухає.


5

Якщо ви не користуєтеся суворою консольною програмою, я б не використовував її, тому що ви не можете її бачити. Я б використовував Trace.WriteLine () для налагодження інформації типу, яку можна включати та вимикати у виробництві.


Так, з цього місця можна почати: msdn.microsoft.com/en-us/library/x5952w0c.aspx
Zhaph - Ben 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); у розділі Налаштування, і він принаймні покаже ваші журнали у вікні виводу налагодження.

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



-3

У додатку ASP.NET я думаю, що він переходить до вікна Output або Console, який видно під час налагодження.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.