3. parti kitaplıkları kullanmadan C # ile nasıl oturum açabilirim? [kapalı]


92

Uygulamamda günlük kaydını uygulamak istiyorum, ancak log4net gibi herhangi bir dış çerçeveyi kullanmak istemiyorum.

Bu yüzden DOS'un bir dosyaya yankısı gibi bir şey yapmak istiyorum . Bunu yapmanın en etkili yolu nedir?

Dış çerçeve kullanmadan günlüğe kaydedilen işlenmemiş istisnaları kaydetmenin bir yolu var mı?


1
Sen yerleşik kullanabilirsiniz System.Diagnostics.TraceSource . <br> Burada bir listesi eser dinleyicileri inşa + FileLogTraceListener . Web üzerinde bunun gibi pek çok kılavuz var [veya Jeff Atwood'un bu kitabı
HuBeZa

2
Kurumsal kitaplığın log4net'ten daha iyi bir seçenek olduğunu düşünüyorum.
hungryMind

Yalnızca basit konsol günlüğü arıyorsanız, System.Diagnostics.Tracing muhtemelen tam size göre. Trace, Console (Trace.WriteLine) gibi kullanılabilir.
Paul

Yanıtlar:


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

Daha fazla bilgi için MSDN


22
usingbir yöntem için yerel olduğu için yine de bir dosya üzerinde kullanmalısınız .
markmnl

19
Ayrıca file.WriteLine(lines);, bir istisna attığında kodun asla çarpmayacağını da unutmayın file.Close();. Kullanmak usingiçin eşdeğerdir try { // using block } finally { // Dispose }. Bu, usingbloğun içindeki kod bir istisna atsa bile nesnenin atılacağı anlamına gelir ,
Memet Olsen

6
Ya bu yöntem günlük kaydı tamamlanmadan önce tekrar çağrılırsa? Bir hata ortaya çıkarırsınız - İşlem, başka bir işlem tarafından kullanıldığından 'C: \ test.txt' dosyasına erişemez. Bu sorunu bilen var mı?
Mike Sportsman

23

Log4j.net gibi herhangi bir dış çerçeve kullanmamayı tercih ederim.

Neden? Log4net muhtemelen ihtiyaçlarınızın çoğunu karşılayacaktır. Örneğin şu sınıfı kontrol edin: RollingFileAppender .

Log4net iyi belgelenmiştir ve web'de binlerce kaynak ve kullanım durumu vardır.


3
bunun nedeni,
.net'te

4
Sadece projenize referans ekleyin ve biraz xml yapılandırması yerleştirin - bu gerçekten çok kolay. Log4net eğitimi için Google ve sizin için en iyi olanı seçin.
empi

23
Nuget'i kullan. Dışarıdaki kütüphaneleri kullanmak çocuk oyuncağı olacak
heneryville

37
Neden bu kadar çok olumlu oy var? Soru iki kez OP'nin harici bir çerçeve kullanmak istemediğini ve Log4net istemediğinden açıkça bahsettiğini belirtir. Elbette bu bir cevap değil, bir yorum olmalı?
RyanfaeScotland

9
@RyanfaeScotland Haklısın, belki OP'ye uymaz ama lütfen bunun halka açık bir site olduğunu unutma. Sorunun başlığı yalnızca "c # 'da oturum açma nasıl yapılır" şeklinde olduğundan, benim gibi herhangi bir kitaplığı kullanmakta sorun yaşayan kişiler de buraya gelecek ve bu yanıtı faydalı bulacaktır. Aslında bu iş parçacığı, "c # logging" için google'da arama yaptığım ilk sonuçtu.
swenzel

18

Doğrudan bir olay günlüğüne yazabilirsiniz. Aşağıdaki bağlantıları kontrol edin:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

Ve işte MSDN'den örnek:

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
Aynı EventLog'u farklı sınıflarda kullanmak için en iyi uygulama nedir? Oluşturucu'da parametre olarak iletilsin mi? Bir singleton sınıfından statik olarak erişilsin mi? Veya daha iyi bir şey?
dpelisek

15

Günlük tutmanın gerçekten basit bir yolunu arıyorsanız, bu tek astarı kullanabilirsiniz. Dosya yoksa oluşturulur.

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

Bu çözümle ilgili sorun, IO operasyonu eklemesidir. Bu nedenle, toplu algoritma işlemlerini günlüğe kaydetmek için kullanılması önerilmez
Rami Yampolsky

@RamiYampolsky, ne demek istediğini anlamıyorum.
dan-gph

@ dan-gph Çok fazla CPU işlemi yapan bir kod uygularsanız, bu kod sırasında oturum açma durumunda, uygulamaya çalıştığınız gerçek algoritma yerine günlüğe kaydetme için biraz zaman "harcarsınız". Yani mümkün olduğunca kısa süre "boşa harcamayı" tercih edersiniz. Yukarıdaki örnekte olduğu gibi IO işlemini yapmak gerçekten uzun, bu nedenle kodunuzda çok sayıda günlük komutunuz varsa, tüm yürütmenizi yaklaşık 1000 kat daha yavaş hale getirebilir!
Rami Yampolsky

@RamiYampolsky, bu kod döngüsünü 100.000 kez yaptım ve 10 saniye sürdü. Yani saniyede 10.000 günlük girişi, yani giriş başına 0.01 mikrosaniye. 1 saniyede 10 şey kaydederseniz, bu 0,1 mikrosaniye sürer. Yani hayır, bu hiç de ek yük değil.
dan-gph

@ dan-gph Cevabım farklı kullanım durumları ile ilgili. Basitlik için bazı hesaplamalar yapan 100.000 kez döngü yapmaya çalışın, sadece + = i'yi yapın ve ardından günlüğü yapın.
Günlükle

7

ELMAH'ı keşfedene kadar kendi hata günlüğümü yazardım . E-posta bölümünü ELMAH'ın yaptığı kadar mükemmel bir şekilde alamadım.


Ona bakacağım, gerekçem için lütfen imparatorluğumun yorumunu kontrol edin.
IAdapter

ELMAH o kadar basit ki, komik bile değil, kelimenin tam anlamıyla web yapılandırmanıza birkaç satır ekleyebilir ve işe yarıyor.
jonezy

Ayrıca, uygulamanızın ne zaman patlayacağını / patlamaya başladığını bilme gereksiniminiz açısından, elmah'ın e-posta gönderme yeteneği nedeniyle diğerlerinden daha iyi olduğunu buldum, bu nedenle sunucu açık olduğu sürece hata e-postaları alacaksınız elmah.
jonezy

6

Eğer kalmak istiyorsan yakın .NET için check-out Enterprise Library Günlüğü Uygulama Blok . Buraya bak . Ya da bir hızlı başlangıç kontrol öğretici bu . Enterprise Library'deki Doğrulama uygulaması Bloğunu kullandım ve gerçekten ihtiyaçlarıma uyuyor ve projenizde "devralması" (kurun ve yeniden canlandırın!) Çok kolay.


4

Kendi özel Hata Kaydınızı istiyorsanız, kendi kodunuzu kolayca yazabilirsiniz. Size projelerimden birinden bir pasaj vereceğim.

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

Daha sonra hata günlüğüne yazmak için sadece yazın ( qyakalanan istisna olarak)

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

7
Dosya henüz mevcut olmadığında ilk girişi kaçıracağınızın farkında mısınız?
2013
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.