2008-09-29 46 views
73

Tôi đang chuyển đổi từ mã hóa trong C++ thành C#. Tôi cần phải thay thế hệ thống macro đăng nhập/báo cáo lỗi C++ của tôi với một cái gì đó tương tự trong C#.Lỗi khi đăng nhập vào C#

Trong nguồn C++ của tôi, tôi có thể viết

LOGERR ("Một số lỗi"); hoặc LOGERR ("Lỗi với đầu vào% s và% d", stringvar, intvar);

Macro & hỗ trợ mã thư viện sau đó chuyển thông báo có định dạng (có thể được biến đổi) thành cơ sở dữ liệu cùng với tệp nguồn, dòng nguồn, tên người dùng và thời gian. Các dữ liệu tương tự cũng được nhồi vào một cấu trúc dữ liệu để báo cáo sau này cho người dùng.

Có ai có đoạn mã C# hoặc con trỏ đến các ví dụ thực hiện báo cáo/ghi nhật ký lỗi cơ bản này không?

Chỉnh sửa: Lúc đó tôi hỏi câu hỏi này tôi thực sự mới với .NET và không biết System.Diagnostics.Trace. System.Diagnostics.Trace là những gì tôi cần vào thời điểm đó. Kể từ đó tôi đã sử dụng log4net trên các dự án mà các yêu cầu khai thác gỗ lớn hơn và phức tạp hơn. Chỉ cần chỉnh sửa 500 tập tin cấu hình XML dòng và log4net sẽ làm mọi thứ bạn sẽ cần :)

Trả lời

72

Rất nhiều log4net những người ủng hộ ở đây vì vậy tôi chắc chắn điều này sẽ bị bỏ qua, nhưng tôi sẽ thêm sở thích của riêng tôi:

System.Diagnostics.Trace 

này bao gồm người nghe mà nghe cho Trace() phương pháp của bạn, và sau đó viết thư cho một tệp nhật ký/cửa sổ đầu ra/nhật ký sự kiện, các khung trong khung được bao gồm là DefaultTraceListener, TextWriterTraceListenerEventLogTraceListener. Nó cho phép bạn chỉ định các cấp độ (Cảnh báo, Lỗi, Thông tin) và các loại.

Trace class on MSDN
Writing to the Event Log in a Web Application
UdpTraceListener - write log4net compatible XML messages to a log viewer such as log2console

+20

+1 Ngoài ra nhỏ, Dấu vết đang hoạt động nếu và chỉ khi bạn đã biên dịch bằng ký hiệu tiền xử lý TRACE. – user7116

+1

Một điều cần lưu ý với TextWriterTraceListener là nó không làm dấu thời gian –

+6

Bạn có thể ghi đè phương thức 'WriteLine()' trong 'TextWriterTraceListener' để đạt được khả năng tự động dập thời gian trong tệp nhật ký. Xem [bài viết CodeProject này] (http://www.codeproject.com/KB/dotnet/customnettracelisteners.aspx), phần 6. –

5

Mặc dù cá nhân tôi ghét nó, log4net có vẻ là tiêu chuẩn thực tế cho việc ghi nhật ký C#. Sử dụng mẫu:

log4net.ILog log = log4net.LogManager.GetLogger(typeof(Program)); 
log.Error(“Some error”); 
log.ErrorFormat("Error with inputs {0} and {1}", stringvar, intvar); 
+1

có vấn đề gì với log4Net? –

+12

Nó hoàn thành công việc, nhưng tôi ghét tài liệu và rất phẫn nộ vì đã dành nhiều giờ làm việc với các tập tin cấu hình và về cơ bản bay mù cho đến khi tôi có thể nhận được những thứ tương đối đơn giản theo cách tôi muốn. –

+4

Tôi đã sử dụng log4net và đánh giá cao nó là một công cụ mạnh mẽ (và NHibernate và những người khác sử dụng nó). Nhưng tôi tò mò tại sao mọi người không thích sử dụng truy tìm dựng sẵn .NET 2.0? Với các loại khác nhau của người nghe và một vài công cụ có vẻ như rất ít lộn xộn hơn log4net, đó là một cổng java. –

40

Tôi rất muốn giới thiệu xem log4Net. Điều này post bao gồm phần lớn những gì bạn cần để bắt đầu.

+0

"Khi bắt đầu mỗi lớp, hãy khai báo một cá thể nhật ký như sau ..." Bạn đã mất tôi ở đó. :-) – Kos

3

Log4Net là một khuôn khổ khai thác gỗ khá toàn diện mà sẽ cho phép bạn đăng nhập để cấp độ khác nhau (Debug, Lỗi, Fatal) và đầu ra các báo cáo log đến những nơi khác nhau có thể (file lăn, dịch vụ web, cửa sổ lỗi)

Tôi có thể dễ dàng đăng nhập bất kỳ nơi nào bằng cách tạo một bản sao của trình ghi nhật ký

private static readonly ILog _log = LogManager.GetLogger(typeof([Class Name])); 

và sau đó ghi nhật ký lỗi.

_log.Error("Error messsage", ex); 
11

Enterprise Library là một thay thế vững chắc để log4net và nó cung cấp một loạt các tính năng khác nữa (bộ nhớ đệm, xử lý ngoại lệ, xác nhận, vv ...). Tôi sử dụng nó chỉ là về mọi dự án tôi xây dựng.

Rất khuyến khích.

+1

EL thậm chí có thể gửi email như một phần của quá trình ghi nhật ký. Rất tiện dụng khi báo cáo lỗi prod. – StingyJack

1

Ditto cho log4net. Tôi đang thêm hai bit của mình vì để sử dụng thực tế, bạn nên xem xét một số triển khai mã nguồn mở để xem các mẫu mã thực tế với một số bổ sung tiện dụng. Đối với log4net, tôi muốn đề nghị ra khỏi đầu của tôi nhìn vào subtext. Đặc biệt hãy xem các bit bắt đầu và assemblyinfo của ứng dụng.

15

Một thư viện ghi nhật ký tốt khác là NLog, có thể đăng nhập vào nhiều địa điểm khác nhau, chẳng hạn như tệp, cơ sở dữ liệu, trình ghi sự kiện, v.v.

+1

NLog là một trình ghi nhật ký rất tốt và rất dễ sử dụng. – meffordm

1

Tiếp tục đến vài ý kiến ​​realting đến việc sử dụng các phương pháp System.Diagnostics cho khai thác gỗ, tôi cũng muốn chỉ ra rằng các công cụ DebugView là rất gọn gàng để kiểm tra đầu ra gỡ lỗi khi cần - trừ khi bạn yêu cầu, không cần ứng dụng tạo tệp nhật ký, bạn chỉ cần khởi chạy DebugView khi cần.

2

Bạn có thể sử dụng được xây dựng trong .NET khai thác gỗ. Nhìn vào TraceSource và TraceListeners, chúng có thể được cấu hình trong file .config.

5

Như tôi đã nói trong một chủ đề khác, chúng tôi đã sử dụng The Object Guy's Logging Framework trong nhiều ứng dụng sản xuất trong vài năm. Đó là siêu dễ sử dụng và mở rộng.

1

Việc xây dựng trong truy tìm trong System.Diagnostics là tốt trong .NET Framework và tôi sử dụng nó trên nhiều ứng dụng. Tuy nhiên, một trong những lý do chính tôi vẫn sử dụng log4net là việc xây dựng trong .NET Framework truy tìm thiếu nhiều ứng dụng đầy đủ tính năng hữu ích mà log4net đã cung cấp sẵn.

Ví dụ có thực sự không phải là một tập tin tốt trình theo dõi được định nghĩa trong .NET Framework khác với một trong một VB.NET dll mà thực sự không phải là tất cả những tính năng đầy đủ.

Tùy thuộc vào môi trường phát triển của bạn, tôi khuyên bạn nên sử dụng log4net trừ khi công cụ của bên thứ ba không có sẵn, sau đó tôi muốn sử dụng các lớp theo dõi System.Diagnostics. Nếu bạn thực sự cần một appender/tracelistener tốt hơn, bạn luôn có thể tự mình thực hiện nó. Ví dụ: nhiều khách hàng của chúng tôi yêu cầu chúng tôi không sử dụng thư viện nguồn mở khi cài đặt trên máy của công ty, vì vậy trong trường hợp đó, các lớp truy tìm .NET Framework là hoàn toàn phù hợp.

Ngoài ra - http://www.postsharp.org/ là thư viện AOP mà tôi đang xem cũng có thể hỗ trợ ghi nhật ký như được minh họa ở đây trên dự án mã: http://www.codeproject.com/KB/dotnet/log4postsharp-intro.aspx.

3

Serilog là bữa tiệc muộn ở đây nhưng mang đến một số tùy chọn thú vị cho bảng.Nó trông giống như logger dựa trên văn bản cổ điển để sử dụng:

Log.Information("Hello, {0}", username); 

Nhưng, không giống như các khuôn khổ trước đó, nó chỉ làm cho tin nhắn và đối số vào một chuỗi khi viết văn bản, ví dụ vào một tệp hoặc bảng điều khiển.

Ý tưởng là nếu bạn đang sử dụng một 'lưu trữ dữ liệu NoSQL' kiểu cho các bản ghi, bạn có thể ghi lại các sự kiện như:

{ 
    Timestamp: "2014-02-....", 
    Message: "Hello, nblumhardt", 
    Properties: 
    { 
     "0": "nblumhardt" 
    } 
} 

.NET chuỗi định dạng cú pháp được mở rộng, do đó bạn có thể viết trên ví dụ như:

Log.Information("Hello, {Name}", username); 

Trong trường hợp này tài sản sẽ được gọi Name (chứ không phải 0), làm cho truy vấn và tương quan dễ dàng hơn.

Đã có một số tùy chọn lưu trữ tốt. MongoDB và Azure Table Storage dường như khá phổ biến cho DIY. Ban đầu tôi xây dựng Serilog (mặc dù nó là một dự án cộng đồng) và bây giờ tôi đang làm việc trên một sản phẩm có tên là Seq, cung cấp lưu trữ và truy vấn các loại sự kiện nhật ký có cấu trúc này.

1

ExceptionLess là một trong những gói nuget dễ nhất có sẵn để sử dụng để ghi nhật ký. Dự án open source của nó. Nó tự động xử lý ngoại lệ chưa được xử lý và các tùy chọn cho manually logs khả dụng. Bạn có thể đăng nhập trực tuyến hoặc self host trên máy chủ cục bộ.

+1

Tôi làm việc trong dự án Ngoại lệ và sẽ rất sẵn lòng trả lời bất kỳ câu hỏi nào. Chúng tôi có các mục tiêu đăng nhập cho tất cả các khung khai thác gỗ chính để bạn có thể nhận được rất nhiều giá trị ngay từ đầu bằng cách sử dụng Exceptionless (các thông điệp tường trình miễn phí + ngoại lệ không được xử lý) –

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