2012-11-29 41 views
40

Tôi gặp sự cố với thông báo tường trình trùng lặp khi ghi vào nhiều tệp nhật ký bằng cách sử dụng log4j.Log4j: Nhiều nhật ký, cấp độ và ứng dụng

Hiện nay tôi đang cố gắng để đăng nhập INFO dữ liệu cấp (và trở lên) cho logger cụ thể có tên foobar trong tập tin foo.log tôi và sau đó tất cả các thư WARN mức log (và trở lên) cho tất cả logger trong file bar.log . Do đó, các thông điệp tường trình trùng lặp được ghi vào tệp foo.log (mỗi dòng được ghi hai lần) và sau một số nghiên cứu nhanh, tôi nhận thấy đề xuất sửa lỗi này là thêm log4j.additivity.foobar=false vào tệp thuộc tính của tôi.

Vấn đề ở đây là mặc dù nó dừng lại dòng trùng lặp, các WARN nhắn từ foobar logger không bao giờ được ghi vào tệp bar.log.

My tập tin thuộc tính log4j như sau:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO, FOO 
log4j.additivity.foobar = false 

log4j.appender.FOO = org.apache.log4j.RollingFileAppender 
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout 
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.FOO.File = foo.log 

log4j.appender.BAR = org.apache.log4j.RollingFileAppender 
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout 
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.BAR.File = bar.log 

Có ai biết làm thế nào tôi có thể viết các thông điệp log cho cả file log (như nó đã làm trước khi tôi bắt đầu thiết lập các additivity tài sản) và vẫn ngăn chặn các thông điệp tường trình trùng lặp?

Xin lưu ý, đây là bản tóm tắt đơn giản về sự cố. Trong kịch bản thế giới thực có nhiều nhật ký và nhiều hơn hai tệp nhật ký

Trả lời

54

Sự cố này có thể được giải quyết trong hai phần.

1. Ngăn chặn trùng điệp

Nhật ký thông điệp được viết hai lần vì chúng tôi liệt kê các FOO appender trong cả rootLoggerlog4j.logger.foobar mục đăng nhập. Vì vậy, chúng ta phải loại bỏ các appender và chỉ xác định mức độ khai thác gỗ trong thể loại:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO 

Điều này có nghĩa rằng INFO điệp mức từ log4j.logger.foobar được truyền lên tới TẤT CẢ các logger các appenders trong rootLogger, nhưng sẽ chỉ được ghi vào từng tệp nhật ký một lần.

2. Ngăn chặn INFO nhắn mức được ghi vào bar.log

Vì tất cả những thông điệp log mức INFO cho các loại log4j.logger.foobar đang được thừa hưởng bởi appenders trong rootLogger , chúng tôi cần phải dừng ứng dụng BAR để ghi lại thông báo mức INFO.

Chúng ta có thể đạt được điều này bằng cách thiết lập Threshold tài sản trên BAR appender bản thân:

log4j.appender.BAR.Threshold = WARN 

này sẽ ngăn chặn những điều khoản mức INFO được ghi lại trong bar.log tập tin như nó sẽ chỉ chấp nhận các mức WARN trở lên.

Vì vậy, hoàn chỉnh các thuộc tính tập tin log4j sẽ như sau:

log4j.rootLogger = WARN, FOO, BAR 
log4j.logger.foobar = INFO 

log4j.appender.FOO = org.apache.log4j.RollingFileAppender 
log4j.appender.FOO.layout = org.apache.log4j.PatternLayout 
log4j.appender.FOO.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.FOO.File = foo.log 
log4j.appender.FOO.Threshold = INFO 

log4j.appender.BAR = org.apache.log4j.RollingFileAppender 
log4j.appender.BAR.layout = org.apache.log4j.PatternLayout 
log4j.appender.BAR.layout.ConversionPattern = %d{ISO8601} %-5p %c ~ %m%n 
log4j.appender.BAR.File = bar.log 
log4j.appender.BAR.Threshold = WARN 
+0

này là tất cả tốt đẹp và tốt, nhưng điều này không phải là những gì được yêu cầu. Làm thế nào để phân biệt này bằng logger? câu hỏi ban đầu chỉ cho biết 'foobar' chuyển sang foo, và tất cả logger bao gồm foobar đi tới thanh –

+0

Câu hỏi yêu cầu một giải pháp trong đó tất cả các thông điệp' INFO' cho bộ ghi 'foobar' đi tới tệp' foo.log' và tất cả ' WARN' tin nhắn cho tất cả các logger đi đến tập tin 'bar.log' (và cũng rằng mỗi thông điệp tường trình chỉ được viết một lần trong tập tin thích hợp). –

+0

không, __all logger__, không chỉ 'foobar' được gửi đến' bar.log'. Theo câu hỏi: "Hiện tại tôi đang cố gắng ghi dữ liệu cấp" INFO' cho trình ghi cụ thể có tên 'foobar' trong tệp foo.log của tôi và sau đó tất cả thông báo nhật ký cấp độ' WARN' cho __all loggers__ trong thanh. tệp nhật ký. " –

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