Bagaimana cara saya masuk C # tanpa menggunakan perpustakaan pihak ketiga? [Tutup]

92

Saya ingin menerapkan logging di aplikasi saya, tetapi lebih suka tidak menggunakan kerangka kerja luar seperti log4net.

Jadi saya ingin melakukan sesuatu seperti echo DOS ke file. Apa cara paling efektif untuk melakukannya?

Apakah ada cara untuk mencatat log pengecualian yang tidak tertangani tanpa menggunakan kerangka kerja luar?

IAdapter
sumber
1
Anda bisa menggunakan System.Diagnostics.TraceSource bawaan . <br> Berikut daftar listener pelacakan bawaan + FileLogTraceListener . Ada banyak manual di web seperti ini , [atau yang ini oleh Jeff Atwood] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa
2
Saya merasa perpustakaan perusahaan pilihan yang lebih baik daripada log4net.
laparMind
Jika Anda hanya mencari logging konsol sederhana, System.Diagnostics.Tracing mungkin cocok untuk Anda. Trace dapat digunakan seperti Console (Trace.WriteLine).
Paul

Jawaban:

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

Untuk informasi lebih lanjut MSDN

Brandon
sumber
22
Anda harus menggunakan usingfile, meskipun karena bersifat lokal, metode akan segera diposisikan.
markmnl
19
Juga perlu diingat bahwa saat file.WriteLine(lines);melempar pengecualian, kode tidak akan pernah mengenai file.Close();. Memanfaatkan usingadalah setara dengan try { // using block } finally { // Dispose }. Ini berarti bahwa objek akan dibuang bahkan jika kode di dalam usingblok mengeluarkan pengecualian,
Memet Olsen
6
Bagaimana jika metode ini dipanggil lagi sebelum logging selesai? Anda akan memunculkan kesalahan - Proses tidak dapat mengakses file 'C: \ test.txt' karena sedang digunakan oleh proses lain. Adakah yang tahu tentang masalah ini?
Mike Sportsman
23

Saya lebih suka tidak menggunakan kerangka kerja luar seperti log4j.net.

Mengapa? Log4net mungkin akan memenuhi sebagian besar kebutuhan Anda. Misalnya, periksa kelas ini: RollingFileAppender .

Log4net didokumentasikan dengan baik dan ada ribuan sumber daya dan kasus penggunaan di web.

empi
sumber
3
alasannya adalah saya tidak pernah menggunakan libs luar di .net, jadi saya harus terlebih dahulu mempelajari cara melakukannya;)
IAdapter
4
Cukup tambahkan referensi ke proyek Anda dan tempatkan beberapa konfigurasi xml - ini sangat mudah. Google untuk tutorial log4net dan pilih salah satu yang terbaik untuk Anda.
empi
23
Gunakan Nuget. Menggunakan perpustakaan luar akan menjadi sangat mudah
heneryville
37
Mengapa begitu banyak suara positif? Pertanyaan tersebut menyatakan dua kali OP tidak ingin menggunakan kerangka eksternal dan secara eksplisit menyebutkan tidak menginginkan Log4net. Tentunya ini harus menjadi komentar, bukan jawaban?
RyanfaeScotland
9
@RyanfaeScotland Anda benar, mungkin tidak sesuai dengan OP tapi tolong jangan lupa bahwa ini adalah situs publik. Karena judul Pertanyaan hanya menyatakan "Bagaimana melakukan logging di c #", juga orang-orang seperti saya yang tidak keberatan menggunakan library apa pun akan mendarat di sini dan menganggap jawaban ini berguna. Faktanya, utas ini adalah hasil pertama saat saya mencari "c # logging" di Google.
swenzel
18

Anda dapat menulis langsung ke log peristiwa. Periksa tautan berikut:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

Dan inilah contoh dari 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.");

    }
}
šljaker
sumber
1
Apa praktik terbaik untuk menggunakan EventLog yang sama di kelas yang berbeda? Meneruskannya sebagai parameter di Constructor? Mengaksesnya secara statis dari beberapa kelas tunggal? Atau ada yang lebih baik?
dpelisek
15

Jika Anda mencari cara yang sangat sederhana untuk log, Anda dapat menggunakan liner yang satu ini. Jika file tidak ada, itu dibuat.

System.IO.File.AppendAllText(@"c:\log.txt", "mymsg\n");
cinta hidup
sumber
Masalah dengan solusi ini adalah ia menambahkan operasi IO. Jadi menggunakannya tidak disarankan untuk mencatat operasi algoritma batch
Rami Yampolsky
@RamiYampolsky, saya tidak mengerti apa yang Anda maksud.
dan-gph
@ dan-gph Jika Anda mengimplementasikan beberapa kode yang melakukan banyak operasi CPU, dalam kasus logging selama kode ini, Anda "membuang" beberapa waktu untuk logging alih-alih algoritma sebenarnya yang Anda coba implementasikan. Jadi, Anda lebih suka "membuang" waktu sesingkat mungkin. Melakukan operasi IO seperti pada contoh di atas sangat lama, jadi jika Anda memiliki banyak perintah logging di kode Anda, ini dapat membuat seluruh eksekusi Anda sekitar 1000 kali lebih lambat!
Rami Yampolsky
@RamiYampolsky, saya baru saja membuat loop kode itu 100.000 kali, dan butuh 10 detik. Jadi itu berarti 10.000 entri log per detik, yaitu 0,01 mikrodetik per entri. Jika Anda mencatat 10 hal dalam 1 detik, itu akan membutuhkan 0,1 mikrodetik. Jadi tidak, itu sama sekali bukan overhead.
dan-gph
@ dan-gph Jawaban saya terkait untuk kasus penggunaan yang berbeda. Coba lakukan loop 100.000 kali yang membuat beberapa perhitungan untuk kesederhanaan, cukup lakukan penjumlahan + = i dan kemudian lakukan log. Cobalah dengan dan tanpa log
Rami Yampolsky
7

Saya biasa menulis catatan kesalahan saya sendiri sampai saya menemukan ELMAH . Saya tidak pernah bisa mendapatkan bagian email sesempurna ELMAH.

jonezy
sumber
Saya akan melihatnya, untuk alasan saya silakan periksa komentar empi saya.
IAdapter
ELMAH sangat mudah, bahkan tidak lucu, Anda benar-benar dapat memasukkannya ke dalam menambahkan beberapa baris ke konfigurasi web Anda dan itu berfungsi.
jonezy
Juga dalam hal kebutuhan Anda untuk mengetahui kapan aplikasi Anda akan / mulai meledak, saya menemukan elmah lebih baik daripada kebanyakan orang lain karena kemampuannya untuk mengirim email, jadi selama server aktif Anda akan mendapatkan email kesalahan dari elmah.
jonezy
6

Jika Anda ingin tetap dekat dengan .NET, periksa Blok Aplikasi Pencatatan Perpustakaan Perusahaan . Lihat di sini . Atau untuk tutorial memulai cepat, periksa ini . Saya telah menggunakan Blok aplikasi Validasi dari Perpustakaan Perusahaan dan itu benar-benar sesuai dengan kebutuhan saya dan sangat mudah untuk "mewarisi" (menginstalnya dan menyusun ulang!) Dalam proyek Anda.

Bernoulli IT
sumber
4

Jika Anda menginginkan Error Logging kustom Anda sendiri, Anda dapat dengan mudah menulis kode Anda sendiri. Saya akan memberi Anda cuplikan dari salah satu proyek saya.

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

Kemudian untuk benar-benar menulis ke log kesalahan cukup tulis ( qmenjadi pengecualian yang tertangkap)

SaveLogFile(MethodBase.GetCurrentMethod(), `q`);
MisdartedPenguin
sumber
7
Anda sadar bahwa Anda akan melewatkan entri pertama jika file belum ada?
oɔɯǝɹ