2009-04-08 26 views
80

Có cách nào để định cấu hình log4j để nó xuất các mức ghi nhật ký khác nhau cho các ứng dụng khác nhau không?Tạo nhiều tệp nhật ký có nội dung khác nhau với log4j

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ẽ nhận tất cả các thông báo INFO và ở trê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 và ở trên, và TRACE đối với 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 DEBUG cho một tập hợp con các lớp cụ thể và bỏ qua tất cả các thư cho bất kỳ lớp nào khác.

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

Cảm ơn, Dan

+3

Bạn có nghĩa là bạn muốn một logfile chụp DEBUG và chỉ DEBUG, một tệp nhật ký khác để nắm bắt INFO và chỉ INFO, v.v.? – Eddie

Trả lời

3

Đối logfile chính/appender, thiết lập một .Threshold = INFO để hạn chế những gì đang thực sự đăng nhập appender để INFO trở lên, bất kể có hay không các logger có DEBUG, TRACE, vv , được bật.

Để 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 nên không làm điều này, vì nó có vẻ như nó sẽ làm cho xử lý 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 tin duy nhất nơi bạn có thể tìm kiếm một cái gì đó để khắc phục sự cố, sau đó kéo dài dữ liệu nhật ký của bạn trên các tệp khác nhau sẽ gây phiền toái - trừ khi bạn có chính sách ghi nhật ký rất trung thực, bạn có thể cần nội dung từ cả DEBUG và INFO để 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 bạn, bạn sẽ mất đi 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 tắt tính năng ghi nhật ký (xuống).
+0

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 cứ nơi nào trong ứng dụng - nhật ký này được yêu cầu phải được giữ nhỏ, do đó, nó cuộn qua thường xuyên. Nhật ký đặc biệt theo dõi hành vi của một hệ thống phụ và cần được lưu giữ trong một thời gian dài. –

+0

Bạn có muốn loại trừ các tin nhắn ERROR, WARN, INFO từ tệp nhật ký thứ hai không? –

+0

và trong XML bạn có thể thêm tham số Threshold như thế này: razor

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 
+6

Bình chọn lên, nhưng có một lỗi đánh máy trên dòng 4 : log4j.appender.LoudAppender.Threshhold = INFO phải là log4j.appender.QuierAppender.Threshhold = INFO, không? – Olivier

+0

Vâng, tôi nghĩ điều đó đúng. Tôi chỉ đọc từ tài liệu và không kiểm tra trước;) – jasonnerothin

+0

một số biên tập viên? Chúng tôi cần một số biên tập viên? Daniel, bạn có thể xác thực câu trả lời của mình không? – enguerran

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> 

Vì vậy, tất 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 điệp com.example.foo, bao gồm các thông báo mức gỡ lỗi.

+0

Có phải là gói com.example.foo hay một lớp không? – WowBow

+1

@WowBow nó có thể là một trong hai, nhưng với một tên như thế nó trông giống như một gói. sử dụng tên lớp cho logger chỉ là một quy ước – araqnid

+0

Cảm ơn. Tôi đã thử cả hai sau khi tôi hỏi 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 twist - Tôi đã cố gắng để đăng nhập nội dung khác nhau để các tập tin khác nhau. Tôi đã có thông tin cho bản ghi gỡ lỗi LowLevel và nhật ký người dùng HighLevel. Tôi muốn LowLevel chỉ đến một tệp và HighLevel để đi tới cả tệp và một syslogd.

Giải pháp của tôi là để cấu hình 3 appenders, và sau đó thiết lập các ghi như thế này:

log4j.threshold=ALL 
log4j.rootLogger=,LowLogger 

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

Phần đó là khó khăn cho tôi để tìm ra được rằng 'log4j.logger' có thể có nhiều appenders liệt kê. Tôi đã cố gắng để làm điều đó một dòng tại một thời điểm.

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

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