2008-09-26 18 views
245

एक जे 2 ईई अनुप्रयोग (जैसे वेबस्पेयर में चल रहा है) में, जब मैं System.out.println() का उपयोग करता हूं, तो मेरा टेक्स्ट मानक आउट हो जाता है, जिसे वेबस्पेयर एडमिन कंसोल द्वारा फ़ाइल में मैप किया जाता है।Console.WriteLine ASP.NET में कहां जाता है?

एएसपी.NET एप्लिकेशन (जैसे आईआईएस में चलने वाला) में, Console.WriteLine() का आउटपुट कहां जाता है? आईआईएस प्रक्रिया में एक stdin, stdout और stderr होना चाहिए; लेकिन/dev/null के विंडोज संस्करण में मैप किया गया है या क्या मुझे यहां एक महत्वपूर्ण अवधारणा याद आ रही है?

मैं नहीं पूछ रहा हूं अगर मुझे वहां लॉग ऑन करना चाहिए (मैं log4net का उपयोग करता हूं), लेकिन आउटपुट कहां जाता है? मेरी सबसे अच्छी जानकारी इस discussion से मिली है, जहां वे कहते हैं कि Console.SetOut()TextWriter बदल सकता है, लेकिन यह अभी भी कंसोल का प्रारंभिक मान, या रनटाइम कोड के बाहर/कॉन्फ़िगरेशन में सेट करने के तरीके के बारे में प्रश्न का उत्तर नहीं देता है।

+25

जाहिरा तौर पर कोई नहीं जानता, लेकिन हर कोई अपने उदाहरण में इसे इस्तेमाल करता है। wtf – Jason

+0

यदि आप डिबगिंग उद्देश्यों की तलाश में थे तो मैं नीचे @ ग्रेग बर्नार्ड उत्तर का उल्लेख करूंगा। – Rama

+0

यह वास्तव में एएसपी.नेट कार्यकर्ता प्रक्रिया के STDOUT पर जाएगा। जहां इसकी ओर इशारा किया गया है, मुझे यकीन नहीं है। – FlySwat

उत्तर

155

आप .NET Reflector में Console वर्ग को देखें, तो आप पाएंगे कि यदि एक प्रक्रिया एक संबद्ध सांत्वना नहीं है, Console.Out और Console.ErrorStream.Null (एक TextWriter अंदर लिपटे) द्वारा समर्थन कर रहे हैं, की एक डमी कार्यान्वयन है जो Stream जो मूल रूप से सभी इनपुट को अनदेखा करता है, और कोई आउटपुट नहीं देता है।

तो यह अवधारणात्मक रूप से /dev/null के बराबर है, लेकिन कार्यान्वयन अधिक सुव्यवस्थित है: शून्य डिवाइस के साथ कोई वास्तविक I/O नहीं हो रहा है।

इसके अलावा, SetOut पर कॉल करने के अलावा, डिफ़ॉल्ट को कॉन्फ़िगर करने का कोई तरीका नहीं है।

-1

एएसपी.NET एप्लिकेशन में, मुझे लगता है कि यह आउटपुट या कंसोल विंडो पर जाता है जो डिबगिंग के दौरान दिखाई देता है।

3

जब तक कि आप सख्त कंसोल एप्लिकेशन में नहीं हैं, मैं इसका उपयोग नहीं करता, क्योंकि आप इसे वास्तव में नहीं देख सकते हैं। मैं Trace.WriteLine() को डिबगिंग-प्रकार की जानकारी के लिए उपयोग करता हूं जिसे उत्पादन में चालू और बंद किया जा सकता है।

+0

हाँ, यहां शुरू करने के लिए एक अच्छी जगह है: http://msdn.microsoft.com/en-us/library/x5952w0c.aspx –

6

डिफ़ॉल्ट रूप से कोई कंसोल नहीं सुन रहा है। डीबग मोड में चल रहा एक कंसोल संलग्न है, लेकिन एक उत्पादन वातावरण में जैसा कि आपको संदेह है, संदेश सिर्फ कहीं नहीं जाता है क्योंकि कुछ भी नहीं सुन रहा है।

581

आप System.Diagnostics.Debug.WriteLine(...)Console.WriteLine() के बजाय का उपयोग करते हैं, तो आप दृश्य स्टूडियो के आउटपुट विंडो में परिणाम देख सकते हैं।

+33

मैं केविन के समान प्रश्न पूछता, लेकिन यह वह जवाब है जो मैंने किया होगा के लिए देख रहा था – Zasz

+11

एक और छोटा संकेत; यदि आप एक स्वरूपित स्ट्रिंग को प्रिंट कर रहे हैं, तो डीबग के बजाय डीबग.प्रिंट का उपयोग करें। एक तर्क विवाद से बचने के लिए राइटलाइन (देखें http://social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/f27bacd9-8b86-4f65- 95ca-8b30c9e2e915)। –

+8

ध्यान दें कि आउटपुट विंडो में संदेशों को दिखाने के लिए डीबगर को संलग्न करने की आवश्यकता है। – Cosmin

23

मुझे डेटा कॉन्टेक्स्ट के लॉग आउटपुट को आउटपुट विंडो में बदलने का प्रयास करके यह प्रश्न मिला है।

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

ANND उसके बाद:: तो करने के लिए किसी और को भी ऐसा ही करने की कोशिश कर रहा है, क्या मेरे द्वारा की गई इस बनाने था dc.Log = नए DebugTextWriter() और मैं उत्पादन विंडो में सभी प्रश्नों को देख सकते हैं (डीसी डेटाकॉन्टेक्स्ट है)। http://damieng.com/blog/2008/07/30/linq-to-sql-log-to-debug-window-file-memory-or-multiple-writers

+0

क्यों न केवल स्थैतिक आवरण का उपयोग करें, यह देखते हुए कि आप पूरी तरह से स्थैतिक तरीकों को लपेट रहे हैं? 'टेक्स्टवाइटर' का विस्तार क्यों परेशान करते हैं? – Kat

+1

आप 'dc.Log = s => डीबग। राइटलाइन (ओं) का भी उपयोग कर सकते हैं;'। –

+0

एप्लिकेशन_स्टार्ट: सिस्टम। कंसोल.SetOut (नया DebugTextWriter()); –

3

ASP.NET में TraceContext वस्तु DefaultTraceListener जो मेजबान प्रक्रिया 'standard output को आउटपुट के लिए लिखते हैं:

अधिक जानकारी के लिए इस पर एक नजर डालें। Console.Write() का उपयोग करने के बजाय, यदि आप Trace.Write का उपयोग करते हैं, तो आउटपुट प्रक्रिया के मानक आउटपुट पर जाएगा।

आप एएसपी प्राप्त करने के लिए System.Diagnostics.Process ऑब्जेक्ट का उपयोग कर सकते हैं।अपनी साइट के लिए नेट प्रक्रिया और OutputDataRecieved घटना का उपयोग कर मानक आउटपुट की निगरानी करें।

3

System.Diagnostics.Debug.WriteLine(...); मेनू के दृश्य   स्टूडियो   2008.

जाओ में तत्काल खिड़की में यह हो जाता है डिबग ->विंडोज ->तत्काल:

Enter image description here

+0

मेरे विजुअल स्टूडियो 2012 में, मैंने जो कहा आपने उसका पालन किया लेकिन स्ट्रिंग 'तत्काल विंडो' के अलावा 'आउटपुट' में दिखाई दी, धन्यवाद! – WTFZane

12

यदि आप आईआईएस एक्सप्रेस का उपयोग कर रहे हैं और इसे कमांड प्रॉम्प्ट के माध्यम से लॉन्च करते हैं, तो यह DOS विंडो खुल जाएगी, और आप वहां Console.Write कथन देखेंगे।

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

इसका मतलब यह है कि आप सेल्सियस पर एक वेबसाइट निर्देशिका है:: \ परियोजनाओं \ Website1

इसलिए उदाहरण के लिए एक कमांड विंडो खुले और प्रकार मिलता है। यह आईआईएस एक्सप्रेस शुरू करेगा और आपकी वेबसाइट निर्देशिका में पृष्ठों की सेवा करेगा। यह कमांड विंडोज़ को खुल जाएगा, और आप वहां आउटपुट जानकारी देखेंगे। मान लीजिए कि आप उस में इस कोड के साथ एक फ़ाइल था, 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 

कुछ देखेंगे मैं इसे आसान बना मार्कअप में एक कोड ब्लॉक में कोड होने से है, लेकिन अपने code-behind या कहीं और किसी भी सांत्वना बयान अपने कोड में यहां भी दिखाएगा।

+0

+1 इस कारण से मैं हमेशा आईआईएस एक्सप्रेस का उपयोग करता हूं। कंसोल आउटपुट अमूल्य है, जो पीछे के अंत में जावास्क्रिप्ट कंसोल की तरह फ्रंट एंड पर उपयोग किया जाता है। फ़ाइल-आधारित सर्वर लॉग का उपयोग करने के विरोध में, समय डिबगिंग के ढेर को बचाता है। आपको "दोस्ताना" अपवाद हैंडलिंग को ओवरराइड करने की आवश्यकता नहीं है - अच्छा "ओओएस" ब्राउज़र पृष्ठ रखें, और केवल कंसोल के अपवाद को आउटपुट करें, देखना आसान है। –

1

यदि आप डीबग विंडो में देखते हैं तो आपको console.writelines दिखाई देगी।

0

यह IISExpress आने पर हर किसी के लिए भ्रमित है। कंसोल संदेशों को पढ़ने के लिए कुछ भी नहीं है। तो उदाहरण के लिए, एएसपीकोर एमवीसी ऐप्स में यह appsettings.json का उपयोग करके कॉन्फ़िगर करता है जो कि यदि आप IISExpress का उपयोग कर रहे हैं तो कुछ भी नहीं करता है।

अभी के लिए आप केवल loggerFactory.AddDebug (LogLevel.Debug) जोड़ सकते हैं; अपने कॉन्फ़िगर अनुभाग में और यह आपको कम से कम डीबग आउटपुट विंडो में अपने लॉग दिखाएगा।

अच्छी खबर कोर 2.0 यह सब बदल रहा है जाएगा: https://github.com/aspnet/Announcements/issues/255

संबंधित मुद्दे