Xiaobai учится регистрировать

Java Java EE

предисловие

Только лысая голова может стать сильнее.

Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…

Помните, что я писал раньше:После прочтения "Руководства по разработке Java для Alibaba", т.к. с "логированием" при самообучении раньше особо не контактировал, поэтому "протокол логирования" в "Руководстве" отложил.

И я написал один ранее:В чем разница между проектами, которые вы делаете в компании, и проектами, которые вы делаете в школе?Упоминается в: проекты компании не будут иметьe.printStackTrace();наличие такого кода. Потому что это выводит сообщение об ошибкени даты, ни оценкиПодождите, неудобно анализировать.

Ходить на сервер для проверки логов на работе — очень и очень распространенная операция, поэтому в начале я написал еще одну статью.Обычно используемые команды Linux на работеЯ расскажу о команде Linux, которая проверяет журнал внутри.

Я подумал, что, поскольку я некоторое время был в контакте с журналом, я мог бы также оглянуться назад в «Руководство», чтобы увидеть, на что обратить внимание, поэтому у меня есть эта заметка.

1. Основы логирования в Java

Когда я учился сам, я писал только следующий код для устранения неполадок:

try {
   // doSomething
} catch (Exception e) {
    e.printStackTrace();
}
----------
// 查看某个数据的值时:
System.out.println(xxxx);

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

LOGGER.info("begin to run Java3y:{}", id);
----
LOGGER.error("excepiton occurs when run Java3y {}, exception{}", id, e.toString());

При использованииe.printStackTrace();Если да, то неудобно анализировать информацию, напечатанную в контроле:

打印在控制的信息分析不方便

И делим информацию накласс и времяОн записывается на диск сервера, в случае возникновения проблемы можно найти соответствующий лог по соответствующей информации (это очень удобно проверить):

服务器上的日志信息

Давайте посмотрим, как выглядит общий журнал:

日志长的是什么样的

Например: Сейчас кто-то приходит сообщить, что пользователь XX, похоже, не может получать текстовые сообщения, дайтеВремя отправки и идентификатор пользователя, статус отправки пользователя в нашей системе мы можем узнать по логу (например: state:81 на картинке, мы считаем это статусом успешной отправки)

Итак, вот вопрос, мыгде войти? На самом деле инструкция уже дала ответ:

Внимательно зарегистрируйтесь. Подавить вывод журнала отладки в производственной среде; опционально выводить информационный журнал; если включено

Используйте предупреждение для записи информации о бизнес-поведении, когда оно просто находится в сети,Обязательно обратите внимание на объем вывода журнала и избегайте установки диска сервера

лопаться, и не забудьте вовремя удалить эти журналы наблюдений.

Выводится большое количество недействительных журналов, что не способствует повышению производительности системы и быстрому обнаружению точек ошибок. При регистрации подумайте о:Эти

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

1.1 Что такое РБИ?

Наиболее распространенный способ регистрации — распечаткаИнформация о выполнении программы, который используется для быстрого обнаружения и устранения неполадок. Это то, что я понял сначала, но на самом деле это можно расширить.

В системе, над которой я сейчас работаю, мы также используем журналы на канале выполнения системы.РБИ. Например, я хочу отправить сообщение уведомления сейчас, и сообщение уведомления на самом деле выглядит следующим образом:

这就是通知消息

Процесс происходит примерно так:

  • Во-первых, другие вызывают интерфейс, предоставленный моим RPC (или я вызываю свой собственный интерфейс), и обнаруживают, что это сообщение уведомления. Поэтому я собрал соответствующий Task и асинхронно поместил его в очередь сообщений.
  • Другая система берет задачу из очереди сообщений, обрабатывает задачу (например, блокировать ли ее ночью, принудительно ли отправлять и т. д.), а затем вызывает интерфейс HTTP для доставки задачи нижестоящему
  • На самом деле есть много вещей, которые нужно сделать ниже по течению.Вся ссылка очень длинная(Например, для вызова библиотеки SDK Android и IOS выполняют разную обработку)

整块链路

И мы надеемся, что сможем подсчитать некоторую статистику после завершения пуша.показатель(показы, рейтинг кликов, коэффициент конверсии) и так далее. Поэтому необходимо сделать бревно в некоторых ключевых позициях (профессиональная точка называетсяРБИ)

После открытия всей ссылки этиточка(журналы) собираются и очищаются/фильтруются на потоковой платформе в реальном времени (storm/flink). Если это необходимо в режиме реального времени, поместите его в Redis и поместите в Hive в автономном режиме.

2. Технические характеристики руководства

2.1 Структура ведения журнала с использованием режима фасада

[Обязательно] API в системе логирования (Log4j, Logback) нельзя использовать напрямую в приложении, но следует полагаться на использование фреймворка логирования

API в SLF4J, используяПлатформа регистрации шаблонов фасадов, что облегчает техническое обслуживание иЕдиная обработка журналов.

Фасадный режим Я также написал заметку ранее:Три минуты, чтобы изучить режим фасада!

На самом деле это надеждаСлой API абстрагирован, что не требует масштабных изменений при переключении конкретных фреймворков логирования..

Это мы можем понять, когда изучаем JDBC:

Независимо от того, подключаюсь ли я к MySQL, Oracle или SQL Server, мой интерфейс всегда один и тот же, и мне не нужно менять свой Java API при переключении баз данных.

Посмотрел проект компании, используяSLF4J+Logback

2.2 Вызов интерфейса RPC и использование класса Throwable для перехвата

[Обязательно] Throwable должен использоваться для перехвата исключений при вызове RPC, сторонних пакетов или связанных методов динамически генерируемых классов.

класс для перехвата.

Когда я раньше исследовал проблему, была проблема, в которой не могли разобраться, и модуль catch не был включен в отладку. Позже мой старший сказал: «Как насчет того, чтобы попробовать изменить его на Throwable?

try {

} catch (Throwable e) {
		
}

Я был очень подозрительным и сказал: «Зачем переходить на Throwable? Разве мы не можем использовать Exception для перехвата всех исключений? Exception является подклассом Throwable, но Exception уже содержит все исключения Java».

Как мы все знаем, у Throwable есть два подкласса:

  • Ошибка (обычно мы игнорируем это... в нормальных условиях программа Error не запускается)
  • Exception
The  Throwable class is the superclass of all errors and exceptions in the Java language

Вышеуказанные правила также разъясняются в «Руководстве»:

Описание: метод вызывается через механизм отражения, если метод не найден, генерируется исключение NoSuchMethodException. что бросит

Как насчет NoSuchMethodError?Когда двухсторонние пакеты конфликтуют друг с другом, механизм арбитража может привести к появлению неожиданных версий и сделать сигнатуры методов классов несовпадающими.

конфигурации или когда инфраструктура модификации байт-кода (например, ASM) динамически создает или изменяет класс, соответствующая сигнатура метода изменяется.. эти случаи, а именно

Делает время компиляции кода правильным, но когда код запускается, выдаетNoSuchMethodError.

Общее значение таково: при вызове связанных методов RPC, стороннего пакета или динамически сгенерированного класса ошибка может быть вызвана напрямую, а перехват исключения невозможен.

Студенты, которые хотят увидеть пример, могут прочитать эту статью:

Наконец

Ссылки (адрес загрузки руководства по разработке Alibaba):

Хорошие статьи, которые я нашел, когда искал данные:

рад вывестигалантерейные товарыОбщедоступный номер технологии Java:Java3y. В публичном аккаунтеБолее 200 оригинальных статейТехнические статьи, обширные видеоресурсы, красивые карты мозга,Следуйте, чтобы получить его!

转发到朋友圈是对我最大的支持!

Я думаю, что моя статья хорошо написана, нажмитеотличный!