Я должен заменить все e.printStackTrace(); с регистратором. Но есть около 2000 классов. Я могу заменить все в Eclipse, но я должен определить Logger для всех классов. Есть ли решения, которые вы советуете?
Помимо выполнения CTRL
+ H
и нахождения всего e.printStackTrace();
и заменяя их, вы можете использовать альтернативный подход, создав фабрику регистрации.
public class LoggingFactory {
private static LoggingFactory instance;
private Map<Class, Logger> loggers;
public static synchronized LoggingFactory getInstance() {
if(instance == null) {
instance = new LoggingFactory();
}
return instance;
}
public static Logger getLogger(Class clazz) {
synchronized (clazz) {
if(getInstance().loggers.get(clazz) == null) {
getInstance().loggers.put(clazz, Logger.getLogger(clazz.getName()));
}
return getInstance().loggers.get(clazz);
}
}
}
Используя этот класс, вы можете выполнить глобальный поиск и заменить для некоторого регулярного выражения
([\w\d]+)\.printStackTrace\(\);
и замените его на
LoggingFactory.getLogger(this.getClass()).error($1);
при этом убедитесь, что вы внимательно посмотрите на параметры, которые всплывают, и установите флажки регулярных выражений!
e2.printStackTrace();
становится LoggingFactory.getLogger(this.getClass()).error(e2);
Теперь это все равно оставит некоторые ошибки в местах, где статические методы были заменены, но вы можете вернуться и исправить их вручную.
Я чувствую себя немного глупым, но я понял, снова взглянув на этот вопрос, что большинство API регистрации уже построены на фабричном дизайне. Ответ выше по-прежнему действителен и может принести вам пользу, если вы используете собственный Logger или если их метод для получения/создания регистратора недостаточен для замены регулярного выражения.
Поэтому, если вы используете log4j, вы можете просто заменить это регулярное выражение и не использовать LoggingFactory
:
org.apache.log4j.Logger.getLogger(this.getClass()).error($1);
замените e.printStackTrace();
с com.class.path.to.static.Logger.doLog(e);
Если ни один из этих ответов не поможет, я могу дать вам еще одну идею, которая решит проблему, но может потребовать слишком много предварительной работы для ваших вкусов.
Мой лучший ответ на такие проблемы можно суммировать одним словом: Emacs
Я использую Eclipse для всех своих ежедневных задач кодирования, но каждый раз в то время я запускаю задачу мутантов, которая требует мощной среды сценариев, которая также понимает синтаксис файлов, над которыми я работаю.
Для такой проблемы я могу легко увидеть потенциал записи макроса клавиатуры, который делает что-то вроде этого:
Сначала я подготовлю список событий поиска для вещей, над которыми я хочу работать, в этом случае это одна строка из каждого класса с вызовом printStackTrace.
Прекратите запись макроса. Теперь повторите макрос 999999 раз (он останавливается на конце ввода). Теперь вы определили все свои объекты Logger.
Иногда бывает сложно определить правильные шаги, чтобы следовать, но как только вы привыкнете к этому, вы можете сделать некоторые потрясающие массовые преобразования.
Теперь вы сможете выполнить глобальную замену вызовов "printStackTrace()".