2010-08-16 57 views
10

ngoại lệ ghi nhật ký đây là mã bên dưới được sử dụng để ghi ngoại lệ trong tệp văn bản. ở đây tôi chỉ nhận được thông báo lỗi.ngoại lệ ghi nhật ký trong C#

nhưng nó không cho tôi biết trường hợp ngoại lệ xảy ra ở dòng nào. sẽ có bất kỳ onr nào cho tôi biết howi có thể đạt được điều đó để tôi nhận được ngay cả số dòng nơi ngoại lệ xảy ra.

try 
    { 

    } 
    catch (Exception ex) 
    { 
     Console.WriteLine(ex.Message); 
     } 

    #region WriteLogError 
     /// <summary> 
     /// Write an error Log in File 
     /// </summary> 
     /// <param name="errorMessage"></param> 
     public void WriteLogError(string errorMessage) 
     { 
      try 
      { 
       string path = "~/Error/" + DateTime.Today.ToString("dd-mm-yy") + ".txt"; 
       if (!File.Exists(System.Web.HttpContext.Current.Server.MapPath(path))) 
       { 
        File.Create(System.Web.HttpContext.Current.Server.MapPath(path)).Close(); 
       } 
       using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path))) 
       { 
        w.WriteLine("\r\nLog Entry : "); 
        w.WriteLine("{0}", DateTime.Now.ToString(CultureInfo.InvariantCulture)); 
        string err = "Error in: " + System.Web.HttpContext.Current.Request.Url.ToString() + 
            ". Error Message:" + errorMessage; 
        w.WriteLine(err); 
        w.WriteLine("__________________________"); 
        w.Flush(); 
        w.Close(); 
       } 
      } 
      catch (Exception ex) 
      { 
       WriteLogError(ex.Message); 
      } 

     } 

     #endregion 
+0

Một lưu ý phụ, mã này là * không * thread-safe và IIS là môi trường đa luồng. –

+5

Gọi đệ quy WriteLogError() bên trong khối catch của bạn là một ý tưởng khá xấu ... – jeroenh

+0

@jeroenh: Thất bại trong quá trình ghi nhật ký không thể được báo cáo với nhiều lần đăng nhập tương tự. Một cách khác là sử dụng Nhật ký Sự kiện, đây là một sự đau đớn nhưng hữu ích. Khác là hoặc là âm thầm bỏ qua nó hoặc người nào khác giết quá trình. –

Trả lời

25

tôi thấy rằng cách dễ nhất để đăng nhập ngoại lệ trong C# là để gọi ToString() phương pháp:

try 
{ 

} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.ToString()); 
} 

này thường mang đến cho cung cấp cho bạn tất cả các thông tin cần thiết như thông báo lỗi và các vết đống, cộng bất kỳ thông tin ngữ cảnh cụ thể ngoại lệ nào. (tuy nhiên lưu ý rằng dấu vết ngăn xếp sẽ chỉ hiển thị cho bạn các tệp nguồn và số dòng nếu bạn đã biên dịch ứng dụng của mình bằng thông tin gỡ lỗi)

Cần lưu ý rằng việc nhìn thấy một dấu vết ngăn xếp đầy đủ có thể là công khai cho người dùng và vì vậy bất cứ khi nào có thể, bạn nên cố gắng xử lý các ngoại lệ và in ra một thông báo lỗi thân thiện hơn.

Ghi chú khác - bạn nên thay thế phương thức WriteLogError bằng khung ghi nhật ký đầy đủ tính năng (chẳng hạn như Log4Net) thay vì cố gắng tự viết.

Phương pháp ghi nhật ký của bạn không phải là chủ đề an toàn (tệp nhật ký của bạn có thể sẽ kết thúc với thông điệp tường trình được xen kẽ với nhau) và cũng không nên tự gọi nếu bạn bắt ngoại lệ - điều này có nghĩa là bất kỳ ngoại lệ nào xảy ra trong khi lỗi ghi nhật ký có thể sẽ gây khó khăn cho việc chẩn đoán ngoại lệ StackOverflow.

Tôi có thể đề xuất cách khắc phục những điều đó, tuy nhiên bạn sẽ được phục vụ tốt hơn nhiều chỉ bằng cách sử dụng khung đăng nhập thích hợp.

+0

Lời khuyên tốt về việc sử dụng log4net. Đó là cách đơn giản nhất để tránh những vấn đề an toàn chủ đề này. –

+0

Mặc dù tôi có thể đề xuất NLog ngay bây giờ, thay vì log4net.Điều đó nói rằng, cả hai đều tuyệt vời! – davewasthere

+1

@davewasthere [Serilog] (https://serilog.net/) là khung đăng nhập mới của tôi được lựa chọn – Justin

7

Chỉ cần đăng nhập ToString(). Nó không chỉ cung cấp cho bạn dấu vết ngăn xếp, nhưng nó cũng sẽ bao gồm các ngoại lệ bên trong.

+1

Xin lưu ý rằng anh ta cũng cần phải phân phối các biểu tượng gỡ lỗi, nếu anh ta muốn các đồ lót (Nhưng tôi nghĩ rằng chúng có thể được sáp nhập vào exe bằng cách sử dụng ilmerge). – Bobby

+1

@Bobby: số dòng là tốt đẹp, nhưng một dấu vết ngăn xếp thường xuyên sẽ ít nhất là cung cấp cho tên phương pháp, và đó thường là rất nhiều. –

+0

Đúng, nhưng anh ta đã yêu cầu họ một cách rõ ràng. – Bobby

4

Ngoài ra, khi bạn triển khai xây dựng bản phát hành mã của bạn vào môi trường sản xuất chẳng hạn, đừng quên bao gồm tệp .pdb trong gói phát hành. Bạn cần tệp đó để lấy số dòng của mã ngoại trừ (xem How much information do pdb files contain? (C#/.NET))

+0

Vì vậy, đó là những gì họ đang có. – Lucky

Các vấn đề liên quan