Tạo nhiều tệp nhật ký có nội dung khác nhau với log4j


81

Có cách nào để định cấu hình log4j để nó xuất ra các cấp độ ghi nhật ký khác nhau cho các trình phụ trợ khác nhau không?

Tôi đang cố gắng thiết lập nhiều tệp nhật ký. Tệp nhật ký chính sẽ bắt tất cả các thông báo INFO trở lên cho tất cả các lớp. (Trong quá trình phát triển, nó sẽ bắt tất cả các thông báo DEBUG trở lên và TRACE cho các lớp cụ thể.)

Sau đó, tôi muốn có một tệp nhật ký riêng. Tệp nhật ký đó sẽ bắt tất cả các thông báo GỠ LỖI cho một tập hợp con các lớp cụ thể và bỏ qua tất cả các thông báo cho bất kỳ lớp nào khác.

Có cách nào để đạt được những gì tôi đang theo đuổi không?

Cảm ơn, Dan

java  log4j 

3
Ý của bạn là bạn muốn một logfile để nắm bắt GỬI và chỉ GỬI, một logfile khác để nắm bắt INFO và chỉ INFO, v.v.?
Eddie

Câu trả lời:


70

Điều này sẽ giúp bạn bắt đầu:

log4j.rootLogger=QuietAppender, LoudAppender, TRACE
# setup A1
log4j.appender.QuietAppender=org.apache.log4j.RollingFileAppender
log4j.appender.QuietAppender.Threshold=INFO
log4j.appender.QuietAppender.File=quiet.log
...


# setup A2
log4j.appender.LoudAppender=org.apache.log4j.RollingFileAppender
log4j.appender.LoudAppender.Threshold=DEBUG
log4j.appender.LoudAppender.File=loud.log
...

log4j.logger.com.yourpackage.yourclazz=TRACE

3
Dòng cuối cùng làm gì?
djangofan

1
@djangofan thiết lập cấp độ nhật ký gói / lớp tùy chỉnh (tức là com.yourpackage.yourclazz với ghi nhật ký TRACE), mặc dù trong trường hợp này, nó đã là mặc định (được thiết lập trên dòng 1) nên nó không có tác dụng gì. IMO Ví dụ này sẽ tốt hơn nếu rootLogger có INFO và "yourclass" có DEBUG.
Tom Clift

Các thông số của dòng đầu tiên phải là TRACE, QuietAppender, LoudAppender không phải QuietAppender, LoudAppender, TRACE
Richard Whitehead

26

Có lẽ một cái gì đó như thế này?

<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 <!-- general application log -->
 <appender name="MainLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="server.log" />
  <param name="Threshold" value="INFO" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender> 
 <!-- additional fooSystem logging -->
 <appender name="FooLogFile" class="org.apache.log4j.FileAppender">
  <param name="File" value="foo.log" />
  <layout class="org.apache.log4j.PatternLayout">
   <param name="ConversionPattern" value="%-5p %t [%-40.40c] %x - %m%n"/>
  </layout>
 </appender>
 <!-- foo logging -->
 <logger name="com.example.foo">
  <level value="DEBUG"/>
  <appender-ref ref="FooLogFile"/>
 </logger>
 <!-- default logging -->
 <root>
  <level value="INFO"/>
  <appender-ref ref="MainLogFile"/>
 </root>
</log4j:configuration>

Do đó, tất cả các thông báo thông tin được ghi vào server.log; ngược lại, foo.log chỉ chứa các thông báo com.example.foo, bao gồm cả các thông báo cấp gỡ lỗi.


Com.example.foo là một gói hay một lớp?
WowBow

1
@WowBow nó có thể là một trong hai, nhưng với một cái tên như vậy, nó trông giống như một gói. sử dụng tên lớp cho trình ghi nhật ký chỉ là một quy ước
araqnid

Cảm ơn. Tôi đã thử cả hai sau khi tôi yêu cầu và làm việc cho cả hai;)
WowBow

7

Tôi đã có câu hỏi này, nhưng với một sự thay đổi - tôi đang cố gắng đăng nhập các nội dung khác nhau vào các tệp khác nhau. Tôi có thông tin cho nhật ký gỡ lỗi LowLevel và nhật ký người dùng HighLevel. Tôi muốn LowLevel chỉ đi đến một tệp và HighLevel đi đến cả một tệp và syslogd.

Giải pháp của tôi là định cấu hình 3 trình phụ, và sau đó thiết lập ghi nhật ký như sau:

log4j.threshold=ALL
log4j.rootLogger=,LowLogger

log4j.logger.HighLevel=ALL,Syslog,HighLogger
log4j.additivity.HighLevel=false

Phần mà tôi khó tìm ra là 'log4j.logger' có thể có nhiều phần phụ được liệt kê. Tôi đã cố gắng thực hiện từng dòng một.

Hy vọng điều này sẽ giúp ai đó tại một số điểm!


3

Đối với logfile / appender chính, hãy thiết lập .Threshold = INFOgiới hạn những gì thực sự được đăng nhập trong appender ở INFO trở lên, bất kể trình ghi có bật DEBUG, TRACE, v.v. hay không.

Đối với việc bắt DEBUG và không có gì trên đó ... bạn có thể phải viết một appender tùy chỉnh.

Tuy nhiên, tôi khuyên bạn không nên làm điều này, vì có vẻ như nó sẽ khiến việc khắc phục sự cố và phân tích khá khó khăn:

  1. Nếu mục tiêu của bạn là có một tệp duy nhất mà bạn có thể xem để khắc phục sự cố nào đó, thì việc mở rộng dữ liệu nhật ký của bạn trên các tệp khác nhau sẽ gây khó chịu - trừ khi bạn có chính sách ghi nhật ký rất hợp lý, bạn có thể sẽ cần nội dung từ cả GỠ LỖI và THÔNG TIN để có thể theo dõi việc thực thi mã có vấn đề một cách hiệu quả.
  2. Bằng cách vẫn ghi nhật ký tất cả các thông báo gỡ lỗi của mình, bạn sẽ mất bất kỳ lợi ích hiệu suất nào mà bạn thường nhận được trong hệ thống sản xuất bằng cách giảm (cách) ghi nhật ký.

Tôi nên giải thích mục tiêu của mình tốt hơn. Nhật ký chính là để theo dõi lỗi, điều kiện bất thường, v.v. ở bất kỳ đâu trong ứng dụng - nhật ký này bắt buộc phải được giữ nhỏ, vì vậy nó thường xuyên được cuộn qua. Nhật ký đặc biệt theo dõi hành vi của một hệ thống con và cần được lưu giữ trong thời gian dài.

Bạn có muốn loại trừ các thông báo LỖI, CẢNH BÁO, THÔNG TIN khỏi tệp nhật ký thứ hai không?
matt b

và trong XML bạn có thể thêm tham số Threshold như thế này: <appender name = "ERROR_FILE"> <param name = "Threshold" value = "ERROR" /> </ appender>
dao cạo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.