Динамический пропуск сообщений журнала

У меня есть два общедоступных метода, которые я хотел бы отследить. Один из методов многократно вызывает другой. Что я хотел бы сделать, так это отследить только метод, который был вызван извне.

Вот простой класс, чтобы продемонстрировать, что я имею в виду:

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.

Кто-нибудь уже сталкивался с такой ситуацией? Как ты с этим справился?


person Nathaniel Waisbrot    schedule 17.03.2013    source источник


Ответы (1)


Я предполагаю, что вы можете изменить код. Тогда, на мой взгляд, самый простой способ избежать проблемы, введя еще один internalFileExists(String filename) или перегрузив fileExists(String filename) с помощью инструмента ведения журнала:

public static boolean fileExists(String filename, boolean doLog) {
   if (doLog) logger.trace("Checking for file {}", filename);
   File f = new File(filename);
   return f.exists(); 
}

и пусть fileExistsRobust использует перегруженную версию с doLog = false, в то время как версия с одним аргументом перенаправляется на fileExists(имя файла, правда).

Это не решает проблему, но смягчает ее.

person Pyranja    schedule 17.03.2013
comment
Мне нравится частное внутреннее решение, о котором вы упомянули первым. - person Nathaniel Waisbrot; 19.03.2013