2014-06-11 19 views
7

Tôi đã thừa kế một số mã sử dụng phần tử ưu tiên dưới gốc trong cấu hình xml của nó. Đây chỉ là giống như ví dụ ở http://iserialized.com/log4net-for-noobs/ trong đó cho thấy:Trong cấu hình Log4Net XML là mức độ ưu tiên giống như cấp?

<root> 
<priority value="ALL" /> 
<appender-ref ref="LogFileAppender" /> 
<appender-ref ref="ConsoleAppender"/> 
</root> 

Tuy nhiên, các ví dụ cấu hình log4net tại http://logging.apache.org/log4net/release/manual/configuration.html luôn hiển thị nó bằng cách sử dụng các yếu tố trình độ:

<root> 
<level value="DEBUG" /> 
<appender-ref ref="A1" /> 
</root> 

Trong loại cấu hình này là

<priority> 

giống như

<level> 

?

Ai đó có thể chỉ cho tôi đến một nơi nào đó trong tài liệu mà điều này được giải thích không?

Trả lời

17

Không có tài sản Priority trên lớp Logger trong log4net. Ví dụ duy nhất của Priority Tôi có thể tìm thấy trong số SmtpAppender. Vì vậy, vào mã tôi đã đi!

Trong phương pháp ParseChildrenOfLoggerElement của XmlHierarchyConfigurator bạn sẽ tìm thấy đoạn mã sau:

if (xmlElement.LocalName == "level" || xmlElement.LocalName == "priority") 
{ 
    this.ParseLevel(xmlElement, log, isRoot); 
} 

Ah! Cả hai giá trị được giải quyết cho cùng một thuộc tính (phương thức ParseLevel không thực sự làm được gì nhiều, ngoài việc gán, ghi nhật ký và quản lý giá trị "kế thừa" là mức có thể) để bạn có nó; "mức" và "ưu tiên" có cùng tác dụng chính xác với cấu hình của bạn. Tôi đoán này đã được thực hiện để giữ một số loại khả năng tương thích ngược với các phiên bản trước của thư viện, mà là trong thực tế được hỗ trợ bởi this article about log4j:

Trong các phiên bản đầu tiên của log4j, chúng được gọi là thể loại và ưu tiên, nhưng bây giờ chúng được gọi là logger và cấp độ, tương ứng.

Thật vậy, nếu chúng ta tìm kiếm cho "thể loại", có một phương pháp Configure trong XmlHierarchyConfigurator chứa đoạn mã sau:

// ... 
XmlElement xmlElement = (XmlElement)xmlNode; 
if (xmlElement.LocalName == "logger") 
{ 
    this.ParseLogger(xmlElement); 
} 
else 
{ 
    if (xmlElement.LocalName == "category") 
    { 
     this.ParseLogger(xmlElement); 
    } 
    else 
    { 
     if (xmlElement.LocalName == "root") 
     { 
      this.ParseRoot(xmlElement); 
     } 
    // ... 

Vì vậy, đó là nó: Trình độ và ưu tiên là hoán đổi cho nhau, cũng như các logger và danh mục.

Thú vị miếng ngon: tài sản cuối cùng thắng, và không có giới hạn về số lượng tài sản mà bạn có thể có trên logger, vì vậy đây là hợp lệ và sẽ thiết lập mức độ để gỡ lỗi

<root> 
<priority value="ALL" /> 
<priority value="ERROR" /> 
<level value="DEBUG" /> 
</root> 
+1

Wow. Cảm ơn. Và, "món ngon của bạn" giải thích bí ẩn tiếp theo của tôi. Một trong các tệp cấu hình kế thừa của tôi có hai phần tử ưu tiên dưới gốc. Tôi cho rằng "tài sản cuối cùng thắng" và thử nghiệm đã được xác thực, nhưng cảm ơn vì sự thấu hiểu. –

+0

Bạn được chào đón, đó là một chút phân tích thú vị và tôi đã có một số gợi ý về phân tích cấu hình từ câu trả lời này: http://stackoverflow.com/questions/23634472/using-ioc-in-a-custom-log4net -appender/23649446 # 23649446 – samy

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