मैं 3rd पार्टी लाइब्रेरीज़ का उपयोग किए बिना C # में लॉगिंग कैसे करूं? [बन्द है]


92

मैं अपने आवेदन में लॉगिंग को लागू करना चाहूंगा, लेकिन लॉग 4नेट जैसे किसी भी बाहरी ढांचे का उपयोग नहीं करूंगा।

इसलिए मैं एक फाइल में डॉस की गूंज जैसा कुछ करना चाहूंगा । इसे करने का सबसे प्रभावी तरीका क्या है?

क्या एक बाहरी ढांचे का उपयोग किए बिना बिना किसी अपवाद के लॉग इन करने का एक तरीका है?


1
आप अंतर्निहित System.Diagnostics.TraceSource का उपयोग कर सकते हैं । <br> यहां अंतर्निहित ट्रेस श्रोताओं + FileLogTraceListener की एक सूची है । इस तरह के वेब पर कई मैनुअल हैं , [या यह जेफ एटवुड द्वारा कोडित
बीलॉग/

2
मुझे लगता है कि log4net की तुलना में एंटरप्राइज़ लाइब्रेरी बेहतर विकल्प है।
भूख लगी है

यदि आप केवल सरल कंसोल लॉगिंग की तलाश कर रहे हैं, तो System.Diagnostics.Tracing शायद आपके लिए है। ट्रेस का उपयोग कंसोल (Trace.WriteLine) की तरह किया जा सकता है।
पॉल

जवाबों:


66
public void Logger(string lines)
{
  //Write the string to a file.append mode is enabled so that the log
  //lines get appended to  test.txt than wiping content and writing the log

  using(System.IO.StreamWriter file = new System.IO.StreamWriter("c:\\test.txt", true))
  {
    file.WriteLine(lines);
  }
}

अधिक जानकारी के लिए MSDN


22
आपको एक usingफ़ाइल का उपयोग करना चाहिए , हालाँकि यह एक विधि के लिए स्थानीय है, वैसे भी जल्द ही डंप हो जाएगा।
markmnl

19
यह भी ध्यान रखें कि जब file.WriteLine(lines);कोई अपवाद फेंकता है, तो कोड कभी भी हिट नहीं होगा file.Close();। का उपयोग करना इसके लिए usingएक बराबर है try { // using block } finally { // Dispose }। इसका मतलब यह है कि ऑब्जेक्ट को usingब्लॉक के अंदर कोड के अपवाद को छोड़ देने पर भी निपटाया जाएगा ,
मेमेत ऑलसेन

6
यदि लॉगिंग पूर्ण होने से पहले इस विधि को फिर से कहा जाता है तो क्या होगा? आप एक त्रुटि उठाएंगे - यह प्रक्रिया 'C: \ test.txt' फ़ाइल तक नहीं पहुँच सकती क्योंकि इसका उपयोग दूसरी प्रक्रिया द्वारा किया जा रहा है। किसी को भी इस समस्या के आसपास पता है?
माइक स्पोर्ट्समैन

23

मैं बल्कि log4j.net की तरह किसी भी बाहरी ढांचे का उपयोग नहीं करेगा।

क्यों? Log4net शायद आपकी अधिकांश आवश्यकताओं को संबोधित करेगा। उदाहरण के लिए इस वर्ग की जाँच करें: RollingFileAppender

Log4net अच्छी तरह से प्रलेखित है और वेब पर हजारों संसाधन और उपयोग के मामले हैं।


3
इसका कारण यह है कि मैंने कभी भी नेट में किसी भी बाहरी देयता का उपयोग नहीं किया है, इसलिए मुझे सबसे पहले यह सीखने की ज़रूरत है कि इसे कैसे करना है;)
IAdcape

4
बस अपनी परियोजना का संदर्भ जोड़ें और कुछ xml कॉन्फ़िगरेशन रखें - यह वास्तव में आसान है। Log4net ट्यूटोरियल के लिए Google और जो आपके लिए सबसे अच्छा है उसे चुनें।
एम्पि

23
Nuget का उपयोग करें। बाहरी पुस्तकालयों का उपयोग करना एक हवा बन जाएगा
heneryville

36
इतने अपवित्र क्यों? प्रश्न में दो बार ओपी एक बाहरी ढांचे का उपयोग नहीं करना चाहता है और स्पष्ट रूप से Log4net नहीं चाहता है। निश्चित रूप से यह एक टिप्पणी होनी चाहिए, एक जवाब नहीं?
रायनफेस्कॉटलैंड

9
@RyanfaeScotland आप सही हैं, शायद यह ओपी के अनुरूप नहीं होगा, लेकिन कृपया यह न भूलें कि यह एक सार्वजनिक साइट है। चूंकि प्रश्न का शीर्षक केवल यह बताता है कि "सी # में लॉगिंग कैसे करें", यह भी मेरे जैसे लोग जो किसी भी पुस्तकालय का उपयोग करने से ठीक हैं वे यहां उतरेंगे और इस उत्तर को उपयोगी पाएंगे। वास्तव में, यह धागा "सी # लॉगिंग" के लिए जाने पर पहला परिणाम था।
स्वेंज़ेल

18

आप सीधे ईवेंट लॉग में लिख सकते हैं। निम्नलिखित लिंक की जाँच करें:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

और यहाँ MSDN से नमूना है:

using System;
using System.Diagnostics;
using System.Threading;

class MySample{

    public static void Main(){

        // Create the source, if it does not already exist.
        if(!EventLog.SourceExists("MySource"))
        {
             //An event log source should not be created and immediately used.
             //There is a latency time to enable the source, it should be created
             //prior to executing the application that uses the source.
             //Execute this sample a second time to use the new source.
            EventLog.CreateEventSource("MySource", "MyNewLog");
            Console.WriteLine("CreatedEventSource");
            Console.WriteLine("Exiting, execute the application a second time to use the source.");
            // The source is created.  Exit the application to allow it to be registered.
            return;
        }

        // Create an EventLog instance and assign its source.
        EventLog myLog = new EventLog();
        myLog.Source = "MySource";

        // Write an informational entry to the event log.    
        myLog.WriteEntry("Writing to event log.");

    }
}

1
विभिन्न वर्गों में एक ही EventLog का उपयोग करने के लिए सबसे अच्छा अभ्यास क्या है? इसे कंस्ट्रक्टर में पैरामीटर के रूप में पास करें? इसे कुछ एकल वर्ग से सांख्यिकीय रूप से एक्सेस करें? या कुछ बेहतर है?
dpelisek

15

यदि आप लॉग इन करने के लिए एक वास्तविक सरल तरीके की तलाश कर रहे हैं, तो आप इस एक लाइनर का उपयोग कर सकते हैं। यदि फ़ाइल मौजूद नहीं है, तो यह बनाई गई है।

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");

इस समाधान के साथ समस्या यह है कि यह आईओ ऑपरेशन जोड़ता है। इसलिए बैच एल्गोरिथ्म संचालन लॉग करने के लिए इसका उपयोग करने की अनुशंसा नहीं की जाती है
रामी यमपोलस्की

@RamiYampolsky, मुझे समझ नहीं आ रहा है कि आपका क्या मतलब है।
डैन-जीएफ

@ dan-gph यदि आप कुछ कोड कार्यान्वित करते हैं जो बहुत सारे CPU संचालन कर रहे हैं, तो इस कोड के दौरान लॉगिंग के मामले में, आप कुछ समय "बर्बाद" करते हैं जो वास्तविक एल्गोरिथम के बजाय लॉगिंग के लिए है जिसे आप कार्यान्वित करने का प्रयास करते हैं। इसलिए आप यथासंभव कम समय के लिए "बर्बाद" करना पसंद करते हैं। ऊपर दिए गए उदाहरण की तरह IO ऑपरेशन करना वास्तव में लंबा है, इसलिए यदि आपके पास अपने कोड में कई लॉगिंग कमांड हैं, तो यह आपके पूरे निष्पादन को लगभग 1000 गुना धीमा कर सकता है!
रामी यमपोलस्की

@RamiYampolsky, मैंने सिर्फ उस कोड को 100,000 बार बनाया, और इसमें 10 का समय लगा। तो वह 10,000 लॉग एंट्री प्रति सेकंड है, जो कि एंट्रेंस में 0.01 माइक्रोसेकंड है। यदि आप 1 सेकंड में 10 चीजें लॉग इन करते हैं, तो 0.1 माइक्रोसेकंड लगेगा। तो नहीं, यह बहुत अधिक उपरि नहीं है।
डैन-जीएफ

@ dan-gph विभिन्न उपयोग के मामले से संबंधित मेरा उत्तर। 100,000 बार लूप करने का प्रयास करें जो सरलता के लिए कुछ गणना करता है, बस योग + = i करें और फिर लॉग करें। इसे लॉग के साथ और उसके बिना आज़माएं
रामी यमपोलस्की

7

जब तक मैंने ELMAH की खोज नहीं की, मैं अपनी त्रुटि लॉगिंग लिखता था । मैं कभी भी ईमेलिंग भाग को पूरी तरह से नीचे लाने में सक्षम नहीं हुआ, जैसा कि एएलएमएएच करता है।


मैं इसे देखूंगा, मेरे तर्क के लिए कृपया मेरी मोनी की टिप्पणी की जांच करें।
एडॉप्टर'

ELMAH इतना सीधा आगे है यह मज़ेदार भी नहीं है, आप सचमुच इसे अपने वेब कॉन्फिगर में कुछ लाइनों में जोड़ सकते हैं और यह काम कर रहा है।
jonezy

यह भी जानने के लिए आपकी आवश्यकता के संदर्भ में कि आपका ऐप कब चालू / बंद करना है, मुझे लगता है कि एल्माह ईमेल भेजने की क्षमता के कारण अन्य लोगों की तुलना में बेहतर है, इसलिए जब तक सर्वर है तब तक आपको त्रुटि ईमेल मिलेंगे। elmah।
jonezy

6

यदि आप .NET के करीब रहना चाहते हैं तो एंटरप्राइज लाइब्रेरी लॉगिंग एप्लीकेशन ब्लॉक देखेंयहाँ देखो । या एक क्विकस्टार्ट ट्यूटोरियल के लिए इसे देखें । मैंने एंटरप्राइज़ लाइब्रेरी से सत्यापन एप्लिकेशन ब्लॉक का उपयोग किया है और यह वास्तव में मेरी आवश्यकताओं के अनुरूप है और आपकी परियोजना में "इनहेरिट" (इसे स्थापित करें और इसे फिर से शुरू करें) बहुत आसान है।


4

अगर आप अपनी खुद की कस्टम एरर लॉगिंग चाहते हैं तो आप आसानी से अपना कोड लिख सकते हैं। मैं आपको अपनी एक परियोजना से एक स्निपेट दूंगा।

public void SaveLogFile(object method, Exception exception)
{
    string location = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\FolderName\";
    try
    {
        //Opens a new file stream which allows asynchronous reading and writing
        using (StreamWriter sw = new StreamWriter(new FileStream(location + @"log.txt", FileMode.Append, FileAccess.Write, FileShare.ReadWrite)))
        {
            //Writes the method name with the exception and writes the exception underneath
            sw.WriteLine(String.Format("{0} ({1}) - Method: {2}", DateTime.Now.ToShortDateString(), DateTime.Now.ToShortTimeString(), method.ToString()));
            sw.WriteLine(exception.ToString()); sw.WriteLine("");
        }
    }
    catch (IOException)
    {
        if (!File.Exists(location + @"log.txt"))
        {
            File.Create(location + @"log.txt");
        }
    }
}

तब वास्तव में त्रुटि लॉग को लिखने के लिए बस लिखें ( qपकड़े गए अपवाद होने के नाते)

SaveLogFile(MethodBase.GetCurrentMethod(), `q`);

7
आपको पता है कि आप पहली प्रविष्टि को याद करेंगे जब फ़ाइल अभी तक मौजूद नहीं है?
o
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.