2010-05-08 44 views
16

Ban đầu, chúng tôi không sử dụng bất kỳ lần ghi nhật ký hoặc gỡ lỗi nào nhưng sau một vài tuần để theo dõi một số dữ liệu bị hỏng, chúng tôi đã quyết định đặt Debug.Write và Trace để sản xuất và Debug.AssertCác phương pháp hay nhất về Chẩn đoán mạng?

Vì vậy, bây giờ câu hỏi là gì cách tốt nhất để sử dụng gỡ lỗi và ghi nhật ký. Tôi chỉ đang tìm kiếm một số điều chung chung.

public void AddRectodatabase(object record) 
{ 
    Debug.WriteLine(record.ToString()); 
    Trace.WriteLine(record.ToString()); 

    // Add it to databse 

    Debug.Assert(true, "Use this on case by case basis"); 
} 

Điều này có đủ tốt cho mục đích chung không, tôi có làm gì sai trong đó không?

Chúng tôi muốn gắn bó với .net System.Diagnostics qua các lựa chọn thay thế khác như log4net.

Có điều gì khác hữu ích trong System.Diagnostics không?

Trả lời

13

Bạn nên lập kế hoạch tăng sự kiện theo dõi ETW trong ứng dụng của mình - không chỉ để cảnh báo người nghe về các vấn đề mà còn cung cấp khả năng hiển thị cho hành vi và hiệu suất của ứng dụng và thành phần.

ETW là một hiệu suất cao (điên rồ) và (đáng kinh ngạc) cách tác động thấp của việc tăng sự kiện có thể được thu thập và phân tích - ngay cả trong môi trường sản xuất. Đó là khai thác gỗ & truy tìm cơ sở hạ tầng sử dụng trong suốt Windows, SQL vv

Ba liên kết hữu ích cho bạn:

  1. Diagnostics: Using ETW tracing in .NET 3.5 (EventProviderTraceListener)
  2. Controlling .NET Framework Logging link text
  3. Two Minute Drill: Introduction to XPerf

Đọc tất cả 3 theo thứ tự và sau đó đọc lại - thông tin sau này sẽ rất hữu ích, nhưng sẽ khó hiểu hơn trừ khi bạn nắm bắt những điều cơ bản đầu tiên;) Bỏ qua các hướng dẫn để sử dụng logman để bắt đầu và ngừng các bộ sưu tập theo dõi của bạn; sử dụng XPerf thay thế.

Nếu bạn chưa xem the Perf toolkit and XPerf viewer, thì bạn đang ở trong một điều trị! : D

tôi mạnh khuyến khích bạn xem xét nâng bắt đầu & sự kiện dừng vào lúc bắt đầu và kết thúc của tất cả các tính năng quan trọng nhất của ứng dụng để bạn có thể che phủ những sự kiện này với đo từ xa khác để bạn có thể xem, ví ví dụ: tác động của các tính năng ứng dụng của bạn trên Đĩa, mạng, bộ nhớ, CPU, v.v.

Hy vọng điều này sẽ hữu ích.

0

Bạn đang sử dụng nó ngoại trừ Assert với đối số đầu tiên được mã hóa cứng thành true. Bạn có lẽ nên thêm một số điều kiện ở đó và thông điệp (đối số thứ hai) sẽ được in chỉ khi điều kiện là sai. Vì vậy, trong ví dụ mã của bạn, nó sẽ không bao giờ được hiển thị. Trong một số trường hợp, WriteLineIf có thể hữu ích nếu bạn không muốn bao bọc các câu lệnh gỡ rối trong các khối có điều kiện.

Kiểm tra Debug class reference nó có một số phương pháp và thuộc tính hữu ích để giúp bạn ghi lại mọi thứ.

+0

Cảm ơn RaYell, xin lỗi vì mẫu xấu tôi vừa tạo ra trong câu hỏi. – mamu

0

System.Diagnostics cũng chứa EventLog.WriteEntry, nhưng bạn có thể hoặc không muốn tràn EventLog với các thông điệp theo dõi, mặc dù đây là cách dễ dàng để ghi lại các sự kiện ứng dụng chính.

5

Phản ứng này là muộn, nhưng ...

Tôi nghĩ bạn nên xem xét sử dụng TraceSources hơn Debug.WriteLine và/hoặc Trace.WriteLine. Với TraceSources, bạn có thể đạt được mức kiểm soát cao hơn đối với việc ghi nhật ký của mình. Mức độ của mỗi TraceSource có thể được kiểm soát như là điểm đến của TraceSource (TraceListener). Bạn có thể viết mã như sau:

public class RectToSqlServer : IDatabaseUtilities 
{ 
    private static readonly TraceSource ts = new TraceSource("RectToSqlServer"); 

    public void AddRectToDatabase(object record) 
    { 
    ts.TraceEvent(TraceEventType.Information, "record = {0}", record.ToString()); 

    //Add record to database ... 

    } 
} 

public class RectToOracle : IDatabaseUtilities 
{ 
    private static readonly TraceSource ts = new TraceSource("RectToOracleServer"); 

    public void AddRectToDatabase(object record) 
    { 
    ts.TraceEvent(TraceEventType.Information, "record = {0}", record.ToString()); 

    //Add record to database ... 

    } 
} 

Bây giờ, bạn có thể kiểm soát ghi nhật ký (cấp độ, điểm đến, v.v ...) cho từng lớp một cách độc lập. Ngoài ra, lưu ý rằng bạn không phải thêm cả Trace.WriteLine và Debug.WriteLine để đăng nhập vào cả bản sửa lỗi và bản phát hành. Sử dụng TraceSources sẽ đưa bạn vào một vị trí tốt để sử dụng ETW trong tương lai vì có một ETWTraceListener có sẵn bắt đầu từ .NET (có thể 3,5, chắc chắn là 4,0). NHƯNG chức năng ETW cụ thể này chỉ có sẵn trên Vista và hệ điều hành sau này.

Để thêm khả năng vào System.Diagnostics (chủ yếu - có thể chỉ - nếu đăng nhập qua TraceSource), hãy xem Ukadc.Diagnostics. Ukadc.Diagnostics bổ sung thêm khả năng định dạng khá thú vị (tương tự như những gì bạn có thể làm với log4net và NLog) cho System.Diagnostics. Không có sự phụ thuộc mã (chỉ cần cài đặt Ukadc.Diagnostics và thêm một số cấu hình vào app.config của bạn). Tôi phải nói rằng tôi nghĩ nó rất tuyệt.

Nếu bạn muốn đặt một ít công sức để truy cập vào TraceSources, hãy xem here để thực hiện thú vị một trình bao bọc TraceSource về cơ bản cung cấp cho TraceSources khả năng "kế thừa" cấu hình ghi nhật ký từ tổ tiên "TraceSources". log4net và NLog loggers có thể kế thừa các thiết lập ghi nhật ký).

+0

+1 nhưng có thể muốn thay đổi chuỗi ma thuật trong 'RecToOracle': D –

+0

@Ruben Bartelink - Tốt bắt! – wageoghe

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