আমি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে কীভাবে সি # তে লগ ইন করব? [বন্ধ]


92

আমি আমার অ্যাপ্লিকেশনটিতে লগিং বাস্তবায়ন করতে চাই, তবে লগ 4 নেট এর মতো বাইরের কোনও ফ্রেমওয়ার্ক ব্যবহার করব না।

সুতরাং আমি কোনও ফাইলের কাছে ডসের প্রতিধ্বনি মতো কিছু করতে চাই । এটি করার সবচেয়ে কার্যকর উপায় কী?

বাইরের কাঠামোটি ব্যবহার না করে ল্যান্ডহেলড ব্যতিক্রমগুলি লগ করার কোনও উপায় আছে?


4
আপনি ব্যবহার করতে পারেন বিল্ট-ইন System.Diagnostics.TraceSource । <br> এখানে একটি তালিকা রয়েছে ট্রেস শ্রোতাকে সালে নির্মিত + + FileLogTraceListener । সেখানে ওয়েবের মাধ্যমে অনেক ম্যানুয়াল হয় ভালো , [বা জেফ অ্যাটউড এই ONE] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa

4
আমি লগ 4 নেট-এর চেয়ে এন্টারপ্রাইজ লাইব্রেরিটিকে আরও ভাল বিকল্প মনে করি।
ক্ষুধার্তমাইন্ড

আপনি যদি কেবল সাধারণ কনসোল লগিং সন্ধান করেন তবে সিস্টেম.ডায়াগনস্টিক্স rac ট্র্যাকিং সম্ভবত আপনার জন্য। ট্রেস কনসোল (ট্রেস। রাইটলাইন) এর মতো ব্যবহার করা যেতে পারে।
পল

উত্তর:


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

আরও তথ্যের জন্য এমএসডিএন


22
আপনার usingফাইলটি একটি ব্যবহার করা উচিত , যদিও এটি কোনও পদ্ধতির স্থানীয় তাই যেভাবেই তাড়াতাড়ি হ্রাস পাবে।
চিহ্নমনেল

19
এছাড়াও মনে রাখবেন যে যখন file.WriteLine(lines);কোনও ব্যতিক্রম ছোঁড়ে তখন কোডটি কখনও আঘাত করবে না file.Close();। এর ব্যবহার করা usingসমান try { // using block } finally { // Dispose }। এর অর্থ হ'ল usingব্লকের ভিতরে কোডটি যদি একটি ব্যতিক্রম ছুঁড়ে
মারে তবেও

6
লগিং সম্পূর্ণ হওয়ার আগে যদি এই পদ্ধতিটি আবার কল করা হয়? আপনি একটি ত্রুটি বাড়াবেন - প্রক্রিয়াটি 'সি: \ test.txt' ফাইলটি অ্যাক্সেস করতে পারে না কারণ এটি অন্য প্রক্রিয়া দ্বারা ব্যবহৃত হচ্ছে। কেউ কি এই সমস্যাটির আশেপাশে জানেন?
মাইক স্পোর্টসম্যান

23

আমি বরং log4j.net এর মতো বাইরের কোনও ফ্রেমওয়ার্ক ব্যবহার করব না।

কেন? লগ 4 নেট সম্ভবত আপনার প্রয়োজনীয়তার বেশিরভাগ সমাধান করবে। উদাহরণস্বরূপ এই শ্রেণিটি পরীক্ষা করুন: রোলিংফাইলে অ্যাপেন্ডেন্ডার

লগ 4 নেট ভালভাবে নথিভুক্ত এবং ওয়েবে হাজার হাজার সংস্থান এবং ব্যবহারের কেস রয়েছে।


4
কারণটি হ'ল আমি নেট থেকে কোনও বাইরের লিব ব্যবহার করি নি, তাই প্রথমে এটি কীভাবে করা যায় তা শিখতে হবে;)
আইএডাপ্টার

4
আপনার প্রকল্পে কেবলমাত্র রেফারেন্স যুক্ত করুন এবং কিছু এক্সএমএল কনফিগারেশন রাখুন - এটি সত্যই সহজ। লগ 4 নেট টিউটোরিয়ালের জন্য গুগল এবং আপনার পক্ষে সেরা একটি বেছে নিন।
এম্পি

23
নুগেট ব্যবহার করুন। বাইরের লাইব্রেরিগুলি ব্যবহার করা একটি হাওয়া হয়ে উঠবে
হ্যানারিভিল

37
এত উপভোগ কেন? প্রশ্নটি দুবার জানিয়েছে যে ওপি বাহ্যিক কাঠামো ব্যবহার করতে চায় না এবং স্পষ্টভাবে লগ 4 নেট না চাওয়ার উল্লেখ করেছে। অবশ্যই এটি একটি মন্তব্য হওয়া উচিত, উত্তর নয়?
রায়ানফায়েস্কটল্যান্ড 31'15

9
@ রায়ানফায়েস্কটল্যান্ড আপনি ঠিক বলেছেন, এটি ওপি-র উপযুক্ত নয় তবে দয়া করে ভুলে যাবেন না যে এটি একটি পাবলিক সাইট। যেহেতু প্রশ্নের শিরোনামটি কেবল "সি # লগ ইন কীভাবে করতে হবে" তে উল্লেখ করেছে, আমার মতো লোকেরা যে কোনও লাইব্রেরি ব্যবহার করে ভাল আছেন তারা এখানে অবতরণ করবেন এবং এই উত্তরটি দরকারী বলে মনে করবেন। আসলে, আমি যখন "সি # লগিং" এর জন্য গুগল করেছিলাম তখন এই থ্রেডটি প্রথম ফলাফল ছিল।
swenzel

18

আপনি সরাসরি কোনও ইভেন্ট লগে লিখতে পারেন। নিম্নলিখিত লিঙ্কগুলি পরীক্ষা করুন:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

এবং এখানে এমএসডিএন থেকে প্রাপ্ত নমুনাটি:

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.");

    }
}

4
বিভিন্ন ক্লাসে একই ইভেন্টলগ ব্যবহার করার সেরা অনুশীলন কোনটি? কনস্ট্রাক্টর হিসাবে এটি পরামিতি হিসাবে পাস? কোনও একক ক্লাস থেকে স্ট্যাটিকভাবে এটি অ্যাক্সেস করবেন? বা আরও ভাল কিছু?
dpelisek

15

আপনি যদি লগিনের জন্য কোনও সহজ সরল উপায় সন্ধান করেন তবে আপনি এই একটি লাইনার ব্যবহার করতে পারেন। যদি ফাইলটি না থাকে তবে এটি তৈরি করা হবে।

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

এই সমাধানটির সাথে সমস্যাটি হ'ল এটি আইও অপারেশন যুক্ত করে। সুতরাং ব্যাচ অ্যালগরিদম অপারেশনগুলিতে লগ করার জন্য এটি ব্যবহার করার পরামর্শ দেওয়া হয় না
রামি ইয়াম্পলস্কি

@ র্যামি্যাম্পলস্কি, আপনার অর্থ কী তা আমি বুঝতে পারি না।
ড্যান-জিএফ

@ ড্যান-জিএফ আপনি যদি কিছু কোড প্রয়োগ করেন যা প্রচুর সিপিইউ অপারেশন করছে, এই কোড চলাকালীন লগিংয়ের ক্ষেত্রে, আপনি প্রয়োগ করার চেষ্টা করছেন এমন সত্যিকারের অ্যালগরিদমের পরিবর্তে লগিংয়ের জন্য কিছুটা সময় "নষ্ট" করেন। সুতরাং আপনি যতটা সম্ভব অল্প সময় "নষ্ট" করতে পছন্দ করেন। উপরের উদাহরণের মতো আইও অপারেশন করা সত্যিই দীর্ঘ, সুতরাং আপনার কোডে আপনার যদি প্রচুর লগিং কমান্ড থাকে তবে এটি আপনার পুরো সম্পাদনাকে প্রায় 1000 গুণ ধীর করে দিতে পারে!
রামি ইয়াম্পলস্কি

@ র্যামি্যাম্পলস্কি, আমি এই কোড লুপটি মাত্র 100,000 বার করেছি এবং এটি 10 ​​সেকেন্ডে নিয়েছে। সুতরাং যে প্রতি সেকেন্ড 10,000 লগ এন্ট্রি, যা প্রতি এন্ট্রি 0.01 মাইক্রোসেকেন্ড হয়। আপনি যদি 1 সেকেন্ডে 10 টি জিনিস লগইন করেন তবে এটি 0.1 মাইক্রোসেকেন্ড নিতে পারে। সুতরাং না, এটি মোটেই বেশি ওভারহেড নয়।
ড্যান-জিএফ

@ ড্যান-জিএফ আমার উত্তর বিভিন্ন ব্যবহারের ক্ষেত্রে সম্পর্কিত। 100,000 বার লুপ করার চেষ্টা করুন যা সরলতার জন্য কিছু গণনা করে, কেবল যোগফল = = i করে লগ করুন। লগ সহ এবং এর বাইরে এটি ব্যবহার করে দেখুন
রামি ইয়াম্পলস্কি

7

আমি ELMAH আবিষ্কার না করা অবধি আমার নিজের ত্রুটি লগিং লিখতাম । ELMAH এর মতো আমি পুরোপুরি পুরোপুরি ইমেলিং অংশটি পেতে পারিনি।


আমি এটি তাকান করব, আমার যুক্তির জন্য দয়া করে আমার এমির মন্তব্যটি চেকআউট করুন।
আইএডাপ্টার

ELMAH এত সোজা এগিয়ে এটি মজাদারও নয়, আপনি আক্ষরিকভাবে এটিকে আপনার ওয়েব কনফিগারেশনে কয়েকটি লাইন যুক্ত করতে পারেন এবং এটি কাজ করছে।
jonezy

আপনার অ্যাপ্লিকেশনটি কখন ফুঁকতে শুরু করবে / শুরু হবে তা জেনে রাখার জন্য আপনার প্রয়োজনীয়তার ক্ষেত্রে আমি দেখতে পেয়েছি যে ইমেলগুলি প্রেরণের দক্ষতার কারণে এলমা বেশিরভাগের চেয়ে ভাল, তাই যতক্ষণ সার্ভারটি থাকবে ততক্ষণ আপনি ত্রুটিযুক্ত ইমেলগুলি পেয়ে যাবেন এলমাহ।
jonezy

6

আপনি যদি নেট থেকে কাছে থাকতে চান তবে এন্টারপ্রাইজ লাইব্রেরি লগিং অ্যাপ্লিকেশন ব্লকটি পরীক্ষা করে দেখুন । দেখুন এখানে । অথবা একটি দ্রুতশুরু জন্য চেক টিউটোরিয়াল এই । আমি এন্টারপ্রাইজ লাইব্রেরি থেকে বৈধকরণ অ্যাপ্লিকেশন ব্লকটি ব্যবহার করেছি এবং এটি সত্যই আমার প্রয়োজনগুলির পক্ষে উপযুক্ত এবং আপনার প্রকল্পে "উত্তরাধিকার সূত্রে" ইনস্টল করা (এটি ইনস্টল করুন এবং এটি পুনরায় সংশোধন করুন!) খুব সহজ।


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
আপনি সচেতন যে ফাইলটির অস্তিত্ব নেই যখন আপনি প্রথম এন্ট্রি মিস করবেন?
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.