Ну, логгеры идеально настроены на уровне класса. Поэтому, если C нужен собственный Logger, объявите свой собственный Logger в C, например.
private static final Logger logger = Logger.getLogger(C.class.getName());
Таким образом, когда C запускает некоторый код, он регистрируется в своем собственном Logger, а когда B запускает, он регистрирует в своем собственном Logger. Вы сможете ясно увидеть, какой класс записывает, что таким образом.
Если это не то, что вам нужно, пожалуйста, расширите вопрос тем, чего вы пытаетесь достичь и почему.
Я не уверен, что следующий код является хорошей идеей (я всегда хочу, чтобы класс, который физически выполняет код, был Logger), но он должен работать:
public abstract class A extends Thread {
@Override
public abstract void run();
protected abstract Logger getLogger();
}
public class B extends A {
private static final Logger logger = Logger.getLogger(B.class.getName());
@Override
public void run() {
getLogger().info("B");
}
@Override
protected Logger getLogger() {return logger;);
}
public class C extends B {
private static final Logger logger = Logger.getLogger(C.class.getName());
@Override
protected Logger getLogger() {return logger;);
}