2015-03-03 52 views
8

Được rồi đừng cười. Năm 2005 tôi đọc về truy tìm bằng cách sử dụng không gian tên System.Diagnostics, nó đã được phức tạp và tôi đã sử dụng log4net và NLog bao giờ kể từ (và vì vậy có tất cả mọi người khác).Làm thế nào để đăng nhập ở mức tiết bằng cách sử dụng `System.Diags ... Dấu vết`

Hôm nay, ứng dụng của tôi sẽ được lưu trữ trên Trang web Windows Azure và sử dụng người bạn cũ của chúng tôi, Trace. trừu tượng

http://azure.microsoft.com/en-gb/documentation/articles/web-sites-enable-diagnostic-log/

tự mãn, tôi luôn luôn được sử dụng, IoC, vì vậy tôi chỉ viết một shim chút mới để viết sử dụng Trace nhưng nó chỉ có TraceInformation, TraceWarningTraceError.

Có một số phương pháp Write* nhưng tôi không biết họ sẽ kết thúc ở đâu và trong hoàn cảnh nào. API khủng khiếp. [gags]

Phương pháp nào dành cho mức độ tiết lộ/gỡ lỗi?

Chỉnh sửa: đã xóa "Easy one" khỏi tiêu đề. Rõ ràng là không.

+0

Tôi tin rằng 'TraceInformation' có nghĩa là dành cho những gì bạn gọi là tiết. –

+3

@ 500-InternalServerError nope, 'Information' và' Verbose' là hai cấp độ khác nhau – Jcl

Trả lời

10

Những gì bạn mô tả là lớp System.Diagnostics.Trace, có một số phương pháp đơn giản để ghi vào đầu ra dấu vết chẩn đoán.

Đó là xa cách mạnh mẽ các chẩn đoán truy tìm trong .NET

Cách đẹp nhất để làm tracing là tạo ra một TraceSource. Trong một lớp học TraceSource có một tài sản Switch mà lần lượt có một tài sản Level nơi bạn xác định mức độ chi tiết mà bạn muốn cho TraceSource cụ thể đó. Bạn có thể làm cho điều đó tracesource lắng nghe tất cả các cấp:

var ts = new TraceSource("My Verbose Debugger") {Switch = {Level = SourceLevels.All}}; 

Sau đó để theo dõi điều gì đó, bạn theo dõi để nguồn đó, nơi bạn chỉ định mức, như thế này:

ts.TraceData(TraceEventType.Verbose, 0, dataToBeTraced); 

Các 0 là id của dấu vết và dataToBeTraced là một đối tượng có dữ liệu cụ thể mà bạn muốn theo dõi (đó là thông số params [] object, vì vậy bạn có thể chuyển vào nhiều đối tượng nếu bạn muốn).

Bây giờ, làm cách nào để sử dụng dữ liệu đó? Sử dụng số TraceListener mà bạn thêm vào bộ sưu tập TraceSourceListeners của mình. Bạn thực hiện bắt nguồn lớp riêng của bạn từ TraceListener và ghi đè lên các phương pháp TraceData, như thế này:

class MyTraceListener : TraceListener 
{ 
    public override void TraceData(TraceEventCache eventCache, string source, TraceEventType eventType, int id, params object[] data) 
    { 
    base.TraceData(eventCache, source, eventType, id, data); 
    // do what you want with the objects in the "data" parameter 
    } 
} 

Người nghe có thể được chia sẻ giữa nhiều tracesources, và nó sẽ chỉ nhận được mức dữ liệu mà nó TraceSwitch mức cho phép.

System.Diagnostics.Trace sử dụng một người biết lắng nghe như thế này (các DefaultTraceListener) được thêm vào theo mặc định cho cả hai Debug.ListenersTrace.Listeners, nhưng trong nội bộ, nó hoạt động như tôi đã mô tả. Điều này tất cả có vẻ hơi khó hiểu lúc đầu, nhưng nó thực sự mạnh mẽ, và một khi bạn có một tập hợp các lớp trợ giúp ... ít nhất là tôi, đã ngừng sử dụng thư viện đăng nhập của bên thứ ba và sử dụng nó ở mức độ cao.

Đối với Azure, này là phỏng đoán vì tôi chưa bao giờ làm bất cứ Azure, nhưng tôi đoán bạn muốn cấu hình tracesource của bạn như thế này trong bạn app.config (có thể web.config? Không chắc chắn về web), thêm một mặc định nghe xanh cho các bản ghi:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <system.diagnostics> 
    <sharedListeners> 
     <add name="AzureListener" type="Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"> 
      <filter type="" /> 
     </add> 
    </sharedListeners>   
    <sources> 
     <source name="MyTraceSource" switchValue="Verbose" > 
     <listeners> 
      <add name="AzureListener" /> 
     </listeners> 
     </source> 
    </sources> 
</system.diagnostics> 
</configuration> 

"MyTraceSource" là tên chuỗi bạn đã TraceSource yo của bạn trong constructor khi làm điều đó thông qua mã.

Hoặc bạn chỉ có thể tạo ra một TraceSource trong mã như trên, và thêm một Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener để Listeners bộ sưu tập của mình

+0

Đây là một câu trả lời tuyệt vời. Tôi vừa học được những thứ tương tự sáng nay, liên quan đến 'TraceSource.TraceData | Event'. Nhưng cấu hình của nó bắt đầu là bí ẩn tiếp theo và phát hiện của bạn về 'Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener' có thể giữ phím. Cảm ơn, tôi sẽ cập nhật sau. –

+0

Như đã nêu, tôi đã không thực hiện bất kỳ Azure vì vậy tôi đang suy đoán. Tuy nhiên tôi đã quan tâm đến bắt đầu vì vậy tôi có mẩu thông tin googled ở đây và có – Jcl

+0

Tôi đã có nó làm việc, không có cấu hình, do đó, WAWS phải thêm nó chính nó. Nếu tôi cho phép chỉnh sửa qua Monaco có lẽ tôi sẽ thấy nó trong web.config. Dù sao, bây giờ tôi sẽ chuyển sang cấp độ Lỗi trong bảng điều khiển quản lý và xem các câu lệnh 'WriteLine' của tôi có bị bỏ qua hay không. Nếu không, tôi sẽ thay thế 'Trace' tĩnh bằng' TraceSource' và xem liệu tôi có thể phá vỡ nó và có thể sửa chữa nó một lần nữa với cấu hình hay không. –

3

tôi muốn thêm câu chuyện của riêng tôi.

Câu trả lời đơn giản cho câu hỏi của tôi là Trace.WriteLine có hiệu quả cao. Tuy nhiên, NET truy tìm là mạnh mẽ nhưng phức tạp nhưng tôi quản lý để làm cho nó làm việc vào lưu trữ bảng.

  • Bật nhật ký ứng dụng (lưu trữ bảng) trong tab cấu hình và thiết lập bảng của bạn. Nếu bạn tạo một cái mới, nó sẽ không xuất hiện cho đến khi bạn lưu các thay đổi.

  • Trong ứng dụng của mình, bạn chỉ cần sử dụng các phương thức trên System.Diagnostics.Trace và WAWS sẽ tự động thiết lập trình nghe điều kiện tiên quyết.

Chướng ngại vật của tôi đã theo dõi thông điệp gây tử vong một cách thích hợp. Vì không có phương pháp tĩnh cho các thông báo mức quan trọng, tôi buộc phải sử dụng các phương thức trên TraceSource và vượt qua mức enum mong muốn của mình.

Ví dụ, trong trừu tượng khai thác gỗ của tôi, mức do thỏa thuận như LoggingLevel.Fatal và tôi cần phải gọi TraceSource.TraceEvent(TraceEventType.Critical, ...

Tuy nhiên, chỉ cần newing-up một TraceSource không làm gì vì, như JCL giải thích, nó cần một người biết lắng nghe. Đó là nơi tôi đang bị mắc kẹt.

var listener = (TraceListener)new Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener(); 

_traceSource = new TraceSource(name, SourceLevels.All); 
_traceSource.Listeners.Add(listener); 

Điều này cần tham chiếu đến Microsoft.WindowsAzure.Diagnostics trong SDK cục bộ nhưng không biên dịch lạ.

Việc truyền sẽ không hoạt động. Tôi thậm chí không cần nó.

Lỗi 3 Không thể chuyển đổi loại 'Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener' để 'System.Diagnostics.TraceListener' Evoq.AppName.CoreLib C: \ Data \ Mã \ AppName \ Evoq.AppName \ Evoq. AppName.CoreLib \ Instrumentation \ AzureApplicationDiagnosticsLogger.cs 30 28

phần Strange là RedGate Reflector cho thấy một chuỗi thừa kế như thế này:

TraceListener, v4.0_4.0.0.0__b77a5c561934e089\System.dll 
RDEventMonitoringAgentListener, MonAgentListener.dll 
DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics.dll 

Nếu tôi reflec t số TraceSource của tôi ở đó, số (cũng) từ:

v4.0_4.0.0.0__b77a5c561934e089\System.dll 

Lẻ.Tôi từ bỏ bây giờ. Tôi có một sản phẩm để vận chuyển. Tôi sẽ hoàn nguyên về sử dụng lớp tĩnh Trace và quay trở lại nếu nó bắt đầu có chi phí.

Luke

+1

Tôi biết bạn nói bạn đã từ bỏ, nhưng hãy kiểm tra điều này: http://cryclops.com/2013/09/stupid-simple-azure-logging-for-cloud-services/ Họ làm điều đó bằng cách thêm vào ' DiagnosticMonitorTraceListener' vào một tên 'TraceSource' bằng cách thêm nó vào tập tin cấu hình, và nó có vẻ hoạt động – Jcl

+0

Cảm ơn bạn đã tìm thấy điều này. Bạn đã giúp đỡ rất nhiều. –

+0

Tôi rất vui vì tôi đã tham gia. Nếu bạn xảy ra để làm cho nó làm việc cuối cùng, xin vui lòng chia sẻ nó khi bạn có thời gian ... như tôi đã nói, tôi đang có kế hoạch thử azure cho một số công cụ trong tương lai và nó có thể tiết kiệm một số nhức đầu :-) – Jcl

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