2012-10-04 10 views
13

अभी मैं अपने जावा प्रोजेक्ट में प्रत्येक विधि के प्रवेश और निकास बिंदु लॉग करने के लिए java.util.logging का उपयोग कर रहा हूं। डीबगिंग करते समय यह मेरे लिए बहुत उपयोगी है।जावा में विधियों के प्रवेश/निकास को स्वचालित रूप से लॉग कैसे करें?

if (logger.isLoggable(Level.FINER)) { 
    logger.entering(this.getClass().getName(), "methodName"); 
} 

कहाँ "methodName" विधि का नाम है (hardcoded):

मैं प्रत्येक विधि की शुरुआत में कोड के इस टुकड़े और अंत में एक समान एक है।

तो मैं सोच रहा था कि प्रत्येक विधि में इस कोड को शामिल किए बिना स्वचालित रूप से ऐसा करने का कोई तरीका है या नहीं।

उत्तर

10

मैं आस्पेक्ट ओरिएंटेड प्रोग्रामिंग के उपयोग का सुझाव देता हूं।

उदाहरण के लिए, AspectJ संकलक (जो ग्रहण करने के लिए, Emacs और दूसरों IDEs एकीकृत किया जा सकता) का उपयोग कर, आप इस तरह कोड का एक टुकड़ा बना सकते हैं:

aspect AspectExample { 
    before() : execution(* Point.*(..)) 
    { 
     logger.entering(thisJoinPointStaticPart.getSignature().getName(), thisJoinPointStaticPart.getSignature().getDeclaringType() ); 

    } 

    after() : execution(* Point.*(..)) 
    { 
     logger.exiting(thisJoinPointStaticPart.getSignature().getName() , thisJoinPointStaticPart.getSignature().getDeclaringType() ); 

    } 
} 

इस पहलू के बाद एक प्रवेश कोड जोड़ता और कक्षा "प्वाइंट" में सभी विधियों के निष्पादन से पहले।

+0

क्या यह ऑफ़लाइन अनुप्रयोगों में काम करता है? जो सर्वर पर नहीं चल रहे हैं? –

+0

@ArturasM हां, AspectJ बाइटकोड लक्षित वर्गों में बुना हुआ है, इसलिए यह सीधे JVM में निष्पादित होता है। इसलिए, जावा विनिर्देश के अनुरूप कोई भी JVM इसे चला सकता है। – Keith

12

आपको Aspect oriented programming पर देखना चाहिए। मैं Spring AOP या AspectJ सुझाऊंगा जैसा कि आपको देखना चाहिए।

इसके अलावा, यहाँ मदद करने के लिए आप Logging with Spring AOP

+0

लेकिन मुझे नहीं लगता कि स्प्रिंग, ऑफ़लाइन अनुप्रयोगों जो सर्वर पर नहीं चल रहे हैं में काम करता है कि वे कार्य करें:

इसके अलावा, इस ब्लॉग पोस्ट विवरण बताते जाँच? और AspectJ के बारे में क्या? –

1

साथ आरंभ करने के लिए आप, Aspect Oriented Programming पर गौर करना चाहिए, विशेष रूप से around() joinpoint कि प्रवेश और तरीकों कि आप में अर्हता प्राप्त करना चाहते हैं के निकास लॉग इन करने के लिए उपयोगी होगा एक त्वरित ट्यूटोरियल है परिभाषा।

2

क्या आपने slf4j पर देखने की कोशिश की है? इसमें LocationAwareLogger है जो स्वचालित रूप से विधि का नाम एकत्र कर सकता है।

4

जैसा कि पहले ही सुझाव दिया, jcabi-aspects से @Loggable टिप्पणी के साथ AOP का उपयोग करें (मैं एक डेवलपर हूँ):

@Loggable(Loggable.DEBUG) 
public String load(URL url) { 
    return url.openConnection().getContent(); 
} 

पुस्तकालय भी एक AOP पहलू है जो इन टिप्पणियों को समझता है और स्वचालित रूप से विधि कॉल, उनके तर्कों लॉग होता है, और SLF4J के माध्यम से निष्पादन समय। http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html

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