ฉันจะเข้าสู่ระบบ C # โดยไม่ใช้ไลบรารีของบุคคลที่สามได้อย่างไร [ปิด]


92

ฉันต้องการใช้การเข้าสู่ระบบในแอปพลิเคชันของฉัน แต่ไม่ต้องการใช้เฟรมเวิร์กภายนอกเช่น log4net

ดังนั้นฉันต้องการทำบางอย่างเช่นเสียงสะท้อนของ DOS ไปยังไฟล์ วิธีที่มีประสิทธิภาพมากที่สุดคืออะไร?

มีวิธีบันทึกข้อยกเว้นที่ไม่สามารถจัดการได้โดยไม่ต้องใช้เฟรมเวิร์กภายนอกหรือไม่?


1
คุณสามารถใช้ในตัวSystem.Diagnostics.TraceSource . ดาวน์โหลดนี่คือรายการของที่สร้างขึ้นในฟังร่องรอย + FileLogTraceListener มีคู่มือมากมายบนเว็บเช่นนี้ [หรืออันนี้โดย Jeff Atwood] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa

2
ฉันรู้สึกว่าห้องสมุดองค์กรเป็นตัวเลือกที่ดีกว่า log4net
HungryMind

หากคุณกำลังมองหาการบันทึกคอนโซลแบบง่ายๆ System.Diagnostics.Tracing อาจเหมาะสำหรับคุณ Trace สามารถใช้เช่น Console (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บล็อกจะมีข้อยกเว้นก็ตาม
Memet Olsen

6
จะเกิดอะไรขึ้นหากวิธีนี้ถูกเรียกอีกครั้งก่อนที่การบันทึกจะเสร็จสมบูรณ์ คุณจะเพิ่มข้อผิดพลาด - กระบวนการไม่สามารถเข้าถึงไฟล์ 'C: \ test.txt' ได้เนื่องจากถูกใช้โดยกระบวนการอื่น ไม่มีใครรู้ว่าปัญหานี้?
Mike Sportsman

23

ฉันไม่อยากใช้เฟรมเวิร์กภายนอกเช่น log4j.net

ทำไม? Log4net อาจตอบสนองความต้องการส่วนใหญ่ของคุณ ยกตัวอย่างเช่นการตรวจสอบชั้นนี้: RollingFileAppender

Log4net ได้รับการบันทึกไว้เป็นอย่างดีและมีแหล่งข้อมูลและกรณีการใช้งานมากมายบนเว็บ


3
เหตุผลก็คือฉันไม่เคยใช้ libs ภายนอกใด ๆ ใน. net ดังนั้นฉันต้องเรียนรู้วิธีการทำก่อน;)
IAdapter

4
เพียงเพิ่มการอ้างอิงไปยังโครงการของคุณและวางการกำหนดค่า xml - มันง่ายมาก Google สำหรับการสอน log4net และเลือกสิ่งที่ดีที่สุดสำหรับคุณ
empi

23
ใช้ Nuget การใช้ห้องสมุดภายนอกจะกลายเป็นเรื่องง่าย
heneryville

37
เหตุใดจึงมีการโหวตมากขึ้น? คำถามระบุว่า OP สองครั้งไม่ต้องการใช้กรอบภายนอกและกล่าวถึงอย่างชัดเจนว่าไม่ต้องการ Log4net แน่นอนว่านี่ควรเป็นความคิดเห็นไม่ใช่คำตอบ?
RyanfaeScotland

9
@RyanfaeScotland คุณพูดถูกอาจจะไม่เหมาะกับ OP แต่อย่าลืมว่านี่เป็นเว็บไซต์สาธารณะ เนื่องจากหัวข้อคำถามระบุเพียง "วิธีการเข้าสู่ระบบ c #" คนอย่างฉันที่ใช้ห้องสมุดใด ๆ ก็เข้ามาที่นี่และพบว่าคำตอบนี้มีประโยชน์ อันที่จริงชุดข้อความนี้เป็นผลลัพธ์แรกเมื่อฉัน googled สำหรับ "c # logging"
swenzel

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 เดียวกันในคลาสต่างๆคืออะไร ส่งเป็นพารามิเตอร์ใน Constructor? เข้าถึงแบบคงที่จากคลาสซิงเกิลตันหรือไม่? หรืออะไรดีกว่า?
dpelisek

15

หากคุณกำลังมองหาวิธีง่ายๆในการบันทึกคุณสามารถใช้ซับนี้ได้ หากไม่มีไฟล์แสดงว่าไฟล์นั้นถูกสร้างขึ้น

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

ปัญหาในการแก้ปัญหานี้คือเพิ่มการดำเนินการ IO ดังนั้นจึงไม่แนะนำให้ใช้สำหรับการบันทึกการทำงานของอัลกอริทึมแบทช์
Rami Yampolsky

@RamiYampolsky ฉันไม่เข้าใจว่าคุณหมายถึงอะไร
dan-gph

@ dan-gph หากคุณติดตั้งโค้ดบางตัวซึ่งทำงานกับ CPU เป็นจำนวนมากในกรณีที่มีการบันทึกระหว่างโค้ดนี้คุณจะ "เสียเวลา" ไปกับการบันทึกแทนที่จะใช้อัลกอริทึมจริงที่คุณพยายามนำไปใช้ คุณจึงชอบที่จะ "เสียเวลา" ให้สั้นที่สุด การดำเนินการ IO ดังตัวอย่างข้างต้นนั้นใช้เวลานานมากดังนั้นหากคุณมีคำสั่งการบันทึกจำนวนมากในโค้ดของคุณก็สามารถทำให้การดำเนินการทั้งหมดของคุณช้าลงประมาณ 1,000 เท่า
Rami Yampolsky

@RamiYampolsky ฉันเพิ่งสร้างรหัสวนซ้ำ 100,000 ครั้งและใช้เวลา 10 วินาที นั่นคือ 10,000 รายการบันทึกต่อวินาทีซึ่งเท่ากับ 0.01 ไมโครวินาทีต่อรายการ หากคุณบันทึกข้อมูล 10 อย่างใน 1 วินาทีจะใช้เวลา 0.1 ไมโครวินาที ดังนั้นไม่นั่นคือค่าใช้จ่ายที่ไม่มากเลย
dan-gph

@ dan-gph คำตอบของฉันเกี่ยวข้องกับกรณีการใช้งานที่แตกต่างกัน ลองทำวนซ้ำ 100,000 ครั้งซึ่งทำให้การคำนวณบางอย่างง่ายขึ้นเพียงแค่ทำ sum + = i แล้วทำการบันทึก ลองใช้แบบมีและไม่มีบันทึก
Rami Yampolsky

7

ผมใช้ในการเขียนบันทึกข้อผิดพลาดของตัวเองจนกว่าฉันค้นพบELMAH ฉันไม่เคยได้รับส่วนการส่งอีเมลที่สมบูรณ์แบบเท่าที่ ELMAH ทำได้


ฉันจะดูมันด้วยเหตุผลของฉันโปรดตรวจสอบความคิดเห็นของ Empi ของฉัน
IAdapter

ELMAH ตรงไปตรงมามากมันไม่ตลกเลยคุณสามารถวางมันลงในการกำหนดค่าเว็บของคุณเพียงไม่กี่บรรทัดและมันก็ใช้งานได้
ครึกครื้น

นอกจากนี้ในแง่ของความต้องการของคุณในการทราบเมื่อแอปของคุณกำลังจะ / เริ่มระเบิดฉันพบว่าเอลมาห์ดีกว่าคนอื่น ๆ ส่วนใหญ่เนื่องจากความสามารถในการส่งอีเมลตราบใดที่เซิร์ฟเวอร์ยังทำงานอยู่คุณจะได้รับอีเมลแสดงข้อผิดพลาดจาก Elmah
ครึกครื้น

6

หากคุณต้องการที่จะอยู่ใกล้กับ .NETตรวจสอบโครงการห้องสมุดเข้าสู่ระบบบล็อกโปรแกรมประยุกต์ ดูที่นี่ หรือสำหรับ QuickStart กวดวิชาตรวจสอบนี้ ฉันได้ใช้แอปพลิเคชันการตรวจสอบความถูกต้องจากไลบรารีขององค์กรและเหมาะกับความต้องการของฉันจริงๆและง่ายมากที่จะ "สืบทอด" (ติดตั้งและอ้างอิงซ้ำ!) ในโครงการของคุณ


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ɔɯǝɹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.