Console.WriteLine ASP.NET में कहाँ जाता है?


313

एक J2EE एप्लिकेशन में (जैसे वेबसेफ़र में एक रनिंग), जब मैं उपयोग करता हूं System.out.println(), तो मेरा टेक्स्ट स्टैंडर्ड आउट हो जाता है, जिसे वेबस्फीयर एडमिन कंसोल द्वारा एक फाइल में मैप किया जाता है।

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

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


यह वास्तव में ASP.NET वर्कर प्रक्रिया के STDOUT में जाएगा। जहां यह इंगित किया गया है, मुझे यकीन नहीं है।
फ्लायस्वत

2
यह सवाल है - कहाँ जाना है?
केविन हाकंसन

35
स्पष्ट रूप से कोई नहीं जानता है, लेकिन हर कोई अपने उदाहरणों में इसका उपयोग करता है। wtf
जेसन

यदि आप डिबगिंग उद्देश्यों की तलाश में थे, तो मैं नीचे दिए गए @Greg बर्नहार्ड उत्तर को संदर्भित करूंगा।
राम

1
@KevinHakanson FWIW इन सभी वर्षों के बाद, किसी भी प्रक्रिया के लिए stdout को उसके माता-पिता द्वारा चुना जाता है, जिस प्रक्रिया ने इसे शुरू किया था। इस मामले में, अभिभावक IIS होगा। यह आपको सही दिशा में इशारा कर सकता है
jpaugh

जवाबों:


197

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

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

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


18
System.Diagnostics.Debug.WriteLine () का उपयोग करें यदि आप वास्तव में आउटपुट विंडो में कुछ लिखा जाना चाहते हैं, जिसे आप डिबगिंग के समय देख सकते हैं।
19 Г И О И О

743

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


45
मैं केविन के रूप में एक ही सवाल पूछा है, लेकिन यह जवाब मैं देख रहा होता है।
ज़सज

11
एक और कम संकेत; यदि आप एक स्वरूपित स्ट्रिंग को प्रिंट कर रहे हैं, तो एक तर्क संघर्ष से बचने के लिए Debug.WriteLine के बजाय Debug.Print का उपयोग करें (देखें social.msdn.microsoft.com/Forums/ar/Vsexpressvcs/thread/… )।
निकोलस रिले

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

4
क्या यह स्थानीय IIS या कुछ के लिए काम नहीं करता है? मैं अपने जीवन के लिए आउटपुट को लिखने में सक्षम नहीं हो सकता, इस तथ्य के बावजूद कि मैं इसे F5 के साथ शुरू कर रहा हूं (इसलिए डिबगर संलग्न है)। मुझे पता है कि मेरे कोड को निष्पादित किया जा रहा है क्योंकि मैं एक फ़ाइल ठीक लिख सकता हूं।
कैट

@Cosmin क्या सटीक .exe है जो मुझे VS में संलग्न करना चाहिए?
अनुग्रह

26

मैंने इस सवाल को डेटा विंडो के लॉग आउटपुट को आउटपुट विंडो में बदलने की कोशिश करके पाया है। तो वही करने की कोशिश करने वाले किसी और के लिए, जो मैंने किया है वह यह है:

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 = new 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);
रुडी

1
Application_Start: System.Console.SetOut (new DebugTextWriter ());
स्टीफन स्टीगर

और भी बेहतर, Console.SetOut (नया DebugTextWriter ());
एल्ड

18

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

इसलिए उदाहरण के लिए एक कमांड विंडो खोलें और टाइप करें:

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

यह मानता है कि आपके पास C: \ Projects \ Website1 पर एक वेबसाइट निर्देशिका है। यह IIS एक्सप्रेस शुरू करेगा और आपकी वेबसाइट निर्देशिका में पृष्ठों की सेवा करेगा। यह कमांड विंडो को खुला छोड़ देगा, और आपको वहां आउटपुट जानकारी दिखाई देगी। मान लें कि आपके पास एक फ़ाइल थी, 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 एक्सप्रेस का उपयोग करता हूं। कंसोल आउटपुट अमूल्य है, इसका उपयोग पिछले छोर पर जावास्क्रिप्ट कंसोल की तरह होता है। फ़ाइल-आधारित सर्वर लॉग का उपयोग करने के विपरीत, समय डिबगिंग के ढेर को बचाता है। आपको "अनुकूल" अपवाद हैंडलिंग को ओवरराइड करने की आवश्यकता नहीं है - अच्छा "ऊप्स" ब्राउज़र पेज रखें, और केवल कंसोल को अपवाद आउटपुट करें, यह देखना आसान है।
ingredient_15939

9

System.Diagnostics.Debug.WriteLine(...);इसे विजुअल स्टूडियो 2008 में तत्काल विंडो में जाता है ।

मेनू पर जाएं डिबग -> विंडोज -> तत्काल :

यहां छवि विवरण दर्ज करें


मेरे विज़ुअल स्टूडियो 2012 में, आपने जो कहा, उसका मैंने पालन किया, लेकिन Outputथैंक्यू के अलावा स्ट्रिंग दिखाई दिया Immediate Window!
डब्ल्यूटीएफज़ेन

6

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


5

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


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

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

अब आपके पास वीएस की "आउटपुट" विंडो में जेट्टी की तरह कंसोल आउटपुट है, और सुनिश्चित करें कि आप डिबग मोड (एफ 5) में चल रहे हैं।


0

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

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

खुशखबरी CORE 2.0 यह सब बदल जाएगा: https://github.com/aspnet/Announcements/issues/255



-3

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.