2011-01-31 28 views
8

Tôi đang cố gắng hiểu sự khác biệt giữa Trace.Write so với Trace.TraceInformation và dấu thời gian nào sẽ được sử dụng.Cách bao gồm dấu thời gian thân thiện với người dùng theo dấu vết

Tôi đã cố định cấu hình traceOutputOptions cho dấu thời gian/ngày giờ. Tôi chỉ cần thêm dấu thời gian với mỗi thư tôi đang viết. Các datetime tôi nhận được là một chút lộn xộn vì nó gắn thêm tên ứng dụng và ít người dùng tem thời gian thân thiện trong dòng tiếp theo như dưới đây.

ConsoleApplication1.exe Information: 0 : Hello - Trace! 
DateTime=2011-01-31T14:26:11.1538509Z 
ConsoleApplication1.exe Error: 0 : Hello - Trace! 
DateTime=2011-01-31T14:26:11.1538509Z 

Tất cả tôi cần là một cái gì đó giống như

2011-01-31 11:32 Information: Hello - Trace! 
2011-01-31 11:33 Error: Hello - Trace! 

Có cách nào dễ dàng cài đặt nó lên trong App.config làm việc đó?

+0

'Dấu vết.Write' và ilk của nó là" cách cũ "để theo dõi (sử dụng OutputDebugString). "Cách mới" là với các Nguồn Truy xuất: http://msdn.microsoft.com/en-us/library/ms228989.aspx – Tergiver

Trả lời

1

Hãy xem dự án Ukadc.Diagnostics tại codeplex. Nó cung cấp một gói addon dựa trên System.Diagnostics tốt, cung cấp khả năng định dạng đầu ra mạnh hơn (tương tự như log4net và NLog) hơn là có thể đạt được với System.Diagnostics TraceListeners. Bạn thậm chí có thể viết các đối tượng định dạng/mã thông báo của riêng mình và đưa chúng vào trong quá trình định dạng đầu ra.

Thư viện rất dễ sử dụng và hoạt động khá tốt.

+0

Cảm ơn bạn đã liên kết. Nó chỉ có vẻ hơi "nặng" để bao gồm một sự phụ thuộc bên ngoài cho một điều đơn giản. Tôi đã hy vọng có được một cái gì đó trong truy tìm để thực hiện điều đó. Sẽ xem xét dự án này tại anyep codeplex. – imak

+0

@imak - Trình tích hợp TraceListeners không có các tùy chọn định dạng rất linh hoạt. Một tùy chọn khác cho bạn sẽ là viết TraceListener của riêng bạn và thực hiện định dạng theo cách bạn muốn. – wageoghe

10

Tôi đã tìm thấy một cách tiếp cận tốt hơn, mà không cần bất kỳ phụ thuộc bên ngoài khác (Tôi nghĩ rằng các tính năng bao gồm System.Diagnostics đã giàu)

tôi đã thừa hưởng hai người nghe rằng tôi cần (ConsoleTraceListener và TextWriterTraceListener) theo cách này:

namespace MyApp 
{ 
    namespace Diagnostics 
    { 
     public class DateTimeConsoleTraceListener : ConsoleTraceListener 
     { 
      public override void Write(string message) 
      { 
       base.Write(DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss.fffffff ") + message); 
      } 
     } 

     public class DateTimeTextWriterTraceListener : TextWriterTraceListener 
     { 
      public DateTimeTextWriterTraceListener(string fileName) : base(fileName) { } 

      public override void Write(string message) 
      { 
       base.Write(DateTime.Now.ToString("MM/dd/yyyy HH:mm:ss.fffffff ") + message); 
      } 
     } 
    } 
} 

Sau đó, trong App.config:

<sharedListeners> 
    <add name="ConsoleListener" 
    type="MyApp.Diagnostics.DateTimeConsoleTraceListener, MyApp"> 
    <filter type="System.Diagnostics.EventTypeFilter" 
     initializeData="All"/> 
    </add> 
    <add name="FileListener" 
    type="MyApp.Diagnostics.DateTimeTextWriterTraceListener, MyApp" 
    initializeData="MyApp.log" > 
    <filter type="System.Diagnostics.EventTypeFilter" 
     initializeData="All"/> 
    </add> 
</sharedListeners> 

Hope this helps!

+0

Mát mẻ, phương thức 'void WriteLine (chuỗi tin nhắn)' cũng nên được ghi đè lên, nếu không một số dấu vết sẽ không có dấu thời gian. – igorushi

+0

Nếu bạn kiểm tra mã tháo rời của ConsoleTraceListener và TextWriterTraceListener (ví dụ với Reflector), bạn sẽ thấy rằng chúng sử dụng nội bộ lớp StreamWriter mà trong phương thức WriteLine chỉ cần thêm các ký tự NewLine và gọi phương thức Write. Do đó, nếu bạn ghi đè cả Write và WriteLine, bạn sẽ nhận được một dấu thời gian trùng lặp mỗi khi WriteLine được gọi. – Jamby

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