26

Right now I am using java.util.logging to log the entry and exit points of each method in my Java project. This is very useful to me when debugging.

I have this piece of code at the beginning of each method and a similar one at the end:

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

Where "methodName" is the the name of the method (hardcoded).

So I was wondering if there is a way to do this automatically without having to include this code in every method.

Paul T.
  • 714
  • 1
  • 9
  • 20

4 Answers4

15

I suggest the use of Aspect Oriented Programming.

For example, using the AspectJ compiler (which can be integrated to Eclipse, Emacs and others IDEs), you can create a piece of code like this one:

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

    }

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

    }
}

This aspect adds a logging code after and before the execution of all methods in the class "Point".

Cristian Ciupitu
  • 20,270
  • 7
  • 50
  • 76
Salles
  • 218
  • 1
  • 7
  • Does it work in offline applications? Which aren't running on a server? – Arturas M Aug 21 '14 at 06:54
  • @ArturasM yes, the AspectJ bytecode is woven into the target classes, so this executes directly in the JVM. So, any JVM compliant to the Java specification can run it. – Keith Feb 10 '17 at 20:15
12

You should look at Aspect oriented programming. I would suggest Spring AOP or AspectJ as something that you should look at.

Also, here's a quick tutorial to help you get started with Logging with Spring AOP

Sujay
  • 6,753
  • 2
  • 30
  • 49
  • But I don't think Spring works in offline applications which aren't running on the server, do they? And what about AspectJ? – Arturas M Aug 21 '14 at 06:54
2

Have you tried to look at slf4j? It has LocationAwareLogger that can collect automatically method name.

user1697575
  • 2,830
  • 1
  • 24
  • 37
1

You should look at Aspect Oriented Programming, particularly the around() joinpoint that would be useful to log the entry and exit of methods that you would like to qualify in the definition.

Vikdor
  • 23,934
  • 10
  • 61
  • 84