2010-09-09 5 views
13

हम कई वेब ऐप्स के लिए log4j से लॉगबैक करने के लिए माइग्रेट कर रहे हैं। हमारे आवेदन के बंद में हम वर्तमान में फोन:क्या लॉगबैक का उपयोग करके बंद होने पर मुझे ईवेंट फ़्लश करना होगा?

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

कौन सा सभी async प्रवेश फ्लश और सभी बाहरी संसाधनों (फाइलें, सॉकेट) बंद करने के लिए माना जाता है।

क्या लॉगबैक में कुछ समान है या क्या यह किसी भी तरह शटडाउन पर स्वचालित रूप से फ्लश करता है?

माइक

+0

दिलचस्प सवाल - मैं वास्तव में कभी नहीं इस बारे में सोचा था। चूंकि आपको बफर आउटपुट में log4j को स्पष्ट रूप से कॉन्फ़िगर करना है, इसलिए मुझे लगता है कि शटडाउन को केवल उस मामले में ही बुलाया जाना चाहिए। मेरा मानना ​​है कि डिफ़ॉल्ट रूप से slf4j बफर, हालांकि। प्रत्येक लॉग स्टेटमेंट के बाद –

+2

लॉगबैक फ्लश करता है, इसलिए जब तक आप कुछ फंकी नहीं कर रहे हैं, तब तक स्पष्ट स्टॉप() कॉल की आवश्यकता नहीं है। –

+2

@ डेविड रूससेल ने उस वक्तव्य को मुझे [लॉगबैक परिशिष्ट] (http://logback.qos.ch/manual/appenders.html) देखा। दरअसल: _By डिफ़ॉल्ट, प्रत्येक लॉग इवेंट तुरंत अंतर्निहित आउटपुट स्ट्रीम में फंस जाता है। यह डिफ़ॉल्ट दृष्टिकोण इस अर्थ में सुरक्षित है कि यदि आपका एप्लिकेशन सही ढंग से बंद करने के बिना बाहर निकलता है तो लॉगिंग ईवेंट खो नहीं जाते हैं। हालांकि, लॉगिंग थ्रूपुट में उल्लेखनीय वृद्धि के लिए, आप अंतर्निहित एनकोडर की तत्काल फ्लश संपत्ति को झूठी पर सेट करना चाह सकते हैं। एनकोडर्स और विशेष रूप से लेआउटप्रैपिंग एन्कोडर को एक अलग अध्याय में वर्णित किया गया है ._ –

उत्तर

0

मैं log4j की तरह एक समग्र प्रबंधक शट डाउन के बारे में पता नहीं कर रहा हूँ लेकिन मैं अपने सभी अलग-अलग संदर्भ वालों बंद करते हैं उनके संदर्भ इसलिए की तरह एक ServletContextListener का उपयोग कर नष्ट हो जाता है:

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); 
} 

इसके अलावा, LoggerContext .stop() svailable है और आंतरिक रूप से कुछ कार्यों को करता है लेकिन मैं इसका उपयोग नहीं करता, इसलिए मैं इस पर टिप्पणी नहीं कर सकता कि यह रीसेट से बेहतर है या नहीं।

7

यहाँ एक सरल तरीका है:

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

ऐसा लगता है कि सिर्फ विन्यास में <shutdownHook/> जोड़ने संदर्भ बंद कर देना चाहिए।

logback docs से:

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

और DelayingShutdownHook summary से:

ShutdownHook कार्यान्वयन कि एक निर्दिष्ट विलंब के बाद Logback संदर्भ बंद हो जाता है। डिफ़ॉल्ट देरी 0 एमएस (शून्य) है।

0

संस्करण 1.1.10 आगे, लॉगबैक वर्तमान लॉगबैक-क्लासिक संदर्भ को रोकने का ख्याल रखता है जब वेब-ऐप रोक दिया जाता है या फिर से लोड किया जाता है।

यहाँ अद्यतन दस्तावेज़ है: https://logback.qos.ch/manual/configuration.html#webShutdownHook

संबंधित मुद्दे