2011-10-19 29 views
11

tôi đang gặp khó khăn xây dựng sự khác biệt chính xác giữa việc sử dụng những ký tự chuyển đổi hai log4j khi được sử dụng trong một log4j PatternLayout (log4j patternLayout)Log4j, patternLayout, lớp và loại

  • loại (% c)
  • lớp (% C)

có thể ai đó xin vui lòng cho tôi một ví dụ nơi hai sẽ khác?

Danh mục có luôn khớp với tên lớp không?

Kính trọng,

Trả lời

17

Nó sẽ giống nhau nếu bạn khởi tạo logger theo cách phổ biến được đề xuất bởi các tài liệu, và sử dụng nó bên trong lớp X:

Logger logger = Logger.getLogger(com.foo.X.class); 

sau đó bạn sẽ nhận được tương tự cho %c%C, vì tên trình ghi nhật ký (được xây dựng bởi "com.foo.X.class.getName()") sẽ khớp với tên lớp, trong đó tuyên bố khai báo được cấp.

Gọi logger của bạn "cái gì đó"

Logger logger = Logger.getLogger("something"); 

và bạn sẽ có "cái gì đó" cho %c và tên lớp cho %C.

Lưu ý rằng %C được tính bằng log4j trong dấu vết ngăn xếp của chuỗi hiện tại, vì vậy nó mang tác động hiệu suất lớn, không giống như %c, chỉ đơn giản là một Chuỗi. Bạn có thể tiến hành một thí nghiệm thú vị để xác nhận điều đó:

package com.foo; 

class A { 
    private Logger = Logger.getLogger(B.class); 
    // ... 
    logger.log("inside A class"); 
} 

Kết quả cho mô hình [%c][%m] giả B là trong gói com.foo sẽ là:

[com.foo.B][inside A class] 

Kết quả cho mô hình [%C][%m] không phụ thuộc vào vị trí của B sẽ là:

[com.foo.A][inside A class] 
Các vấn đề liên quan