Gdzie idzie Console.WriteLine w ASP.NET?


313

Gdy używam aplikacji J2EE (takiej jak ta uruchomiona w WebSphere), System.out.println()mój tekst przechodzi do standardowej wersji, która jest odwzorowywana na plik przez konsolę administracyjną WebSphere.

W aplikacji ASP.NET (takiej jak ta uruchomiona w IIS), gdzie idzie wyjście Console.WriteLine()? Proces IIS musi mieć stdin, stdout i stderr; ale czy stdout jest mapowany na wersję / dev / null dla systemu Windows, czy brakuje mi tutaj kluczowej koncepcji?

Nie pytam, czy powinienem się tam zalogować (używam log4net), ale gdzie idzie wyjście? Moje najlepsze informacje pochodzą z tej dyskusji, w której mówią, że Console.SetOut()można to zmienić TextWriter, ale wciąż nie odpowiadało na pytanie, jaka jest początkowa wartość konsoli lub jak ustawić ją w config / poza kodem środowiska wykonawczego.


W rzeczywistości przejdzie do STDOUT procesu roboczego ASP.NET. Gdzie to wskazane, nie jestem pewien.
FlySwat

2
To pytanie - dokąd zmierza STDOUT?
Kevin Hakanson

35
najwyraźniej nikt nie wie, ale wszyscy używają tego w swoich przykładach. wtf
Jason

jeśli szukasz celów debugowania, odsyłam do poniższej odpowiedzi @Greg Bernhardt.
Ram

1
@KevinHakanson FWIW przez te wszystkie lata później stdout dla każdego procesu jest wybierany przez jego nadrzędnego, proces, który go rozpoczął. W takim przypadku rodzicem byłoby IIS. Może to wskazywać właściwy kierunek .
jpaugh

Odpowiedzi:


197

Jeśli spojrzysz na Consoleklasę w .NET Reflector , przekonasz się, że jeśli proces nie ma powiązanej konsoli Console.Outi Console.Errorjest wspierany przez Stream.Null(zawinięty w a TextWriter), co jest pozorną implementacjąStream która w zasadzie ignoruje wszystkie dane wejściowe, i nie daje wyniku.

Jest to koncepcyjnie równoważne z /dev/null , ale implementacja jest bardziej usprawniona: nie ma rzeczywistych operacji we / wy z urządzeniem zerowym.

Poza dzwonieniem SetOutnie ma też możliwości skonfigurowania ustawień domyślnych.


18
Użyj System.Diagnostics.Debug.WriteLine (), jeśli faktycznie chcesz coś napisać w oknie Output, które możesz wyświetlić podczas debugowania.
Ε Г И І И О

743

Jeśli użyjesz System.Diagnostics.Debug.WriteLine(...)zamiast Console.WriteLine(), możesz zobaczyć wyniki w oknie Output Visual Studio.


45
Zadałbym to samo pytanie, co Kevin, ale takiej odpowiedzi szukałem.
Zasz

11
Jeszcze jedna mała wskazówka; jeśli drukujesz sformatowany ciąg, użyj Debug.Print zamiast Debug.WriteLine, aby uniknąć konfliktu argumentów (patrz social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… ).
Nicholas Riley

12
Zauważ, że debuger musi zostać podłączony, aby komunikaty były wyświetlane w oknie Wyjście.
Cosmin

4
Czy to nie działa dla lokalnego IIS czy coś takiego? Wydaje mi się, że nie jestem w stanie pisać danych wyjściowych przez całe życie, mimo że zaczynam to od F5 (więc dołączony jest debugger). Wiem, że mój kod jest wykonywany, ponieważ mogę dobrze zapisać w pliku.
Kat

@Cosmin Do jakiego dokładnego pliku .exe należy dołączyć w VS?
Grace,

26

Znalazłem to pytanie, próbując zmienić dane wyjściowe dziennika DataContext na okno danych wyjściowych. Więc dla każdego, kto próbuje zrobić to samo, stworzyłem to:

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; }
   }
}

Po tym: dc.Log = new DebugTextWriter () i widzę wszystkie zapytania w oknie wyjściowym (dc to DataContext).

Zajrzyj na to, aby uzyskać więcej informacji: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers


Dlaczego po prostu nie użyć statycznego opakowania, biorąc pod uwagę, że pakujesz całkowicie statyczne metody? Po co zawracać sobie głowę przedłużaniem TextWriter?
Kat

1
Możesz także użyć dc.Log = s => Debug.WriteLine(s);.
Rudey,

1
Application_Start: System.Console.SetOut (new DebugTextWriter ());
Stefan Steiger

Jeszcze lepiej, Console.SetOut (new DebugTextWriter ());
Alde

18

Jeśli używasz IIS Express i uruchamiasz go za pomocą wiersza polecenia, okno DOS pozostanie otwarte, a zobaczysz Console.Writetam instrukcje.

Na przykład otwórz okno poleceń i wpisz:

"C:\Program Files (x86)\IIS Express\iisexpress" /path:C:\Projects\Website1 /port:1655

Zakłada się, że masz katalog witryny w C: \ Projekty \ Witryna1. Uruchomi IIS Express i będzie obsługiwał strony w katalogu witryny. Zostawi otwarte okna poleceń i zobaczysz tam informacje wyjściowe. Załóżmy, że masz tam plik default.aspx z tym kodem:

<%@ 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>

Rozmieść okna przeglądarki i poleceń, aby były widoczne na ekranie. Teraz wpisz w przeglądarce: http://localhost:1655/. Zobaczysz Cześć! na stronie, ale w oknie poleceń zobaczysz coś podobnego

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

Uprościłem to, umieszczając kod w bloku kodu w znacznikach, ale tutaj pojawią się również wszelkie instrukcje konsoli w twoim kodzie lub w dowolnym innym miejscu kodu.


+1 Zawsze używam IIS Express podczas programowania z tego powodu. Wyjście konsoli jest nieocenione, używane z tyłu, podobnie jak konsola javascript z przodu. Oszczędza mnóstwo czasu debugowania, w przeciwieństwie do korzystania z dziennika serwera opartego na plikach. Nie musisz zastępować „przyjaznej” obsługi wyjątków - zachowaj ładną stronę przeglądarki „ups” i po prostu wyślij wyjątek do konsoli, łatwo widoczny.
ingredient_15939

9

System.Diagnostics.Debug.WriteLine(...);przenosi go do okna natychmiastowego w Visual Studio 2008.

Przejdź do menu Debugowanie -> Windows -> Natychmiastowe :

Wpisz opis zdjęcia tutaj


W moim Visual Studio 2012 podążałem za tym, co powiedziałeś, ale napis pojawił się Outputtuż poza Immediate Windowpodziękowaniami!
WTFZane

6

Po prostu domyślnie nie ma nasłuchiwania przez konsolę. W trybie debugowania jest podłączona konsola, ale w środowisku produkcyjnym jest to, jak podejrzewasz, wiadomość po prostu nigdzie nie idzie, ponieważ nic nie nasłuchuje.



3

TraceContextObiekt w ASP.NET zapisuje na DefaultTraceListenerktóry wysyła się do procesu gospodarza standardowej produkcji . Jeśli nie używasz Console.Write(), jeśli użyjesz Trace.Write, dane wyjściowe przejdą na standardowe wyjście procesu.

Możesz użyć tego System.Diagnostics.Processobiektu, aby uzyskać proces ASP.NET dla swojej witryny i monitorować standardowe dane wyjściowe za pomocą OutputDataRecievedzdarzenia.


1

jeśli zdarzyło Ci się użyć NLog w projekcie ASP.net, możesz dodać cel debugera :

<targets>
    <target name="debugger" xsi:type="Debugger"
            layout="${date:format=HH\:mm\:ss}|${pad:padding=5:inner=${level:uppercase=true}}|${message} "/>

i zapisuje dzienniki w tym celu dla pożądanych poziomów:

<rules>
    <logger name="*" minlevel="Trace" writeTo="debugger" />

teraz masz wyjście konsoli jak Jetty w oknie „Wyjście” VS i upewnij się, że pracujesz w trybie debugowania (F5).


0

Jest to mylące dla wszystkich, jeśli chodzi o IISExpress. Nie ma nic do czytania komunikatów konsoli. Na przykład w aplikacjach ASPCORE MVC konfiguruje się za pomocą appsettings.json, co nie robi nic, jeśli używasz IISExpress.

Na razie możesz po prostu dodać loggerFactory.AddDebug (LogLevel.Debug); w sekcji Konfiguruj, a przynajmniej pokażą Ci twoje dzienniki w oknie Wyjście debugowania.

Dobra wiadomość CORE 2.0 to wszystko się zmieni: https://github.com/aspnet/Announcements/issues/255



-3

W aplikacji ASP.NET myślę, że idzie do okna Output lub Console, które jest widoczne podczas debugowania.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.