Я согласен с Робом, что это вообще не нужно.Обычно в сообщении есть какая-то отдельная строка, поиск которой приведет к источнику.С хорошей IDE это действительно быстро.
Теперь, учитывая вопрос как есть, это возможное решение:
Class Foo
void bar()
new Logger(){} . warn("blah");
для каждого действия журнала во время выполнения, создается новый объект- это не проблема.
для каждой строки источника, содержащей такой оператор журнала, создается новый класс.это может быть слишком много.
вот как работает магия:
abstract public class Logger
static Map<Class, String> sourceInfo = new ...
public Logger()
Class thisClass = this.getClass();
String info = sourceInfo.get(thisClass);
if(info==null)
info = ... // init from stack trace
sourceInfo.put(thisClass,info)
this.info = info
public void warn(msg)
log(WARN, this.info,msg)