2012-10-15 31 views
6

Tôi đã xem nhật ký các dịch vụ WCF (bao gồm các công nghệ như NLog và PostSharp), nhưng tôi có một số thứ chưa được giải quyết ... Tôi không biết mình có bị mất hay không một cái gì đó hiển nhiên hoặc nó chỉ là không thể.Dịch vụ WCF, đăng nhập theo chiều dọc

Giả sử tôi có tầng dịch vụ WCF với hơn 100 điểm nhập cuộc gọi dịch vụ web. Một trong số đó đang gây ra sự cố. Bên dưới tầng đó là tầng logic kinh doanh và tầng cơ sở dữ liệu. Những gì tôi muốn làm (tôi nghĩ) là bật tính năng ghi nhật ký cho cuộc gọi dịch vụ đó (bao gồm ID hoạt động cho tương quan), để mọi cuộc gọi đến dịch vụ đó được ghi lại và mọi thông điệp tường trình trong các tầng thấp hơn cũng được ghi lại. Tôi thực sự không muốn bật tính năng ghi nhật ký ở cấp độ lắp ráp cho các tầng thấp hơn bởi vì chúng sẽ được chia sẻ bởi nhiều phương pháp dịch vụ web.

Điều này thậm chí có thể, thông qua một khung hiện có hoặc bằng cách sử dụng một cái gì đó như CorrelationManager một cách sáng tạo?

Trả lời

1

Trong log4net, bạn có thể đặt thuộc tính trên ngữ cảnh chủ đề sẽ được bao gồm trong tất cả các sự kiện ghi cho chuỗi.

public class WcfServiceClass 
{ 
    public void ProblemServiceMethod() 
    { 
     using (log4net.ThreadContext.Stacks["logThisMethod"].Push("ProblemServiceMethod")) 
     { 
      // can also add the correlationId to the logs using this method. 
      // call business logic... 

     } 
    } 
} 

Sau đó, create a custom appender sẽ lọc theo.

public class IfContextSetFilterAppender : log4net.Appender.AppenderSkeleton 
{ 
    protected override void Append(LoggingEvent loggingEvent) 
    { 
     bool logThisEntry = false; 
     string serviceMethodBeingLogged; 

     foreach (object p in loggingEvent.GetProperties()) 
     { 
      System.Collections.DictionaryEntry dEntry = (System.Collections.DictionaryEntry)p; 
      if (dEntry.Key == "logThisMethod") 
      { 
       logThisEntry = true; 
       serviceMethodBeingLogged = dEntry.Value.ToString(); 
      } 
     } 

     if (!logThisEntry) 
      return; // don't log it. 

     // log it. 
    } 
} 

Đó là ví dụ rất đơn giản (nhưng rõ ràng) của ý tưởng.

Nếu tôi đã thực sự xây dựng này vào quy mô lớn một dịch vụ như bạn mô tả, tôi sẽ:

  1. Tạo một hành vi IOperationInvoker endpoint mà grabs tên phương pháp và thiết lập một giá trị bối cảnh log4net cho tất cả gọi của nó áp dụng cho.

  2. (Tùy chọn) Yêu cầu ứng dụng đọc từ app.config danh sách bộ lọc của tất cả tên phương thức dịch vụ sẽ được ghi nhật ký. (Nếu bạn là chọn lọc những gì phương pháp hành vi OperationInvoker được áp dụng cho, appender không cần phức tạp này.)

Bằng cách hoạt động bạn có nhiều lựa chọn cho việc kiểm soát khai thác gỗ trên một dịch vụ sản xuất thông qua cấu hình một mình mà không bao giờ chạm vào mã dịch vụ.

+0

Cảm ơn! Đó chính là loại điều tôi đang tìm kiếm. Lý tưởng nhất là tôi muốn sử dụng NLog trên log4net vì nó có vẻ hoạt động hơn một chút, nhưng đây chính xác là loại điều khiến tôi thay đổi ý định ... Bạn đã sử dụng mã như thế này trong giận dữ chưa? Làm thế nào nó sẽ đối phó với một dịch vụ đa luồng? –

+0

log4net.ThreadContext sử dụng lưu trữ cục bộ luồng. Miễn là một cuộc gọi dịch vụ không hop chủ đề (đọc sử dụng asych), điều này hoạt động tuyệt vời trong một môi trường đa luồng. Có, tôi đã thực hiện một số trong số này để sản xuất thực tế Dịch vụ doanh nghiệp. Cuối cùng là đặt một tương quan Id trong tất cả các ent đăng nhập (bất cứ điều gì đẩy trên ThreadContext có thể được bao gồm trong mô hình chuyển đổi của appender.) Log4net không phải là rất tích cực vì có rất ít mất tích và mở rộng nó là rất tốt tài liệu. Nếu bạn có thể dạ dày mà nó được viết trước khi generics, nó đối xử với bạn tốt. – ErnieL

+0

Cảm ơn Ernie. Đó là chính xác loại điều tôi đang tìm kiếm! –

0

Bạn có thể tạo nguồn đăng nhập mới cho cuộc gọi dịch vụ cụ thể đó và sau đó bật chẩn đoán để lọc nó.

<system.diagnostics> 
    <sources> 
     <source name="Your.Source.Here" switchValue="Verbose"> 
     <listeners> 
      <add name="xml" /> 
     </listeners> 
     </source> 
    </sources> 
    <sharedListeners> 
     <add name="xml" type="System.Diagnostics.XmlWriterTraceListener" traceOutputOptions="LogicalOperationStack" initializeData="l:\logs\N4S.MSO.ADC.Host.svclog" /> 
    </sharedListeners> 
    </system.diagnostics> 
+0

Điều đó không có nghĩa là các cuộc gọi đến khung đăng nhập ở các tầng thấp hơn cũng sẽ cần phải biết tên nguồn? –

+0

Chris - btw, cảm ơn cho đầu vào; đánh giá cao! –

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