2008-11-06 26 views
29

Tôi muốn nhật ký cuộn lại miễn là ứng dụng đang chạy, nhưng tôi muốn nhật ký bắt đầu mới khi ứng dụng được khởi động lại.Làm cách nào để tôi log4j xóa nhật ký khi khởi động?

Cập nhật: Dựa trên erickson's phản hồi, appender của tôi trông như thế này:

<appender name="myRFA" class="org.apache.log4j.RollingFileAppender"> 
     <param name="File" value="my-server.log"/> 
     <param name="Append" value="false" /> 
     <param name="MaxFileSize" value="10MB"/> 
     <param name="MaxBackupIndex" value="10"/> 
     <layout class="org.apache.log4j.PatternLayout"> 
     <param name="ConversionPattern" 
      value="%d{ISO8601} %p - %t - %c - %m%n"/> 
     </layout> 
    </appender> 

tôi chỉ cần thêm dòng sau:

<param name="Append" value="false" /> 

Nó bây giờ truncates các tập tin đăng nhập cơ sở lúc khởi động nhưng nó chỉ để các tệp được cuộn một mình.

+7

Đối với những người không sử dụng định dạng XML của tệp thuộc tính: log4j.appender.file.Append = false –

Trả lời

38

Nếu bạn đặt thông số append thành false, tệp nhật ký cơ sở sẽ "bắt đầu mới" khi ứng dụng khởi động lại. Bạn có nghĩa là bạn muốn xóa bất kỳ tệp nhật ký "cuộn" nào không?

+0

Không, tệp "được cuộn" có thể tồn tại. Tôi chỉ muốn tệp nhật ký cơ bản được xóa để khi tôi gỡ lỗi, tôi không phải đánh bắt cá thông qua các mục cũ cho kết quả gần đây nhất. – braveterry

+2

Lưu ý rằng append = false * ghi đè * tệp nhật ký hiện tại thay vì cuộn (sao lưu) tệp đó. – Pino

+0

Thật không may, việc rollover chỉ xảy ra khi JVM khởi động lại, do đó nếu bạn sử dụng công cụ xây dựng liên tục, điều này sẽ không hoạt động. –

5

Tôi đã viết một số mã tùy chỉnh để tìm số RollingFileAppender (khó truy cập nhất vào log4j!) Mà sau đó tôi phải quay lại. Tôi đã điều chỉnh mã của tôi dưới đây để sử dụng một lần. Tôi sử dụng mã tương tự như lúc khởi động ứng dụng này để buộc các bản ghi của tôi cuộn (nếu không trống) vì vậy tôi luôn bắt đầu trong nhật ký mới nhưng không bao giờ xóa bất kỳ nhật ký nào nhưng cũ nhất.

Mã này có một Trình ghi nhật ký cụ thể và lặp lại cấu trúc phân cấp trình ghi nhật ký cho đến khi tìm thấy Trình ghi có Trình gắn thêm. Nếu nó không bao giờ làm, thì nó bỏ cuộc. Nếu có, nó lặp đi lặp lại trên tất cả các ứng dụng gắn liền với Logger đó và cho mỗi ứng dụng đó là một RollingFileAppender, nó buộc đăng nhập cuộn.

Một cái gì đó như thế này nên dễ dàng hơn nhiều để thực hiện trong log4j, nhưng tôi đã không tìm thấy một cách đơn giản hơn để làm điều đó.

public void rollLogFile(Logger logger) { 
    while (logger != null && !logger.getAllAppenders().hasMoreElements()) { 
    logger = (Logger)logger.getParent(); 
    } 

    if (logger == null) { 
    return; 
    } 

    for (Enumeration e2 = logger.getAllAppenders(); e2.hasMoreElements();) { 
    final Appender appender = (Appender)e2.nextElement(); 
    if (appender instanceof RollingFileAppender) { 
     final RollingFileAppender rfa = (RollingFileAppender)appender; 
     final File logFile = new File(rfa.getFile()); 
     if (logFile.length() > 0) { 
     rfa.rollOver(); 
     } 
    } 
    } 
} 
Các vấn đề liên quan