2013-03-21 67 views
5

Tôi có Logging thiết lập để sử dụng TraceSource khác nhau cho mỗi Class.System.Diagnostics Ký tự đại diện cho tên nguồn

Có thể định cấu hình ký tự đại diện viết sự kiện cho tất cả các nguồn không?

<system.diagnostics> 
    <sources> 
    <source name ="wildcard" switchValue="Warning"> 
     <listeners> 
     <add name="textlog" /> 
     </listeners> 
    </source> 
    <source name="MySpecificClass" switchValue="All"> 
     <listeners> 
     <add name="textlog" /> 
     </listeners> 
    </source> 
    </sources> 
    <sharedListeners> 
    <add name="textlog" 
     type="System.Diagnostics.TextWriterTraceListener" 
     initializeData="Log.log"> 
    </add> 
    </sharedListeners> 
    <trace autoflush="true"/> 
</system.diagnostics> 

Trả lời

4

Tôi không biết cách tích hợp để thực hiện điều đó một cách tự động. Tuy nhiên, nếu bạn có một cái nhìn tại TraceLogger trong kho git của Castle, bạn có thể thấy rằng chúng về cơ bản đã bao bọc và mở rộng TraceSource để hỗ trợ việc đặt tên "hierarichal".

https://github.com/castleproject/Core/blob/master/src/Castle.Core/Core/Logging/TraceLogger.cs

tôi sẽ sao chép mã ở đây, nhưng nó có thể không thích hợp để chỉ cần cắt và dán có mã vào SO.

tôi có thể giải thích như thế nào những ý tưởng thể hiện trong lớp học có thể làm việc cho bạn (mà không cần phải sử dụng Castle)

Về bản chất, trong mã khách hàng của bạn (mà muốn đăng nhập công cụ), bạn sẽ tạo ra một thể hiện của "logger" (thay vì TraceSource). Là đầu vào cho trình ghi nhật ký, bạn sẽ cung cấp cho, ví dụ như tên lớp đầy đủ. Bên trong hàm tạo, sử dụng tên đầu vào để cố gắng giải quyết một TraceSource. Nếu có một TraceSource được cấu hình với tên đó, hãy sử dụng TraceSource đó để thực hiện công việc. Nếu không, hãy cắt phần ngoài cùng bên phải của tên đủ điều kiện. Hãy thử giải quyết một TraceSource với tên đó. Nếu có một TraceSource được cấu hình với tên đó, hãy sử dụng nó. Và cứ thế. Nếu bạn không tìm thấy bất kỳ TraceSources, sau đó không đăng nhập bất cứ điều gì từ "logger" của bạn. Bạn có thể thêm vào khả năng nhận ra một TraceSource đã được cấu hình với một tên ký tự đại diện (""). Nếu bạn không bao giờ tìm thấy TraceSource bằng cách sử dụng kỹ thuật cắt tỉa tên và nếu có "TraceSource", hãy sử dụng "TraceSource" làm dự phòng.

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

class MyTraceSource 
{ 
    private TraceSource ts; 

    public MyTraceSource(string name) 
    { 
    ResolveTraceSource(name); 
    } 

    private void ResolveTraceSource(string name) 
    { 
    //Check for a configured TraceSource from most qualified name (as input) to least qualified (""). 
    //Assume name like this: Namespace1:Namespace2:Class 
    //Try to resolve: 
    // TraceSource("Namespace1.Namespace2.Class"); 
    // TraceSource("Namespace1.Namespace2"); 
    // TraceSource("Namespace1"); 
    //If you still haven't found one, try to resolve 
    // TraceSource("*"); 
    } 

    //Implement either TraceSource API, or whatever API you prefer for logging. 

} 

Tôi đã thực sự làm điều gì đó như thế này bản thân mình như là một phần của một nguyên mẫu (mà chúng ta đã kết thúc không sử dụng) và nó làm việc khá tốt cho bắt chước đường bạn có thể chỉ định logger trong log4net và NLog.

Chúc may mắn!

+0

Cảm ơn câu trả lời này thật tuyệt vời. Tôi đã làm gần giống như bạn đã gợi ý. Tôi đã cung cấp cho các logger tên đầy đủ và cố gắng giải quyết hội đồng. Sau đó, tôi đã sử dụng tên lắp ráp làm nguồn nhật ký. (Vì vậy, tôi đã có các nguồn khác nhau cho tất cả các hội đồng của tôi thành lập). Nhưng tôi chưa bao giờ nghĩ đến việc tạo ra nguồn ký tự đại diện của riêng mình. Ngoài ra tôi nghĩ rằng cách giải quyết của bạn có tính linh hoạt hơn và nhanh hơn. Cảm ơn nó sẽ không khó để tôi thực hiện điều này, rất hữu ích! –

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