Para onde vai o Console.WriteLine no ASP.NET?

313

Em um aplicativo J2EE (como um em execução no WebSphere), quando eu uso System.out.println(), meu texto sai para o padrão, que é mapeado para um arquivo pelo console administrativo do WebSphere.

Em um aplicativo ASP.NET (como um executado no IIS), para onde vai a saída Console.WriteLine()? O processo do IIS deve ter um stdin, stdout e stderr; mas o stdout está mapeado para a versão do Windows de / dev / null ou estou perdendo um conceito-chave aqui?

Não estou perguntando se devo fazer logon (uso log4net), mas para onde vai a saída? Minhas melhores informações vieram dessa discussão, na qual eles dizem que Console.SetOut()podem mudar o TextWriterarquivo, mas ainda não responderam à pergunta sobre qual é o valor inicial do console ou como configurá-lo em config / fora do código de tempo de execução.

Kevin Hakanson
fonte
Na verdade, ele iria para o STDOUT do processo de trabalho do ASP.NET. Onde isso é apontado, não tenho certeza.
FlySwat 26/09/08
2
Essa é a pergunta - para onde vai o STDOUT?
Kevin Hakanson
35
aparentemente ninguém sabe, mas todo mundo usa isso em seus exemplos. wtf
Jason
Se você estava procurando propósitos de depuração, consulte a resposta @Greg Bernhardt abaixo.
Ram
1
@KevinHakanson FWIW todos esses anos depois, o stdout para qualquer processo é escolhido por seu pai, o processo que o iniciou. Nesse caso, o pai seria o IIS. Isso pode indicar a direção certa .
jpaugh

Respostas:

197

Se você observar a Consoleclasse no .NET Reflector , descobrirá que, se um processo não tiver um console associado Console.Oute Console.Errorfor apoiado por Stream.Null(empacotado dentro de a TextWriter), que é uma implementação fictícia Streamque basicamente ignora todas as entradas e não dá saída.

Portanto, é conceitualmente equivalente a /dev/null, mas a implementação é mais simplificada: não há E / S real ocorrendo com o dispositivo nulo.

Além disso, além da chamada SetOut, não há como configurar o padrão.

Ruben
fonte
18
Use System.Diagnostics.Debug.WriteLine () se você realmente deseja que algo seja gravado na janela Saída, que pode ser exibida durante a depuração.
202519
743

Se você usar em System.Diagnostics.Debug.WriteLine(...)vez de Console.WriteLine(), poderá ver os resultados na janela Saída do Visual Studio.

Greg Bernhardt
fonte
45
Eu teria feito a mesma pergunta que Kevin, mas esta é a resposta que eu estaria procurando.
Zasz
11
Mais uma pequena dica; se você estiver imprimindo uma seqüência de caracteres formatada, use Debug.Print em vez de Debug.WriteLine para evitar um conflito de argumento (consulte social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… ).
Nicholas Riley
12
Observe que o depurador precisa ser anexado para que as mensagens sejam mostradas na janela Saída.
Cosmin
4
Isso não funciona para o IIS local ou algo assim? Parece que não consigo escrever na saída durante toda a minha vida, apesar do fato de estar começando com F5 (portanto, o depurador está anexado). Eu sei que meu código está sendo executado porque posso escrever em um arquivo.
Kat
@ Cosmin Qual arquivo .exe exato que devo anexar no VS?
Graça
26

Eu encontrei essa pergunta tentando alterar a saída de log do DataContext para a janela de saída. Então, para qualquer pessoa que tente fazer o mesmo, o que eu fiz foi criar isso:

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

E depois disso: dc.Log = new DebugTextWriter () e posso ver todas as consultas na janela de saída (dc é o DataContext).

Dê uma olhada nisto para obter mais informações: http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

Artur Carvalho
fonte
Por que não usar apenas um invólucro estático, considerando que você está agrupando métodos totalmente estáticos? Por que se preocupar em estender TextWriter?
Kat
1
Você também pode usar dc.Log = s => Debug.WriteLine(s);.
Rudey
1
Application_Start: System.Console.SetOut (new DebugTextWriter ());
Stefan Steiger
Melhor ainda, Console.SetOut (new DebugTextWriter ());
Alde
18

Se você estiver usando o IIS Express e iniciá-lo por meio de um prompt de comando, ele deixará a janela do DOS aberta e você verá Console.Writeinstruções lá.

Por exemplo, abra uma janela de comando e digite:

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

Isso pressupõe que você tenha um diretório de site em C: \ Projects \ Website1. Ele iniciará o IIS Express e exibirá as páginas no diretório do site. Isso deixará as janelas de comando abertas e você verá as informações de saída lá. Digamos que você tenha um arquivo lá, default.aspx, com este código:

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

Organize o navegador e as janelas de comando para poder vê-los na tela. Agora digite no seu navegador: http://localhost:1655/. Você verá Olá! na página da web, mas na janela de comando você verá algo como

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

Simplifiquei o código em um bloco de código na marcação, mas qualquer instrução do console no seu code-behind ou em qualquer outro lugar do seu código também será exibida aqui.

Chris
fonte
+1 Eu sempre uso o IIS Express durante o desenvolvimento por esse motivo. A saída do console é inestimável, usada no back-end como o console javascript no front-end. Economiza muito tempo na depuração, em vez de usar um log do servidor baseado em arquivo. Você não precisa substituir o tratamento de exceção "amigável" - mantenha a página agradável do navegador "oops" e apenas envie a exceção para o console, fácil de ver.
ingredient_15939
9

System.Diagnostics.Debug.WriteLine(...);coloca na Janela Imediata no Visual Studio 2008.

Vá para o menu Debug -> Windows -> Immediate :

Digite a descrição da imagem aqui

Nik
fonte
No meu Visual Studio 2012, segui o que você disse, mas a string apareceu no Outputalém do Immediate WindowThanks!
WTFZane # 03:
6

Simplesmente não há console ouvindo por padrão. Executando no modo de depuração, há um console conectado, mas, em um ambiente de produção, é como você suspeitava, a mensagem simplesmente não vai a lugar algum porque nada está escutando.

Craig Tyler
fonte
5

A menos que você esteja em um aplicativo de console rigoroso, eu não o usaria, porque você realmente não pode vê-lo. Eu usaria Trace.WriteLine () para informações do tipo depuração que podem ser ativadas e desativadas na produção.

Charles Graham
fonte
Sim, aqui está um bom ponto de partida: msdn.microsoft.com/en-us/library/x5952w0c.aspx
Zhaph - Ben Duguid
3

O TraceContextobjeto no ASP.NET grava nas DefaultTraceListenersaídas que saem para a saída padrão do processo host . Em vez de usar Console.Write(), se você usar Trace.Write, a saída irá para a saída padrão do processo.

Você pode usar o System.Diagnostics.Processobjeto para obter o processo ASP.NET do seu site e monitorar a saída padrão usando o OutputDataRecievedevento

Brian Griffin
fonte
1

se você usou o NLog no seu projeto ASP.net, pode adicionar um destino para o Depurador :

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

e grava logs nesse destino para os níveis que você deseja:

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

agora você tem saída do console como o Jetty na janela "Saída" do VS e verifique se está executando no modo de depuração (F5).

mickey
fonte
0

Isso é confuso para todos quando se trata do IISExpress. Não há nada para ler as mensagens do console. Por exemplo, nos aplicativos ASPCORE MVC, ele configura usando appsettings.json, o que não faz nada se você estiver usando o IISExpress.

Por enquanto, você pode adicionar loggerFactory.AddDebug (LogLevel.Debug); na seção Configurar e, pelo menos, mostrará seus logs na janela Saída de depuração.

Boas notícias, o CORE 2.0 está mudando: https://github.com/aspnet/Announcements/issues/255

Chris Go
fonte
0

Mac, No modo de depuração, há uma guia para a saída. insira a descrição da imagem aqui

Thushara Buddhika
fonte
-3

Em um aplicativo ASP.NET, acho que vai para a janela Saída ou Console, que é visível durante a depuração.

Leon Tayson
fonte