2017-11-08 23 views
6

Trong dự án của tôi, tôi đang sử dụng Logback làm cơ sở ghi nhật ký. Tôi có lớp sauSpring @PreDestroy: Không đăng nhập vì Logback dừng quá sớm

@Component 
class Test { 
    @PreDestroy 
    public void destroy() { 
     try { 
      ... 
     } catch (Exception e) { 
      LoggerFactory.getLogger(getClass()).error(e.getLocalizedMessage(), e); 
     } 
    } 
} 

Bây giờ, tôi không triển khai servlet. Khi một ngoại lệ xảy ra, Logback không in thông báo và theo dõi ngăn xếp. Điều này là do Logback đang dọn dẹp trước khi destroy() được gọi là Mùa xuân. Khi undeploying servlet, đây là lần đầu tiên (và cuối cùng) dòng nhật ký:

15:46:19,084 |-INFO in [email protected]7fe56 - About to stop ch.qos.logback.classic.LoggerContext [default] 

Tôi xác nhận rằng Logback dừng đầu tiên bằng cách thêm một System.out.println("..."); trong destroy().

Có cách nào để sửa lỗi này không?

phụ thuộc của tôi:

<dependencyManagement> 
    <dependencies> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-framework-bom</artifactId> 
      <version>5.0.1.RELEASE</version> 
      <type>pom</type> 
      <scope>import</scope> 
     </dependency> 
     <dependency> 
      <groupId>commons-logging</groupId> 
      <artifactId>commons-logging</artifactId> 
      <version>99-empty</version> 
     </dependency> 
    </dependencies> 
</dependencyManagement> 

<dependencies> 
    <dependency> 
     <groupId>commons-logging</groupId> 
     <artifactId>commons-logging</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.slf4j</groupId> 
     <artifactId>slf4j-api</artifactId> 
     <version>1.7.25</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-core</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-classic</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>ch.qos.logback</groupId> 
     <artifactId>logback-access</artifactId> 
     <version>1.2.3</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-core</artifactId> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-jcl</artifactId> 
    </dependency> 
</dependencies> 

Xin lưu ý rằng spring-jcl được sử dụng để định tuyến commons-logging-slf4j (mà sẽ định tuyến để logback). Tôi không sử dụng jcl-over-slf4j.

+0

có thể trùng lặp của [Spring kết quả @PreDestroy trong đăng nhập một cách ngẫu nhiên không đăng nhập] (https://stackoverflow.com/questions/30426533/springs-predestroy-results-in-logging -năng-không-đăng nhập) – niekname

+0

Tôi nghĩ đó thực sự là vấn đề tương tự. Bất kỳ ý tưởng làm thế nào để vô hiệu hóa tự động tắt từ Logback (các 'LogbackServletContextListener') và tự tắt máy Logback càng muộn càng tốt? Tôi đang ở trong môi trường Tomcat/Spring. –

+0

Cũng trùng lặp với: https://stackoverflow.com/questions/17400136/how-to-log-within-shutdown-hooks-with-log4j2 Đảm bảo bạn đọc câu trả lời của người dùng 'DjDCH' – niekname

Trả lời

4

Có một documented way để vô hiệu hóa để vô hiệu hóa các tên đăng ký lưu của LogbackServletContextListener:

Bạn có thể vô hiệu hóa tự động quá trình cài đặt của LogbackServletContextListener bằng cách thiết lập một tên logbackDisableServletContainerInitializer trong tập tin web.xml của bạn ứng dụng web của . Đây là đoạn mã liên quan.

<web-app> 
    <context-param> 
     <param-name>logbackDisableServletContainerInitializer</param-name> 
     <param-value>true</param-value> 
    </context-param> 
    .... 
</web-app> 

Lưu ý rằng biến logbackDisableServletContainerInitializer cũng có thể được đặt làm thuộc tính hệ thống Java biến môi trường OS. Cài đặt cục bộ nhất có ưu tiên, ví dụ: ứng dụng web đầu tiên, môi trường hệ điều hành thứ hai và môi trường hệ điều hành cuối cùng.

tôi sẽ tưởng tượng có thể bạn sẽ muốn viết móc tắt của riêng bạn nếu điều này là trường hợp và ngăn chặn các LoggerContext

0

Để nhận câu trả lời Dovmo của. Đó là tất cả về đặt hàng. Tôi có cùng một vấn đề trên Tomcat 8.5.x. Về cơ bản, trình khởi tạo thực hiện addListener, bạn không có bất kỳ quyền kiểm soát nào đối với người nghe. Khi tắt máy, Tomcat đảo ngược danh sách đó, chọn trình nghe Logback trước: Spring sẽ không ghi lại bất cứ thứ gì.

Trình nghe tùy chỉnh sẽ không hữu ích vì bạn không thể thêm tiền tố đó. Điều gì làm việc cho tôi trên Tomcat là:

<listener> 
    <listener-class>ch.qos.logback.classic.servlet.LogbackServletContextListener</listener-class> 
</listener> 
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 

<context-param> 
    <param-name>logbackDisableServletContainerInitializer</param-name> 
    <param-value>true</param-value> 
</context-param> 
Các vấn đề liên quan