2010-09-09 18 views
20

Tôi đã thấy nhiều câu hỏi khác về đăng nhập. Thực hành tốt nhất. Nền tảng ghi nhật ký nào là tốt nhất. Vv Dưới đây là một số liên kết từ đây trên SO với các cuộc thảo luận rất tốt về chủ đề này:WCF đăng nhập/truy tìm và tuyên truyền hoạt động id bằng cách sử dụng log4net hoặc NLog

logging best practices

log4net vs TraceSource

best logging solution for .NET 3.5 project

.NET 3.5 logging

BEGIN EDIT:

Có gõ bài dài này, tôi đoán rằng chính thi ng rằng tôi đang cố gắng tìm ra là cách kết hợp chặt chẽ WCF đăng nhập/truy tìm và hoạt động id tuyên truyền là System.Diagnostics và TraceSources. Bạn có thể nhận được "ghi" WCF tốt/truy tìm và truyền hoạt động id hoạt động bằng cách sử dụng nền tảng ghi nhật ký của bên thứ ba như log4net hay NLog. Nếu bạn làm điều này, làm thế nào để bạn làm điều đó?

Xem cuối bài đăng này để biết một số câu hỏi về ServiceTraceViewer,

END EDIT.

Chủ đề của câu hỏi của tôi không được thảo luận chi tiết trong bất kỳ bài đăng nào trong số này. Tôi quan tâm đến những gì mọi người đang làm về khai thác gỗ và WCF. Nếu bạn đang làm việc trên một dự án bao gồm các dịch vụ WCF và bạn đã đăng nhập vào dự án của bạn, bạn có thực hiện bất kỳ nỗ lực đặc biệt nào để sử dụng các khả năng ghi nhật ký cụ thể của WCF hay không. Cụ thể, bạn có cố gắng kết hợp những thứ như Theo dõi hoạt động, tuyên truyền hoạt động và theo dõi từ đầu đến cuối không? Chẳng hạn như được nêu trong this bài viết từ MSDN. Here là một bài viết khác từ MSDN về hoạt động tuyên truyền.

Các bài viết thực hiện một công việc khá là giải thích cách thực hiện theo dõi hoạt động, tuyên truyền hoạt động và kết thúc theo dõi bằng cách sử dụng System.Diagnostics TraceSources. Nó cho thấy cách cấu hình WCF để "bật" các tùy chọn này thông qua tệp app.config/web.config. WCF sử dụng TraceSources trong nội bộ để ghi lại kết quả của giao tiếp.

Dưới đây là một số mẫu mã (từ bài viết MSDN thứ hai liên kết ở trên) cho thấy nhiều hơn hoặc ít hơn như thế nào để đạt được công tác tuyên truyền hoạt động thông qua System.Diagnostics và TraceSources:

TraceSource ts = new TraceSource("myUserTraceSource"); 
Guid oldID = Trace.CorrelationManager.ActivityId; 
Guid traceID = Guid.NewGuid(); 
ts.TraceTransfer(0, "transfer", traceID); 
Trace.CorrelationManager.ActivityId = traceID; // Trace is static 
ts.TraceEvent(TraceEventType.Start, 0, "Add request"); 

double value1 = 100.00D; 
double value2 = 15.99D; 
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2); 
double result = client.Add(value1, value2); 
ts.TraceInformation("Client receives Add response '" + result + "'"); 

ts.TraceTransfer(0, "transfer", oldID); 
ts.TraceEvent(TraceEventType.Stop, 0, "Add request"); 
Trace.CorrelationManager.ActivityId = oldID; 

Dưới đây là một cách mà bạn có thể nói , từ bên trong một dịch vụ, hay không WCF đã tuyên truyền một hoạt động:

// Check if an activity was set in scope by WCF, i.e., if it was 
// propagated from the client. If not, i.e., ambient activity is 
// equal to Guid.Empty, create a new one. 
if(Trace.CorrelationManager.ActivityId == Guid.Empty) 
{ 
    Guid newGuid = Guid.NewGuid(); 
    Trace.CorrelationManager.ActivityId = newGuid; 
} 
// Emit your Start trace. 
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity"); 

// Emit the processing traces for that request. 
serviceTs.TraceInformation("Service receives Add " 
         + n1 + ", " + n2); 
// double result = n1 + n2; 
serviceTs.TraceInformation("Service sends Add result" + result); 

// Emit the Stop trace and exit the method scope. 
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity"); 
// return result; 

từ tất cả những ví dụ mà tôi đã thấy, hoạt động tuyên truyền được thực hiện cấu hình (thường là qua app.config) mô hình TraceSource System.Service và thiết lập i ts propagateActivity property thành "true". Các hoạt động thực sự được truyền bằng cách đặt id hoạt động (guid) trên Trace.CorrelationManager.ActivityId. Có thể WCF đăng nhập và hoạt động tuyên truyền được sử dụng có hiệu quả nếu bạn đang sử dụng log4net hoặc NLog?

Dự án của tôi sẽ sử dụng WCF rất nhiều. Chúng tôi hiện đang cố gắng giải quyết về giải pháp khai thác gỗ của mình. Tôi nghĩ rằng tôi có một sự hiểu biết khá tốt về cách WCF đăng nhập và hoạt động tuyên truyền hoạt động với System.Diagnostics và TraceSources. Tôi muốn hiểu rõ hơn cách thức/nếu một cái gì đó tương tự có thể đạt được với các nền tảng ghi nhật ký như log4net và NLog.

Họ có cung cấp hỗ trợ "gốc" không?Dường như có nhiều khả năng là họ cung cấp một số cơ sở hạ tầng để tuyên truyền hoạt động có thể đạt được "thủ công". Có lẽ một cái gì đó như thế này:

//Inside client code: 
ILog logger = LogManager.GetLogger("client"); 
Guid oldActivity = Trace.CorrelationManager.ActivityId; 
if (oldActivity == Guid.Empty) 
{ 
    Trace.CorrelationManager.ActivityId = Guid.NewGuid(); 
} 

using (LogManager.NDC.Push(Trace.CorrelationManager.ActivityId)) 
{ 
    log.Info("Before calling WCF Service"); 

    wcfService.Method(); 

    log.Info("After calling WCF Service"); 
} 
Trace.CorrelationManager.ActivityId = oldActivity; 

Nếu định dạng log4net/NLog đăng nhập được cấu hình để đăng nhập phía trên cùng của ngăn xếp NDC, sau đó mỗi tin nhắn đăng nhập của khách hàng (trong khi hoạt động trong phạm vi) sẽ là "gắn thẻ" với id hoạt động. Giả sử rằng dịch vụ WCF được thực hiện tương tự, thì tất cả các thông điệp được ghi lại trong cuộc gọi dịch vụ cũng sẽ được ghi lại (mặc dù, có thể trong một tệp riêng biệt) và được gắn thẻ với cùng một id hoạt động. Vì vậy, nó sẽ có thể tương quan các thông điệp đăng nhập trong tệp nhật ký "dịch vụ" với các thư tương ứng trong nhật ký "khách hàng".

Vì vậy, nếu bạn sử dụng WCF và bạn phải đăng nhập, sau đây là một số câu hỏi:

  1. Bạn có sử dụng tuyên truyền hoạt động?
  2. Bạn có sử dụng TraceSources để đăng nhập không?
  3. Bạn có sử dụng một số nền tảng ghi nhật ký khác (ví dụ: log4net, NLog) không?
  4. Nếu bạn sử dụng nền tảng ghi nhật ký khác, bạn làm cách nào để thực hiện tuyên truyền hoạt động?
  5. Bạn có sử dụng kết hợp ghi nhật ký của bên thứ ba (log4net/NLog - để khai thác gỗ nhiều nhất) và System.Diagnostics.TraceSource (đối với ghi nhật ký ranh giới dịch vụ WCF) không?

Còn ServiceTraceViewer thì sao? Bạn có dùng nó không? Hầu hết các ví dụ tôi đã thấy cho thấy đầu ra được tạo ra bởi System.Diagnostics thông qua TraceSources và XmlTraceListener. Nó có thể tiêu thụ đầu ra từ log4net, NLog, vv? Liệu nó có hoạt động "tốt nhất" với việc ghi nhật ký dựa trên TraceSource không? Nếu vậy, là nó "đủ tốt" để có chỉ một chút đăng nhập dựa trên TraceSource tại ranh giới dịch vụ WCF (chụp một số bối cảnh ứng dụng cũng như thông tin liên lạc WCF) để xem trong ServiceTraceViewer? Tôi đã sử dụng ServiceTraceViewer một thời gian ngắn, giống như một phần của quá trình học tập WCF đang diễn ra của tôi.

Nếu bạn có điều này xa, cảm ơn bạn đã đọc. Có lẽ tôi đang overthinking toàn bộ hội nhập của đăng nhập, WCF hoạt động tuyên truyền, và khả năng xem các bản ghi trong ServiceTraceViewer. Nó có vẻ như một sự cân nhắc quan trọng trong việc lựa chọn nền tảng đăng nhập và/hoặc các chiến lược ghi nhật ký, nhưng tôi không có đủ kinh nghiệm với các nền tảng ghi nhật ký này hoặc WCF để biết chắc chắn.

+0

Bạn đã tìm thấy bất kỳ câu trả lời nào khi sử dụng lại mối tương quan với NLog? –

+0

Câu hỏi hay. Có rất nhiều tài liệu về chủ đề này nhưng dường như rất ít thông tin: P – shambulator

Trả lời

3

Chỉ cần nickels của tôi đáng giá, tôi sử dụng ghi nhật ký dựa trên AOP mà tôi viết/duy trì bản thân mình, nhưng nó giống như một số khung công tác ghi nhật ký khác ... callstack.

Vì vậy, nơi bạn có một cái gì đó như thế này:

using (LogManager.NDC.Push(Trace.CorrelationManager.ActivityId)) { 
    log.Info("Before calling WCF Service"); 

    wcfService.Method(); 

    log.Info("After calling WCF Service"); 
} 
Trace.CorrelationManager.ActivityId = oldActivity; 

Nếu bạn có một cái gì đó như thế này trên máy chủ sau đó tôi làm việc về vấn đề đó, nhưng phương pháp của tôi không hoạt động theo cách này cho khai thác gỗ bên trong. Tôi được thiết lập để thực hiện việc này:

[LogMethod(CaptureDirection = LoggingDirection.InOut /*Optional*/, CaptureVariables = Yes /*Optional*/)] 
public ClassName MyMethodName(params){ 
    //magic logging happens here on method entry 

    DoSomething(); 

    //if you need logging here I can't do anything with my AOP system 

    DoSomethingElse(); 


    //magic logging happens here on method exit 
} 

Ngoài ra, bạn đang tìm cách đăng nhập tương quan giữa máy khách và máy chủ? Làm thế nào để bạn thương lượng hai? Làm thế nào bạn có thể đảm bảo rằng một liên quan đến cái kia?

+0

Có, chúng tôi muốn tương quan giữa việc ghi nhật ký giữa máy khách và máy chủ. Giả sử rằng máy khách thực sự là một máy khách .NET 4.0 (không phải Silverlight vì Silverlight không hỗ trợ Trace.CorrelationManager. *). Khách hàng có thể đặt Trace.Correlationmanager.ActivityId = . Nếu việc ghi nhật ký ghi lại giá trị đó thì mỗi câu lệnh ghi nhật ký có thể được gắn thẻ với ActivityId. Bây giờ, nếu chúng ta có thể nhận được ActivityId đó đến Server, thì việc ghi nhật ký từ máy chủ cũng có thể gắn thẻ mỗi câu lệnh ghi nhật ký với ActivityId. Nếu tất cả đăng nhập cho tất cả khách hàng và máy chủ ... – wageoghe

+0

... được chuyển hướng đến cùng một địa điểm, hãy nói một cơ sở dữ liệu, sau đó chúng tôi có thể truy vấn tất cả các thông điệp ghi nhật ký có cùng ActivityId, sắp xếp chúng theo thời gian và chúng tôi có thể để xem nhật ký từ (các) máy chủ tương ứng với các cuộc gọi từ máy khách. Điều này có sẵn "miễn phí" ở một mức độ nào đó thông qua WCF ActivityId propogation (như được liên kết trong câu hỏi ban đầu của tôi) nếu bạn sử dụng System.Diagnostics logging/trace. Tôi quan tâm đến việc tìm hiểu cách thức/nếu sự thúc đẩy ActivityId tích hợp với việc ghi/truy tìm không theo System.Diagnostics như log4net và NLog. – wageoghe

+0

Có vấn đề khi sử dụng WCF ActivityId propogation với các máy khách Silverlight vì Silverlight không hỗ trợ Trace.CorrelationManager. *, Do đó, đã có một số việc phải làm để thậm chí có thể "khởi động" Activity trong Silverlight. – wageoghe

0

article on CodeProject mô tả cách theo dõi hoạt động bằng NLog bằng cách tạo trình kết xuất đồ họa và người nghe và chỉ định cấu hình đăng nhập.

Các mã nguồn cho các phần mở rộng nLog có thể được tìm thấy tại http://lowleveldesign.codeplex.com/releases/view/96938

Disclaimer: Tôi chưa thử các giải pháp, chỉ có kế hoạch để sử dụng nó.

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