2010-09-09 37 views
13

Chúng tôi đang di chuyển sang logback từ log4j cho một số ứng dụng web. Khi tắt ứng dụng của chúng tôi, chúng tôi hiện đang gọi:Tôi có cần xóa các sự kiện khi tắt bằng cách sử dụng logback không?

org.apache.log4j.LogManager.shutdown(); 

Được cho là xóa tất cả tài khoản bên ngoài và đóng tất cả tài nguyên bên ngoài (tệp, ổ cắm).

Có điều gì tương tự trong logback hay không bằng cách nào đó tự động tuôn ra khi tắt máy?

Mike

+0

Câu hỏi thú vị - Tôi chưa bao giờ thực sự nghĩ về điều này. Vì bạn phải cấu hình rõ ràng log4j đến đầu ra bộ đệm, tôi đã giả định rằng việc tắt máy chỉ có thể phải được gọi trong trường hợp đó. Mặc dù vậy, tôi tin rằng bộ đệm slf4j mặc định. –

+2

logback tuôn ra sau mỗi câu lệnh đăng nhập, do đó, không cần phải có lệnh stop stop() trừ khi bạn đang làm điều gì đó sôi nổi. –

+2

@DavidRoussel Tuyên bố đó khiến tôi tra cứu [Logback Appenders] (http://logback.qos.ch/manual/appenders.html). Thật vậy: _Bởi mặc định, mỗi sự kiện nhật ký được xóa ngay lập tức cho luồng đầu ra cơ bản. Cách tiếp cận mặc định này an toàn hơn theo nghĩa là các sự kiện ghi nhật ký sẽ không bị mất trong trường hợp ứng dụng của bạn thoát mà không đóng đúng các ứng dụng. Tuy nhiên, để tăng đáng kể lưu lượng đăng nhập, bạn có thể muốn đặt thuộc tính instantFlush của Bộ mã hóa cơ bản thành sai. Bộ mã hóa và cụ thể là LayoutWrappingEncoder được mô tả trong một chương riêng biệt._ –

Trả lời

0

Tôi không biết của một shutdown manager tổng thể như log4j nhưng tôi đóng tất cả các logger bối cảnh cá nhân của tôi khi bối cảnh của họ bị phá hủy bằng cách sử dụng ServletContextListener như vậy:

ContextSelector selector = StaticLoggerBinder.getSingleton().getContextSelector(); 
LoggerContext context = selector.detachLoggerContext(contextName); 
if (context != null) { 
    Logger logger = context.getLogger(Logger.ROOT_LOGGER_NAME); 
    context.reset(); 
} else { 
    System.err.printf("No context named %s was found", contextName); 
} 

Ngoài ra, LoggerContext .stop() là svailable và thực hiện một số chức năng tương tự trong nội bộ nhưng tôi không sử dụng nó, vì vậy tôi không thể bình luận về việc nó tốt hơn là đặt lại hay không.

7

Dưới đây là một phương pháp đơn giản:

import org.slf4j.ILoggerFactory; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 

import ch.qos.logback.classic.LoggerContext; 

... 

ILoggerFactory loggerFactory = LoggerFactory.getILoggerFactory(); 
// Check for logback implementation of slf4j 
if (loggerFactory instanceof LoggerContext) { 
    LoggerContext context = (LoggerContext) loggerFactory; 
    context.stop(); 
} 
7

Dường như chỉ thêm <shutdownHook/> vào cấu hình nên dừng lại bối cảnh.

Từ logback docs:

<configuration> 
    <!-- in the absence of the class attribute, assume 
    ch.qos.logback.core.hook.DelayingShutdownHook --> 
    <shutdownHook/> 
    .... 
</configuration> 

Và từ DelayingShutdownHook summary:

thực hiện ShutdownHook mà dừng lại bối cảnh Logback sau khi một sự chậm trễ nhất định. Độ trễ mặc định là 0 ms (không).

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