Бывают ситуации, когда кроме какого-либо сообщения хочется залогировать имя класса, имя метода или даже номер строки, на которой в данной момент происходит выполнение кода. Если с именем класса все более-менее понятно – достаточно в функцию логирования передать ссылку на класс – то с именем метода такой фокус не пройдет. Но и эта проблема решается достаточно просто.

Для этого необходимо создать инстанс класса Throwable и получить из него текущий стэк вызовов. Найти нужный нам элемент стэка и получить оттуда всю необходимую информацию: объект класса, имя класса, имя метода и, даже, номер строки.

Ниже представлен кусок кода, где показато как это может быть реализовано.

public class Test
{
 public static void main(String[] args)
 {
 new Test().execute();
 }

 public void execute()
 {
 log("Some message");
 }

 public static void log(String message)
 {
 Throwable t = new Throwable();
 StackTraceElement trace[] = t.getStackTrace();

 // Глубина стэка должна быть больше 1-го, поскольку интересующий
 // нас элемент стэка находится под индексом 1 массива элементов
 // Элемент с индексом 0 - это текущий метод, т.е. log
 if (trace.length > 1)
 {
 StackTraceElement element = trace[1];
 System.out.format("[%s] [%s, %d] %s", element.getClassName(), element.getMethodName(), element.getLineNumber(), message);
 }
 else
 System.out.format("[no info] %s", message);
 }
}