Làm cách nào để đăng nhập C # mà không cần sử dụng thư viện của bên thứ ba? [đóng cửa]


92

Tôi muốn thực hiện đăng nhập vào ứng dụng của mình, nhưng không muốn sử dụng bất kỳ khuôn khổ bên ngoài nào như log4net.

Vì vậy, tôi muốn làm một cái gì đó giống như echo của DOS vào một tệp. Cách hiệu quả nhất để làm điều đó là gì?

Có cách nào để ghi nhật ký các ngoại lệ chưa được xử lý mà không sử dụng khung bên ngoài không?


1
Bạn có thể sử dụng System.Diagnostics.TraceSource được tích hợp sẵn . <br> Đây là danh sách các trình nghe theo dõi được tích hợp sẵn + FileLogTraceListener . Có rất nhiều sách hướng dẫn trên web như thế này , [hoặc sách này của Jeff Atwood] ( codinghorror.com/blog/2005/03/logging-tracelistener
HuBeZa 20/02/11

2
Tôi cảm thấy thư viện doanh nghiệp là lựa chọn tốt hơn log4net.
đóiMind

Nếu bạn chỉ tìm cách ghi nhật ký bảng điều khiển đơn giản, System.Diagnostics.Tracing có thể dành cho bạn. Trace có thể được sử dụng giống như Console (Trace.WriteLine).
Paul

Câu trả lời:


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

Để biết thêm thông tin MSDN


22
bạn nên sử dụng một usingtệp trên tệp, mặc dù vì nó là cục bộ cho một phương thức sẽ sớm bị nhúng.
markmnl

19
Cũng nên nhớ rằng khi file.WriteLine(lines);ném một ngoại lệ, mã sẽ không bao giờ trúng file.Close();. Việc sử dụng usingtương đương với try { // using block } finally { // Dispose }. Điều này có nghĩa là đối tượng sẽ bị xử lý ngay cả khi mã bên trong usingkhối ném ra một ngoại lệ,
Memet Olsen

6
Điều gì sẽ xảy ra nếu phương thức này được gọi lại trước khi ghi nhật ký hoàn tất? Bạn sẽ gặp lỗi - Quá trình không thể truy cập tệp 'C: \ test.txt' vì nó đang được sử dụng bởi một quá trình khác. Có ai biết xung quanh vấn đề này?
Mike Sportsman

23

Tôi không muốn sử dụng bất kỳ khuôn khổ bên ngoài nào như log4j.net.

Tại sao? Log4net có thể sẽ giải quyết hầu hết các yêu cầu của bạn. Ví dụ kiểm tra lớp này: RollingFileAppender .

Log4net được ghi chép đầy đủ và có hàng nghìn tài nguyên và trường hợp sử dụng trên web.


3
lý do là tôi chưa bao giờ sử dụng bất kỳ libs bên ngoài trong .net, vì vậy đầu tiên tôi cần phải học cách để làm điều đó;)
IAdapter

4
Chỉ cần thêm tham chiếu vào dự án của bạn và đặt một số cấu hình xml - nó thực sự dễ dàng. Hướng dẫn của Google cho log4net và chọn cái phù hợp nhất cho bạn.
empi

23
Sử dụng Nuget. Sử dụng thư viện bên ngoài sẽ trở thành một làn gió
heneryville

36
Tại sao rất nhiều ủng hộ? Câu hỏi nói rõ hai lần OP không muốn sử dụng một khuôn khổ bên ngoài và đề cập rõ ràng là không muốn Log4net. Chắc chắn đây phải là một bình luận, không phải là một câu trả lời?
RyanfaeScotland,

9
@RyanfaeScotland Bạn nói đúng, có thể nó sẽ không phù hợp với OP nhưng xin đừng quên rằng đây là một trang web công cộng. Vì tiêu đề của Câu hỏi chỉ nêu "Cách đăng nhập c #", nên những người như tôi, những người thích sử dụng bất kỳ thư viện nào cũng sẽ đến đây và thấy câu trả lời này hữu ích. Trên thực tế, chủ đề này là kết quả đầu tiên khi tôi tìm kiếm "c # logging" trên Google.
swenzel

18

Bạn có thể ghi trực tiếp vào nhật ký sự kiện. Kiểm tra các liên kết sau:
http://support.microsoft.com/kb/307024
http://msdn.microsoft.com/en-us/library/system.diagnostics.eventlog.aspx

Và đây là mẫu từ 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
Cách tốt nhất để sử dụng cùng một EventLog trong các lớp khác nhau là gì? Truyền nó làm tham số trong Constructor? Truy cập nó tĩnh từ một số lớp singleton? Hay bất cứ điều gì tốt hơn?
dpelisek,

15

Nếu bạn đang tìm kiếm một cách thực sự đơn giản để ghi nhật ký, bạn có thể sử dụng một lớp lót này. Nếu tệp không tồn tại, nó sẽ được tạo.

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

Vấn đề với giải pháp này là nó thêm hoạt động IO. Vì vậy, sử dụng nó không được khuyến cáo cho các hoạt động khai thác gỗ thuật toán batch
Rami Yampolsky

@RamiYampolsky, tôi không hiểu ý bạn.
dan-gph

@ dan-gph Nếu bạn triển khai một số mã thực hiện nhiều hoạt động của CPU, trong trường hợp ghi nhật ký trong khi mã này, bạn sẽ "lãng phí" thời gian dành cho việc ghi nhật ký thay vì thuật toán thực tế mà bạn cố gắng triển khai. Vì vậy, bạn thích "lãng phí" thời gian càng ngắn càng tốt. Thực hiện thao tác IO như trong ví dụ trên thực sự rất lâu, vì vậy nếu bạn có nhiều lệnh ghi nhật ký trong mã của mình, nó có thể khiến toàn bộ quá trình thực thi của bạn chậm hơn khoảng 1000 lần!
Rami Yampolsky

@RamiYampolsky, tôi vừa tạo vòng lặp mã đó 100.000 lần và mất 10 giây. Vì vậy, đó là 10.000 mục nhật ký mỗi giây, tức là 0,01 micro giây cho mỗi mục nhập. Nếu bạn ghi lại 10 thứ trong 1 giây, điều đó sẽ mất 0,1 micro giây. Vì vậy, không, đó không phải là quá nhiều chi phí.
dan-gph,

@ dan-gph Câu trả lời của tôi liên quan đến các trường hợp sử dụng khác nhau. Cố gắng thực hiện vòng lặp 100.000 lần để thực hiện một số phép tính cho đơn giản, chỉ cần thực hiện tổng + = i và sau đó thực hiện nhật ký. Hãy thử nó có và không có nhật ký
Rami Yampolsky

7

Tôi đã từng viết nhật ký lỗi của riêng mình cho đến khi tôi phát hiện ra ELMAH . Tôi chưa bao giờ có thể hoàn thiện phần gửi email hoàn hảo như ELMAH.


Tôi sẽ xem xét nó, vì lý do của tôi, vui lòng kiểm tra bình luận của tôi.
IAdapter

ELMAH nói thẳng đến mức nó thậm chí còn không vui chút nào, bạn có thể thả nó vào thêm một vài dòng vào cấu hình web của bạn và nó đang hoạt động.
jonezy

Ngoài ra, về yêu cầu của bạn về việc biết khi nào ứng dụng của bạn sắp / bắt đầu nổ tung, tôi thấy elmah tốt hơn hầu hết các ứng dụng khác vì nó có khả năng gửi email, vì vậy, miễn là máy chủ hoạt động, bạn sẽ nhận được email lỗi từ elmah.
jonezy

6

Nếu bạn muốn ở gần .NET, hãy xem Khối ứng dụng ghi nhật ký thư viện doanh nghiệp . Nhìn đây . Hoặc để có hướng dẫn bắt đầu nhanh, hãy kiểm tra điều này . Tôi đã sử dụng Khối ứng dụng xác thực từ Thư viện Doanh nghiệp và nó thực sự phù hợp với nhu cầu của tôi và rất dễ "kế thừa" (cài đặt nó và làm mới nó!) Trong dự án của bạn.


4

Nếu bạn muốn ghi nhật ký lỗi tùy chỉnh của riêng mình, bạn có thể dễ dàng viết mã của riêng mình. Tôi sẽ cung cấp cho bạn một đoạn trích từ một trong những dự án của tôi.

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

Sau đó, để thực sự ghi vào nhật ký lỗi, chỉ cần ghi ( qlà ngoại lệ bắt được)

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

7
Bạn có biết rằng bạn sẽ bỏ lỡ mục nhập đầu tiên khi tệp chưa tồn tại?
oɔɯǝɹ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.