У меня есть два общедоступных метода, которые я хотел бы отследить. Один из методов многократно вызывает другой. Что я хотел бы сделать, так это отследить только метод, который был вызван извне.
Вот простой класс, чтобы продемонстрировать, что я имею в виду:
public class LoggingExample {
private static final Logger logger = LoggerFactory.getLogger(LoggingExample.class);
public static final String USER_ROOT = "/home/waisbrot";
/** could be called by fileExistsRobust *or* from outside */
public static boolean fileExists(String filename) {
logger.trace("Checking for file {}", filename);
File f = new File(filename);
return f.exists();
}
/** always gets called from outside */
public static boolean fileExistsRobust(String filename) {
logger.trace("Checking for any varient of {}", filename);
if (fileExists(filename))
return true;
for (String prefix : prefixes) { // this list is 100 items long
if (fileExists(prefix + filename));
return true;
}
return false;
}
}
В другом месте моего кода я мог бы вызвать fileExists
, и в этом случае я хочу, чтобы его сообщение журнала было напечатано (при условии, что я его отслеживаю). Но если я вызову fileExistsRobost
, то мне нужно это сообщение журнала, а не fileExists
.
Я хочу, чтобы оба метода были отслежены, но я теряюсь в выводе, когда вызываю второй. Я надеялся, что Logback можно настроить, чтобы понять, чего я хочу, но я не вижу ничего полезного в документации. Я мог бы перевернуть флаг, когда я ввожу fileExistsRobust
, а затем проверить его в fileExists
, но это будет ужасно с более чем одним потоком (поскольку это статические методы), и кажется, что он начинает загрязнять класс большим количеством инфраструктуры ведения журнала. Я мог бы использовать MDC для хранения информации, но это похоже на злоупотребление MDC.
Кто-нибудь уже сталкивался с такой ситуацией? Как ты с этим справился?