2009-11-23 34 views
12

Có thể chỉ định múi giờ mà log4j sẽ sử dụng không? Tôi cần các ngày trong tệp nhật ký là múi giờ khác với múi giờ của ứng dụng. log2j's PatternLayout sử dụng SimpleDateFormat. Rất tiếc, dường như không có cách nào để kiểm soát múi giờ của SimpleDateFormat thông qua chuỗi mẫu (DateFormat có phương thức setTimeZone nhưng điều đó không có tác dụng).Chỉ định múi giờ của ngày log4j

Tôi đã xem nguồn của log4j và SimpleDateFormat đang được hiển thị trong PatternParser.finalizeConverter. Rất tiếc, không có cách nào dễ dàng để giữ lại số DateFormat để đặt múi giờ.

Trả lời

16

Nếu bạn sử dụng tệp JAR của Log4J trên đường dẫn lớp, lớp EnhancedPatternLayout hỗ trợ tùy chọn cấu hình này. Xem Javadoc tại this link. Nó được xử lý như một phần của thành phần mẫu% d như sau:

log4j.appender.stdout.layout.ConversionPattern=%d{}{America/New_York} %p [%c] - %m%n 

Bạn có thể tải xuống gói bổ sung here.

+0

Trong trường hợp của tôi trong logger nó đến như {America/New_York} DEBUG [hi] - hi .. Tôi không biết tại sao nó không hoạt động –

+1

kể từ 1.2.16 nó là một phần của bản thân log4j –

4

Mẫu nhật ký ở trên có ý tưởng đúng nhưng không hoàn toàn chính xác (bạn không nhận được bất kỳ dấu thời gian nào trong nhật ký).
Sử dụng mô hình này chắc chắn:
%d{ISO8601}{America/New_York} %p [%c] - %m%n
hoặc
%d{ISO8601}{GMT-5} %p [%c] - %m%n

+0

Có thể nó đã hoạt động một phiên bản cũ hơn. Dù sao cũng cảm ơn! – aditsu

8

Trường hợp của tôi ... phải thay đổi patternLayout để EnhancedPatternLayout. (log4j-1.2.17.jar)

log4j.appender.logfile.layout = org.apache.log4j. EnhancedPatternLayout log4j.appender.logfile.layout.ConversionPattern = [% d {ISO8601} {GMT + 9}]% - 5p -% m% n

1

Ngoài ra nếu bạn whant để dinamicaly obtein múi giờ mặc định, bạn có thể mở rộng EnhancedPatternLayout và ghi đè lên các phương pháp "setConversionPattern" như thế này:

@Override 
public void setConversionPattern(String conversionPattern) { 
    String defaultTimeZoneId = TimeZone.getDefault().getID(); 
    String conversionPatternModif = conversionPattern.replaceAll(
     "\\%d\\{([^\\{\\}]*)\\}([ ]*[^\\{]*)", 
     "%d{$1}{"+defaultTimeZoneId+"}$2"); 

    super.setConversionPattern(conversionPatternModif); 
} 
+0

cảm ơn, điều này làm việc cho tôi :) – toantran

2

Nó là thích hợp hơn để sử dụng một cái gì đó như {America/New_York} thay vì {GMT-5} bởi vì bằng cách xác định một múi giờ điều chỉnh tự động sẽ được được thực hiện nếu tiết kiệm ánh sáng ban ngày đang hoạt động. Chỉ định một cái gì đó như GMT-5 sẽ chỉ điều chỉnh múi giờ GMT theo số giờ được chỉ định.

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