будь спокоен
Как мы все знаем, журналы являются важным средством устранения неполадок. Об оформлении лога и о том, как найти проблему за секунды по ссылке [user report], мы поговорим в следующем выпуске (не рутинном), в этом выпуске я в основном расскажу о том,在没有异常日志的情况下
, как найти проблему. Никакой журнал не может действительно решить проблему, это не будет вечеринка в заголовках!
Дело номер один
Получите код [dubbo-spring-boot-project] с крупнейшего сайта гей-знакомств.
Затем запустите демо.
Эта сцена адаптирована из реального дела, потому что код компании сложен и неудобен для раскрытия, и эту демонстрацию можно найти на github, что не только обеспечивает оригинальный колорит, но и позволяет каждому легко испытать процесс расследования.
Хорошо, давайте настроимowner = "feichao"
, то посмотрите на консоль
все нормально
Затем, когда я установилowner = "feichaozhenshuai!"
, начать сначала
Вроде бы все нормально, так что давайте взглянем на консоль.
Какова ситуация, почему бы и нет?owner
уже?
В какой части проблема? На самом деле, когда Фэй Чао столкнулся с этой проблемой в компании, ситуация была намного сложнее. Потому что если в бизнесе компании нет собственника, в процессе работы будут возникать какие-то другие исключения, и бизнес компании здесь не будет расширяться.feichaozhenshuai!
Это не работает, тогда я установил его на肥朝大帅比
Компьютер взорвется? ? ?
Общий错误做法
Да, скинь скриншот этого вопроса в группу и спроси "Вы когда-нибудь сталкивались с проблемой, что в даббо не действует настройка владельца?"
И [Поклонники Настоящей Любви], которые подписались на официальный аккаунт Feichao, спросят: «Настройка владельца в даббо не действует. Как вы думаете, мне нужно исследовать проблему под другим углом?». Как только я вижу такую правильную постановку вопроса, мне становится стыдно, что я тебе не отвечаю. Хорошо, вернемся к теме, на данный момент журнала ошибок нет, но настройка не удалась, каковы наши методы устранения неполадок?
обычный
Найдите метод set напрямую, чтобы увидеть, принял ли код решение предотвратитьowner
установить в поле肥朝真帅
это слово,避免把帅这件事走漏风声!
. Такой анализ кажется вполне разумным, правда, так как же быстро найти этот метод множества? Как показано
public void setOwner(String owner) {
checkMultiName("owner", owner);
this.owner = owner;
}
мы следимcheckMultiName
найдено после кода
protected static void checkProperty(String property, String value, int maxlength, Pattern pattern) {
if (StringUtils.isEmpty(value)) {
return;
}
if (value.length() > maxlength) {
throw new IllegalStateException("Invalid " + property + "=\"" + value + "\" is longer than " + maxlength);
}
if (pattern != null) {
Matcher matcher = pattern.matcher(value);
if (!matcher.matches()) {
throw new IllegalStateException("Invalid " + property + "=\"" + value + "\" contains illegal " +
"character, only digit, letter, '-', '_' or '.' is legal.");
}
}
}
Из описания исключения видно, что исходныйowner
внутри поддерживается только-
а также_
такие специальные символы,!
Он не поддерживается, поэтому установка его как неудачного не имеет ничего общего с тем, красив Фей Чао или нет, и не имеет ничего общего со следующим:!
актуально. Блин, оказывается, Фэй Чао слишком много думал и добавил себе драмы! ! !
Конечно, Фей Чао может сказать вам, что в более поздней версии эта ошибка исправлена, и в журнале будут видны исключения. Как вы думаете, на данный момент проблема решена?
Я считаю, что многие фейковые фанаты закроют статью в это время, или в следующий раз, когда Фей Чао опубликует некоторые статьи, которые им не нравится читать (вы знаете), они откажутся от нее, но Фей Чао хочет сказать, медленно вниз! ! !
Что вы думаете, если вы столкнетесь с подобными проблемами в будущем? И исходники очень глубокие, это не простой поискset
Метод настолько прост, что на этот раз я нашел для вас установленный метод и решил проблему, это просто偶然成功
. Поэтому я неоднократно подчеркивал, что мы должны продолжать уделять внимание династии Фэй и осваивать больше упражнений. Это попытка заставить вас обратить внимание? Я ясно люблю тебя!
Ну, а если вы столкнетесь с некоторыми吞掉异常
, или по какой-то причине日志没打印
, как мы проверим?
Рутина два
Мы знаем, что в idea есть много полезных функций, таких как предыдущая [Посмотрите на исходный код, почему я рекомендую идею? ] упоминается в条件断点
, кроме того, есть недооцененная всеми особенность, называемая异常断点
.
Фэй Чао взглянул на него, все слова в нем — это английские слова начальной школы, так что я не буду слишком много объяснять, как их использовать. Когда мы сталкиваемся с этой проблемой, мы можем установить такие точки останова исключения.
Это работает следующим образом:
Таким образом, во время работы он быстро обнаружит ненормальное положение. После краткого анализа должно быть легко найти проблему.
Вы немного чувствуете? Тогда давайте попрактикуемся в другом вопросе.
Случай 2
Давайте сначала посмотрим на вопросы, заданные фан-группой Фэй Чао перед этим.
Учитывая, что некоторых вентиляторов нет в группе, опишу вкратце проблему этого вентилятора, в его коде есть исключение, а потом он ловит лог исключения, но лог не выводится.
Конечно, не беда, если вы до сих пор не понимаете.Я построил для вас демонстрацию самой простой модели на основе вопроса фаната.Хотя модель проста, проблема та же, оригинальный аромат, знакомый формула и знакомый вкус. Адрес git выглядит следующим образом: [git ee.com/hello Toby/ это…
@Slf4j
public class HelloSpringApplicationRunListener implements SpringApplicationRunListener {
public HelloSpringApplicationRunListener(SpringApplication application, String[] args) {
}
@Override
public void starting() {
}
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
throw new RuntimeException("欢迎关注微信公众号【肥朝】");
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
}
@Override
public void finished(ConfigurableApplicationContext context, Throwable exception) {
}
}
Вы обнаружите, что процесс останавливается, как только он запускается, и журнал вообще отсутствует. Когда большинство фейковых фанатов сталкиваются с такой ситуацией, они в тугой хризантеме и понятия не имеют, а потом идут в группу спрашивать "Вы когда-нибудь сталкивались, Springboot собирается и процесс ушел, но нет проблемы с логом ?». Правильная поза вопрошания уже была подчеркнута Фей Чао, поэтому я не буду здесь много говорить. Затем мы используем процедуру устранения неполадок, которую мы изучили ранее, а затем переходим к другой волне.
Проследим за стеком исключений
Из кода мы видим два ключевых слова [reportFailure] и [context.close()].После точки останова мы обнаружили, что действительно сначала печатается лог, а затем контейнер закрывается. Но почему сначала выполняется лог, а потом выключается контейнер, а контейнер выключается, когда лог не выводится? Поскольку в этой демонстрации журнал является полностью асинхронным, а контейнер закрывается до выполнения асинхронного журнала, в результате чего журнал не выводится.
Проблема у этого вентилятора похожая, в юнит-тесте не выводится асинхронный лог в коде, и процесс выполнения юнит-теста останавливается. Зная принцип, решение тоже очень простое, например, самое простое — заснуть в конце юнит-теста и дождаться вывода лога.
При использовании Springboot такое часто встречается: при запуске возникает исключение, но лог асинхронный, и контейнер останавливается до вывода лога, в результате чего лога исключений нет. Зная принцип, чтобы полностью решить проблему такого рода, вы можете добавитьSpringApplicationRunListener
.
/**
* 负责应用启动时的异常输出
*/
@Slf4j
public class OutstandingExceptionReporter implements SpringApplicationRunListener {
public OutstandingExceptionReporter(SpringApplication application, String[] args) {
}
@Override
public void starting() {
}
@Override
public void environmentPrepared(ConfigurableEnvironment environment) {
}
@Override
public void contextPrepared(ConfigurableApplicationContext context) {
}
@Override
public void contextLoaded(ConfigurableApplicationContext context) {
}
@Override
public void finished(ConfigurableApplicationContext context, Throwable exception) {
if (exception != null) {
log.error("application started failed",exception);
try {
Thread.sleep(100);
} catch (InterruptedException e) {
log.error("application started failed", e);
}
}
}
}
Еще одно слово, на самом деле, лог не может быть выведен.Помимо этого случая асинхронного лога, есть много ситуаций, таких как конфликты логов и т. Д. Есть еще много процедур устранения неполадок. Поэтому рекомендуется продолжать платить Внимание Каждой рутиной я хочу поделиться с вами!