ASP.NET에서 Console.WriteLine은 어디에 있습니까?


313

J2EE 애플리케이션 (WebSphere에서 실행되는 것과 같은)에서을 사용할 때 System.out.println()텍스트가 표준 출력으로 이동하여 WebSphere 관리 콘솔에서 파일에 맵핑됩니다.

IIS에서 실행되는 것과 같은 ASP.NET 응용 프로그램에서 출력은 Console.WriteLine()어디로 이동합니까? IIS 프로세스에는 stdin, stdout 및 stderr이 있어야합니다. 그러나 stdout이 Windows 버전의 / dev / null에 매핑되어 있습니까? 아니면 여기서 핵심 개념이 누락 되었습니까?

부탁하지 내가 거기에 로그인해야하는 경우 (내가 log4net를 사용)하지만 여기서 출력 이동합니까? 내 최고의 정보는이 토론에서을Console.SetOut() 변경할 수 있다고 말 TextWriter했지만 콘솔의 초기 값이 무엇인지 또는 런타임 코드의 구성 / 외부에서 설정하는 방법에 대한 질문에는 여전히 대답하지 않았습니다.


실제로 ASP.NET 작업자 프로세스의 STDOUT으로 이동합니다. 그것이 지적되는 곳, 확실하지 않습니다.
FlySwat

2
이것이 바로 질문입니다-STDOUT은 어디로 가나 요?
Kevin Hakanson

35
분명히 아무도 모르지만, 모두는 그들의 예에서 그것을 사용합니다. wtf
Jason

디버깅 목적을 찾고 있다면 아래 @Greg Bernhardt 회신을 참조하십시오.
Ram

1
@KevinHakanson FWIW는 몇 년 후 모든 프로세스에 대한 표준을 부모가 선택했습니다. 이 경우 부모는 IIS입니다. 이것은 올바른 방향으로 당신을 가리킬 수 있습니다 .
jpaugh

답변:


197

당신이 보는 경우 Console에 클래스 .NET 반사판 , 당신은 프로세스가 연관된 콘솔이 없습니다, 경우에 그것을 찾을 수 있습니다 Console.OutConsole.Error모의 Stream.Null(A 내부에 랩 TextWriter의 더미 구현 인) Stream즉 기본적으로 모든 입력을 무시보고, 출력을 제공하지 않습니다.

따라서 이는 개념적으로와 동일 /dev/null하지만 구현이 더 간소화됩니다. null 장치에서는 실제 I / O가 발생하지 않습니다.

또한을 호출하는 것 외에 SetOut기본값을 구성 할 방법이 없습니다.


18
디버깅 할 때 볼 수있는 출력 창에 실제로 무언가를 쓰려면 System.Diagnostics.Debug.WriteLine ()을 사용하십시오.
Ε Г И І И О

743

System.Diagnostics.Debug.WriteLine(...)대신에 를 사용 Console.WriteLine()하면 Visual Studio 의 출력 창 에서 결과를 볼 수 있습니다 .


45
나는 Kevin과 같은 질문을했지만 이것이 내가 찾던 대답입니다.
Zasz

11
하나 더 작은 힌트; 형식이 지정된 문자열을 인쇄하는 경우 인수 충돌을 피하려면 Debug.WriteLine 대신 Debug.Print를 사용하십시오 ( social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… 참조 ).
Nicholas Riley

12
메시지가 출력 창에 표시 되려면 디버거를 연결해야합니다.
코스 민

4
로컬 IIS 등에서 작동하지 않습니까? F5로 이것을 시작한다는 사실에도 불구하고 내 인생의 출력에 쓸 수없는 것 같습니다 (디버거가 연결되어 있음). 파일에 잘 쓸 수 있기 때문에 코드가 실행되고 있음을 알고 있습니다.
Kat

@Cosmin VS에 첨부해야하는 정확한 .exe는 무엇입니까?
그레이스

26

DataContext의 Log 출력을 출력 창으로 변경 하여이 질문을 찾았습니다. 그래서 다른 사람이 똑같이하려고하면, 내가 한 일은 이것을 만들었습니다.

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


정적 메서드를 완전히 래핑한다는 점에서 정적 래퍼를 사용하지 않는 이유는 무엇입니까? 왜 귀찮게 연장 TextWriter합니까?
Kat

1
당신은 또한 사용할 수 있습니다 dc.Log = s => Debug.WriteLine(s);.
Rudey

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

더 좋은 방법은 Console.SetOut (new DebugTextWriter ());
Alde

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를 사용합니다. 콘솔 출력은 프론트 엔드의 자바 스크립트 콘솔과 같이 백엔드에서 사용됩니다. 파일 기반 서버 로그를 사용하는 것과 달리 디버깅 시간을 절약합니다. "친숙한"예외 처리를 재정의 할 필요가 없습니다. 멋진 "oops"브라우저 페이지를 유지하고 예외를 콘솔에 출력하면 쉽게 볼 수 있습니다.
ingredient_15939

9

System.Diagnostics.Debug.WriteLine(...);Visual Studio 2008의 직접 실행 으로 가져옵니다 .

메뉴 디버그 -> Windows- > 즉시로 이동하십시오 .

여기에 이미지 설명을 입력하십시오


내 Visual Studio 2012에서 나는 당신이 말한 것을 따랐지만 문자열 OutputImmediate WindowThanks!
WTFZane

6

기본적으로 콘솔 청취는 없습니다. 디버그 모드로 실행하면 콘솔이 연결되어 있지만 프로덕션 환경에서는 의심의 여지가 없으므로 아무것도 듣고 있지 않으므로 메시지가 이동하지 않습니다.



3

TraceContextASP.NET 의 개체 DefaultTraceListener는 호스트 프로세스의 표준 출력에 출력 하는 것을 씁니다 . 을 사용하는 대신 Console.Write()을 사용 Trace.Write하면 출력이 프로세스의 표준 출력으로 이동합니다.

System.Diagnostics.Process개체를 사용 하여 사이트에 대한 ASP.NET 프로세스를 얻고 OutputDataRecieved이벤트를 사용하여 표준 출력을 모니터링 할 수 있습니다 .


1

ASP.net 프로젝트에서 NLog를 사용한 경우 디버거 대상을 추가 할 수 있습니다 .

<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" />

이제 VS의 "출력"창에 Jetty와 같은 콘솔 출력이 있으며 디버그 모드 (F5)에서 실행 중인지 확인하십시오.


0

IISExpress와 관련하여 모든 사람에게 혼란을줍니다. 콘솔 메시지를 읽을 것이 없습니다. 예를 들어 ASPCORE MVC 앱에서는 IISExpress를 사용하는 경우 아무것도하지 않는 appsettings.json을 사용하여 구성합니다.

지금은 loggerFactory.AddDebug (LogLevel.Debug); 구성 섹션에 있으면 디버그 출력 창에 최소한 로그가 표시됩니다.

좋은 소식 CORE 2.0이 모든 것이 변경 될 것입니다 : https://github.com/aspnet/Announcements/issues/255



-3

ASP.NET 응용 프로그램에서는 디버깅 중에 볼 수있는 출력 또는 콘솔 창으로 이동한다고 생각합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.