2009-07-19 20 views
9

Tôi đang thực hiện một định dạng tùy chỉnh XML cho log4.netlàm thế nào để đăng nhập tên phương pháp khi sử dụng lớp wrapper với Log4net

public class ISDSApplicationEventsLayout : XmlLayoutBase 
{ 
    protected override void FormatXml(...) 
    { 
     //Location Info 
     writer.WriteStartElement("Method"); 
     writer.WriteString(**loggingEvent.LocationInformation.MethodName * *); 
     writer.WriteEndElement(); 
    } 
} 

Vấn đề là ... bây giờ khi tôi gọi phương thức đăng nhập từ lớp log wrapper của tôi. .. gọi là khai thác gỗ

public static void logEvent(string message) 
{ 
    log.Info(isdsLog); 
} 

tôi nhận được đầu ra ....

<Method>logEvent</Method> 

Làm thế nào là nó có thể có tên gọi là phương pháp mà logEvent, thay vì logEvent làm tên phương thức?

Cảm ơn bạn

Câu hỏi Cập nhật:

Nếu điều này dường như ở trên một chút phức tạp - những gì tôi đang thực sự hỏi là: Làm thế nào để bạn giữ bối cảnh của phương pháp đó được gọi là chức năng gói đăng nhập log4net ...

dụ ... phương pháp DoWork() ... gọi -> đăng nhập wrapper -> gọi log4net ....

làm thế nào để bạn thực hiện các methodname = DoWork và kHÔNG đăng nhập wra pper function ....

+0

Bản sao có thể có của [Khi sử dụng trình bao bọc, cách giữ tên lớp và phương thức cho Log4Net để đăng nhập?] (Http: // stackoverflow.com/questions/2049992/khi-sử dụng-wrapper-how-to-bảo tồn-lớp-và-phương pháp-tên-cho-log4net-to-log) –

Trả lời

14

Thực ra, bạn có thể sửa lỗi này dễ dàng với log4net ngoài hộp. Trình bao bọc của bạn có thể gọi Logger.Log và chuyển loại của lớp trình bao bọc của bạn làm tham số đầu tiên. Vì vậy, wrapper của bạn có thể trông giống như thế này:

public class MyLog4NetWrapper 
{ 
    ILog log = LogManager.GetLogger("WhateverYourLoggerNameIs"); 

    public void logEvent(string message) 
    {  
    log.Logger.Log(typeof(MyLog4NetWrapper), LogLevel.Info, message, null); 
    } 
} 

Khi log4net đăng một tin nhắn, nó đi qua lên các cuộc gọi stack cho đến khi nó được cho là phương pháp mà tuyên bố loại là tương đương với các loại thông qua tại như các tham số đầu tiên của phương thức Log. Phương pháp tiếp theo lên ngăn xếp là trang web gọi thực tế.

Theo như gói nhật ký log4net, tôi không chắc chắn rằng tôi sẽ khuyên bạn nên tạo một lớp trình bao bọc tĩnh. Vấn đề chính với điều đó là bạn chỉ có thể có một logger có thể cấu hình duy nhất trong tệp app.config của bạn. Nói cách khác, bạn sẽ không thể kiểm soát độc lập việc ghi nhật ký từ các phần khác nhau của mã của bạn. Nếu bạn có lớp A và lớp B và cả hai đều sử dụng trình bao bọc tĩnh của bạn, thì cả hai lớp sẽ đăng nhập cùng cấp. Nếu bạn muốn bật đăng nhập cho lớp A và tắt cho lớp B, bạn sẽ không thể làm như vậy.

+0

Ah tất nhiên, đôi khi người ta không nhìn thấy những gì đang nhìn chằm chằm vào mặt bạn. Vâng, nếu bạn sửa mã của bạn thành 'log.Logger.Log (...)' ít nhất là :) –

+0

Có, bạn đã đúng! Tôi sẽ sửa mẫu mã. – wageoghe

1

Tôi không nghĩ rằng bạn có thể dễ dàng khắc phục điều này với log4net ngoài hộp. Nếu chúng ta hãy nhìn vào các phương pháp ILog.Info trong the LogImpl class, rằng bạn đang gọi:

virtual public void Info(object message) 
    { 
     Logger.Log(ThisDeclaringType, m_levelInfo, message, null); 
    } 

Khi một thông điệp được đăng nhập, log4net sẽ đi stacktrace của cuộc gọi hiện tại để tìm ra phương pháp mà khởi xướng hoạt động đăng nhập. Để thực hiện việc này, Log4net sử dụng kiểu "ThisDeclaringType" làm đường biên của tìm kiếm, cuộc gọi đầu tiên "ở trên" các cuộc gọi bên trong loại đó được chọn làm phương thức khởi tạo.

Trong trường hợp của bạn, phương pháp đầu tiên gặp phải là phương thức logEvent. Nếu bạn bỏ trình bao bọc logEvent và sử dụng các phương thức ghi trực tiếp, bạn sẽ nhận được thông tin mong muốn.

+0

Thực tế nó có thể tạo ra một trình bao bọc logger có thể bảo toàn thành công cuộc gọi thông tin trang web. Xem mẫu mã trong câu trả lời của tôi cho một cách để làm điều này. Điều quan trọng là truyền kiểu logger được bao bọc làm tham số đầu tiên cho phương thức Log (thay vì sử dụng các phương thức Info, Debug, etc). – wageoghe

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