Владимир Красильщик, luxoft, Санкт...

213
1 Владимир Красильщик, Luxoft, Санкт-Петербург Что надо знать о логировании прагматичному Java-программисту Москва, 2016

Upload: others

Post on 21-May-2020

4 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

1

Владимир Красильщик, Luxoft, Санкт-Петербург

Что надо знать о логировании прагматичному Java-программисту

Москва, 2016

Page 2: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

О чем доклад

2

Page 3: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

О чем доклад• Что было не так с логированием на проекте Х

2

Page 4: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

О чем доклад• Что было не так с логированием на проекте Х

• Что мы захотели изменить

2

Page 5: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

О чем доклад• Что было не так с логированием на проекте Х

• Что мы захотели изменить

• Что у нас получилось

2

Page 6: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

О чем доклад• Что было не так с логированием на проекте Х

• Что мы захотели изменить

• Что у нас получилось

• Чему мы научились

2

Page 7: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Два слова о проекте Х

3

Page 8: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Два слова о проекте Х

• ~40 микросервисов

3

Page 9: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Два слова о проекте Х

• ~40 микросервисов

• >16 лет в продакшене

3

Page 10: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Два слова о проекте Х

• ~40 микросервисов

• >16 лет в продакшене

• ~20 сервер-сайд Java-девелоперов

3

Page 11: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

4

Page 12: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

4

В разных микросервисах использовались разные библиотеки логирования

Page 13: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

4

В разных микросервисах использовались разные библиотеки логирования

• Плюс: становишься “недоэкспертом” в разных библиотеках логирования …

Page 14: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

4

В разных микросервисах использовались разные библиотеки логирования

• Плюс: становишься “недоэкспертом” в разных библиотеках логирования …

• Минус: big data, high-load, reactive, пиво и дети проходят мимо пока …

Page 15: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

4

В разных микросервисах использовались разные библиотеки логирования

• Плюс: становишься “недоэкспертом” в разных библиотеках логирования …

• Минус: big data, high-load, reactive, пиво и дети проходят мимо пока …

… пока ты вспоминаешь как правильно писать в этом микросервисе 1) log.info(“userName is {}”, name); 2) log.info(String.format(“userName is %s”, name));

Page 16: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

5

Page 17: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

5

“Jars Hell” библиотек логирования

Page 18: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

5

“Jars Hell” библиотек логирования

• Плюс: очень интересно разбираться в хитросплетениях “класспасостроения”

Page 19: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

5

“Jars Hell” библиотек логирования

• Плюс: очень интересно разбираться в хитросплетениях “класспасостроения”

• Минус: забываешь в каком класспасе, тьфу, классе твой ребёнок

Page 20: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

6

|~/microService1 |---/apache-tomcat |-------/bin |-------/conf |-------/logs |~/microService2 |---/apache-tomcat/ |-------/bin |-------/conf |-------/logs |~/microServiceN |---/apache-tomcat |-------/bin |-------/conf |-------/logs

Что было

Page 21: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

7

Что было

Page 22: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

7

Архивирование логов делалось ручками: crontab + sh-скрипт

Что было

Page 23: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

7

• Плюс: ты контролируешь все сам

Архивирование логов делалось ручками: crontab + sh-скрипт

Что было

Page 24: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

7

• Минус: но не контролируешь админов, которые …

• Плюс: ты контролируешь все сам

Архивирование логов делалось ручками: crontab + sh-скрипт

Что было

Page 25: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

7

• Минус: но не контролируешь админов, которые …

• Плюс: ты контролируешь все сам

Архивирование логов делалось ручками: crontab + sh-скрипт

Что было

… которые все-равно могут снести gnu утилиту, используемую в sh-скрипте в продакшене или удалить расписание из crontab

Page 26: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

8

Page 27: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

8

|~/microServiceK|---/apache-tomcat|-------/bin|-------/conf|-------/logs|------------/archive

Page 28: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

8

|~/microServiceK|---/apache-tomcat|-------/bin|-------/conf|-------/logs|------------/archive

• Плюс: обновление томката до новой версии становится интересной задачей

Page 29: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

8

|~/microServiceK|---/apache-tomcat|-------/bin|-------/conf|-------/logs|------------/archive

• Плюс: обновление томката до новой версии становится интересной задачей

• Минус: “Здесь было жестоко убито время”*

* - надпись на парте в родном СПбГЭТУ “ЛЭТИ”

Page 30: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

9

Page 31: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

9

Свой велосипед со статическими методами Log.debug(),Log.info(),…

Page 32: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

9

Свой велосипед со статическими методами Log.debug(),Log.info(),…

• Плюс: не надо явно указывать имя логера

Page 33: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что было

9

Свой велосипед со статическими методами Log.debug(),Log.info(),…

• Плюс: не надо явно указывать имя логера

• Минус: ненадежная имплементация …

… new Exception().getStackTrace()[4].getClassName()

Page 34: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что захотели изменить

10

Page 35: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что захотели изменить• Одна технологию логирования на все микросервисы

10

Page 36: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что захотели изменить• Одна технологию логирования на все микросервисы

• Избавиться от crontab+sh для архивирования логов

10

Page 37: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что захотели изменить• Одна технологию логирования на все микросервисы

• Избавиться от crontab+sh для архивирования логов

• Упорядочить архивы всех микросервисов

10

Page 38: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что захотели изменить• Одна технологию логирования на все микросервисы

• Избавиться от crontab+sh для архивирования логов

• Упорядочить архивы всех микросервисов

• Удобно просматривать и скачивать логи для анализа

10

Page 39: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что захотели изменить• Одна технологию логирования на все микросервисы

• Избавиться от crontab+sh для архивирования логов

• Упорядочить архивы всех микросервисов

• Удобно просматривать и скачивать логи для анализа

• И уже забыть про логи и начать жить …

10

Page 40: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

11

Page 41: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

12

Page 42: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

12

1. Java Util Logging (JUL/JDK)

Page 43: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

12

1. Java Util Logging (JUL/JDK)

2. log4j

Page 44: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

12

1. Java Util Logging (JUL/JDK)

2. log4j

3. Logback

Page 45: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

12

1. Java Util Logging (JUL/JDK)

2. log4j

3. Logback

4. log4j 2

Page 46: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

12

1. Java Util Logging (JUL/JDK)

2. log4j

3. Logback

4. log4j 2

Page 47: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

12

1. Java Util Logging (JUL/JDK)

2. log4j

3. Logback

4. log4j 2

Page 48: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

12

1. Java Util Logging (JUL/JDK)

2. log4j

3. Logback

4. log4j 2

5. Apache Commons Logging (JCL)

Page 49: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

12

1. Java Util Logging (JUL/JDK)

2. log4j

3. Logback

4. log4j 2

5. Apache Commons Logging (JCL)

6. Simple Logging Facade For Java (SLF4J)

Page 50: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

А какие библиотеки есть?

13

1. Java Util Logging (JUL/JDK)

2. log4j

3. Logback

4. log4j 2

5. Apache Commons Logging (JCL)

6. Simple Logging Facade For Java (SLF4J)

Page 51: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

14

Page 52: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Общий подход в логировании на 1-й квартал 2016 года

15

Page 53: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Общий подход в логировании на 1-й квартал 2016 года

15

• Logger

Page 54: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Общий подход в логировании на 1-й квартал 2016 года

15

• Logger • Appender

Page 55: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Общий подход в логировании на 1-й квартал 2016 года

15

• Logger • Appender

• “in-team-ная связь” Logger—>Appender

Page 56: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

16

Logger

Page 57: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Logger logger = LoggerFactory.getLogger(name);

16

Logger

Page 58: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Logger logger = LoggerFactory.getLogger(name);

name = “vasiliy_pupkin”;

16

Logger

Page 59: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Logger logger = LoggerFactory.getLogger(name);

name = “vasiliy_pupkin”;

name = SomeClass.class.getName();

16

Logger

Page 60: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Logger logger = LoggerFactory.getLogger(name);

name = “vasiliy_pupkin”;

name = SomeClass.class.getName();

“ru.spb.luxoft.x.y.z.SomeClass”

16

Logger

Page 61: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Logger logger = LoggerFactory.getLogger(name);

name = “vasiliy_pupkin”;

name = SomeClass.class.getName();

“ru.spb.luxoft.x.y.z.SomeClass”

“ru.spb.luxoft” это родитель для “ru.spb.luxoft.x.y.z.SomeClass”

16

Logger

Page 62: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Logger logger = LoggerFactory.getLogger(name);

name = “vasiliy_pupkin”;

name = SomeClass.class.getName();

“ru.spb.luxoft.x.y.z.SomeClass”

“ru.spb.luxoft” это родитель для “ru.spb.luxoft.x.y.z.SomeClass”

root<—ru<—spb<—luxoft<—x<—y<—z<—SomeClass

16

Logger

Page 63: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Logger logger = LoggerFactory.getLogger(name);

name = “vasiliy_pupkin”;

name = SomeClass.class.getName();

“ru.spb.luxoft.x.y.z.SomeClass”

“ru.spb.luxoft” это родитель для “ru.spb.luxoft.x.y.z.SomeClass”

root<—ru<—spb<—luxoft<—x<—y<—z<—SomeClass

root<—vasiliy_pupkin

16

Logger

Page 64: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

17

Logger

Page 65: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

logger.info(“hello”); logger.debug(“hello”);

17

Logger

Page 66: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

logger.info(“hello”); logger.debug(“hello”);

Event: message = ”hello” Level = Level.INFO

17

Logger

Page 67: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

logger.info(“hello”); logger.debug(“hello”);

Event: message = ”hello” Level = Level.INFO

Уровни “относительной ужасности”:error—>warn—>info—>debug—>fine

17

Logger

Page 68: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Appender

18

Page 69: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Appender• Appender - знает куда отправлять события

18

Page 70: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Appender• Appender - знает куда отправлять события

• Console

18

Page 71: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Appender• Appender - знает куда отправлять события

• Console

• File

18

Page 72: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Appender• Appender - знает куда отправлять события

• Console

• File

• Socket

18

Page 73: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Appender• Appender - знает куда отправлять события

• Console

• File

• Socket

• Database

18

Page 74: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Appender• Appender - знает куда отправлять события

• Console

• File

• Socket

• Database

• Abstract-Spherical-Horse-In-Vacuum

18

Page 75: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“in-team-ная связь” Logger—>Appender

19

Page 76: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“in-team-ная связь” Logger—>Appender

ru.spb.luxoft.x.y.z.SomeClass—>fb (1)

19

Page 77: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“in-team-ная связь” Logger—>Appender

ru.spb.luxoft.x.y.z.SomeClass—>fb (1)

ru.spb.luxoft—>vk (2)

19

Page 78: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“in-team-ная связь” Logger—>Appender

ru.spb.luxoft.x.y.z.SomeClass—>fb (1)

ru.spb.luxoft—>vk (2)

root—>ok (3)

19

Page 79: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“in-team-ная связь” Logger—>Appender

ru.spb.luxoft.x.y.z.SomeClass—>fb (1)

ru.spb.luxoft—>vk (2)

root—>ok (3)

LoggerFactory.getLogger(SomeClass.class) .info(“I <3 Big Data!”)?

19

Page 80: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“in-team-ная связь” Logger—>Appender

ru.spb.luxoft.x.y.z.SomeClass—>fb (1)

ru.spb.luxoft—>vk (2)

root—>ok (3)

LoggerFactory.getLogger(SomeClass.class) .info(“I <3 Big Data!”)?

root<—ru<—spb<—luxoft<—x<—y<—z<—SomeClass

19

Page 81: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“in-team-ная связь” Logger—>Appender

ru.spb.luxoft.x.y.z.SomeClass—>fb (1)

ru.spb.luxoft—>vk (2)

root—>ok (3)

LoggerFactory.getLogger(SomeClass.class) .info(“I <3 Big Data!”)?

root<—ru<—spb<—luxoft<—x<—y<—z<—SomeClass

additivity …

19

Page 82: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

20

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 83: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

21

Logger

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 84: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

22

LoggerEvent

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 85: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

23

Logger AppenderEvent

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 86: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

24

Logger AppenderEvent

additivity=true

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 87: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

25

Logger AppenderEvent

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

additivity=true

Propagate

Page 88: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

26

Logger AppenderEvent

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Propagate

additivity=true

Parent Logger

Page 89: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

27

“in-team-ная связь” Logger—>Appender

Page 90: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• Уровень “относительной ужасности” in-team-ной связи

27

“in-team-ная связь” Logger—>Appender

Page 91: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• Уровень “относительной ужасности” in-team-ной связи

• Logger logger = LoggerFactory.getLogger(“vasiliy_pupkin”); vasiliy_pupkin—>Abstract-Spherical-Horse-In-Vacuum Level = Level.INFO

27

“in-team-ная связь” Logger—>Appender

Page 92: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• Уровень “относительной ужасности” in-team-ной связи

• Logger logger = LoggerFactory.getLogger(“vasiliy_pupkin”); vasiliy_pupkin—>Abstract-Spherical-Horse-In-Vacuum Level = Level.INFO

• logger.error() - V logger.warn() - V logger.info() - V error—>warn—>info—>debug—>finelogger.debug() - X logger.fine() - X

27

“in-team-ная связь” Logger—>Appender

Page 93: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что получилось и чему научились

28

Page 94: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

SLF4J

29

Page 95: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

SLF4J

29

API в slf4j-api.jar

Page 96: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

SLF4J

29

API в slf4j-api.jarLogger logger = LoggerFactory.getLogger(SomeClass.class); logger.info(“hello”);

Page 97: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

SLF4J

30

Page 98: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

SLF4J

30

Binding

Page 99: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

SLF4J

30

Binding• logback-classic-1.1.3.jar

Page 100: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

SLF4J

30

Binding• logback-classic-1.1.3.jar

• slf4j-log4j12-1.7.12.jar

Page 101: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

SLF4J

30

Binding• logback-classic-1.1.3.jar

• slf4j-log4j12-1.7.12.jar

• slf4j-jdk14-1.7.12.jar

Page 102: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

SLF4J

30

Binding• logback-classic-1.1.3.jar

• slf4j-log4j12-1.7.12.jar

• slf4j-jdk14-1.7.12.jar

• slf4j-jcl-1.7.12.jar

Page 103: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Troubleshooting Multiple Bindings

31

Page 104: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Troubleshooting Multiple BindingsSLF4J: Class path contains multiple SLF4J bindings.

SLF4J: Found binding in [jar:file:/export/apps/userR/serviceK/apache-tomee-webprofile/lib/slf4j-jdk14-1.7.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: Found binding in [jar:file:/export/apps/userR/serviceK/apache-tomee-webprofile/lib/logback-classic-1.0.7.jar!/org/slf4j/impl/StaticLoggerBinder.class]

SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.

SLF4J: Actual binding is of type [org.slf4j.impl.JDK14LoggerFactory]

31

Page 105: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

32

Troubleshooting Multiple Bindings

Page 106: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

mvn dependency:tree -DoutputFile=tree.txt-Dincludes=org.slf4j -Dverbose > output

32

Troubleshooting Multiple Bindings

Page 107: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

<dependency>

<groupId>org.apache.openejb</groupId>

<artifactId>openejb-core</artifactId>

<version>4.7.1</version>

<scope>provided</scope>

<exclusions>

<exclusion>

<groupId>org.slf4j</groupId>

<artifactId>slf4j-jdk14</artifactId>

</exclusion>

</exclusions>

</dependency>

<dependency>33

Troubleshooting Multiple Bindings

Page 108: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #0: некоторые либы используют явно log4j или JUL/JDK

34

Page 109: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #0: некоторые либы используют явно log4j или JUL/JDK

• Что Spring использует для логирования?

34

Page 110: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #0: некоторые либы используют явно log4j или JUL/JDK

• Что Spring использует для логирования?

• Spring использует JCL!

34

Page 111: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Bridge в SLF4J

35

Page 112: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Bridge в SLF4J

• jcl-over-slf4j.jar

35

Page 113: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Bridge в SLF4J

• jcl-over-slf4j.jar

• log4j-over-slf4j.jar

35

Page 114: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Bridge в SLF4J

• jcl-over-slf4j.jar

• log4j-over-slf4j.jar

• jul-to-slf4j.jar (ничего не смущает?)

35

Page 115: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

36

Bridge в SLF4J - проблемы

Page 116: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• не работает, если конфигурация сделана программно

36

Bridge в SLF4J - проблемы

Page 117: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• не работает, если конфигурация сделана программно

• jul-to-slf4j.jar && slf4j-jdk14.jar —> StackOverflowErrorlog4j-over-slf4j.jar && slf4j-log4j12.jar —> StackOverflowError

36

Bridge в SLF4J - проблемы

Page 118: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• не работает, если конфигурация сделана программно

• jul-to-slf4j.jar && slf4j-jdk14.jar —> StackOverflowErrorlog4j-over-slf4j.jar && slf4j-log4j12.jar —> StackOverflowError

• jul-to-slf4j.jar —> SLF4JBridgeHandler на root и …

36

Bridge в SLF4J - проблемы

Page 119: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• не работает, если конфигурация сделана программно

• jul-to-slf4j.jar && slf4j-jdk14.jar —> StackOverflowErrorlog4j-over-slf4j.jar && slf4j-log4j12.jar —> StackOverflowError

• jul-to-slf4j.jar —> SLF4JBridgeHandler на root и …

• … и проседает производительность

36

Bridge в SLF4J - проблемы

Page 120: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер

37

Page 121: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

37

Page 122: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

<file>${catalina.base}/logs/serviceK.log</file> (2)

37

Page 123: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

<file>${catalina.base}/logs/serviceK.log</file> (2)

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> (3)

37

Page 124: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

<file>${catalina.base}/logs/serviceK.log</file> (2)

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> (3)

<fileNamePattern>${user.home}/archive/serviceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz</fileNamePattern> (4)

37

Page 125: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

<file>${catalina.base}/logs/serviceK.log</file> (2)

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> (3)

<fileNamePattern>${user.home}/archive/serviceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz</fileNamePattern> (4)

<maxHistory>90</maxHistory> (5)

37

Page 126: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

<file>${catalina.base}/logs/serviceK.log</file> (2)

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> (3)

<fileNamePattern>${user.home}/archive/serviceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz</fileNamePattern> (4)

<maxHistory>90</maxHistory> (5)

</rollingPolicy>

37

Page 127: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

<file>${catalina.base}/logs/serviceK.log</file> (2)

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> (3)

<fileNamePattern>${user.home}/archive/serviceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz</fileNamePattern> (4)

<maxHistory>90</maxHistory> (5)

</rollingPolicy>

<encoder>

37

Page 128: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

<file>${catalina.base}/logs/serviceK.log</file> (2)

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> (3)

<fileNamePattern>${user.home}/archive/serviceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz</fileNamePattern> (4)

<maxHistory>90</maxHistory> (5)

</rollingPolicy>

<encoder>

<pattern>%d [%22.22thread] [%-5level] [%logger{0}] %msg%n%ex</pattern> (6)

37

Page 129: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

<file>${catalina.base}/logs/serviceK.log</file> (2)

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> (3)

<fileNamePattern>${user.home}/archive/serviceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz</fileNamePattern> (4)

<maxHistory>90</maxHistory> (5)

</rollingPolicy>

<encoder>

<pattern>%d [%22.22thread] [%-5level] [%logger{0}] %msg%n%ex</pattern> (6)

</encoder>

37

Page 130: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

“Швейцарский” файловый аппендер <appender name="SERVICE" class=“ch.qos.logback.core.rolling.RollingFileAppender"> (1)

<file>${catalina.base}/logs/serviceK.log</file> (2)

<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> (3)

<fileNamePattern>${user.home}/archive/serviceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz</fileNamePattern> (4)

<maxHistory>90</maxHistory> (5)

</rollingPolicy>

<encoder>

<pattern>%d [%22.22thread] [%-5level] [%logger{0}] %msg%n%ex</pattern> (6)

</encoder>

</appender>

37

Page 131: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Миграционые службы

38

Page 132: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Миграционые службы• http://www.slf4j.org/migrator.html - миграция на SLF4J из JCL, log4j или JUL/JDK

38

Page 133: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Миграционые службы• http://www.slf4j.org/migrator.html - миграция на SLF4J из JCL, log4j или JUL/JDK

Ограничения: 1) fatal() - X2) Object в параметрах - X3) 2 логера в одной строке кода - X

38

Page 134: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Миграционые службы• http://www.slf4j.org/migrator.html - миграция на SLF4J из JCL, log4j или JUL/JDK

Ограничения: 1) fatal() - X2) Object в параметрах - X3) 2 логера в одной строке кода - X

• http://logback.qos.ch/translator/ - миграция на Logback из log4j

38

Page 135: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Миграционые службы• http://www.slf4j.org/migrator.html - миграция на SLF4J из JCL, log4j или JUL/JDK

Ограничения: 1) fatal() - X2) Object в параметрах - X3) 2 логера в одной строке кода - X

• http://logback.qos.ch/translator/ - миграция на Logback из log4j

Ограничения: 1) только из конфигурации через *.properties2) генерит немного кривую конфигурацию Logback

38

Page 136: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #1: GWT

39

Page 137: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #1: GWT• Прошёлся migrator-ом по всему коду

39

Page 138: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #1: GWT• Прошёлся migrator-ом по всему коду

• В девелоп моде все пучком

39

Page 139: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #1: GWT• Прошёлся migrator-ом по всему коду

• В девелоп моде все пучком

• При сборке продакшена падает ошибка компиляции класса org.slf4j.LoggerFactory

39

Page 140: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #1: GWT• Прошёлся migrator-ом по всему коду

• В девелоп моде все пучком

• При сборке продакшена падает ошибка компиляции класса org.slf4j.LoggerFactory

• JUL/JDK надо оставить в GWT UI коде чтобы генерировалось console.debug() в javascript

39

Page 141: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #2: Hibernate

40

Page 142: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #2: Hibernate• Проблема: надо подебажить запросы Hibernate после перехода на новую версию

40

Page 143: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #2: Hibernate• Проблема: надо подебажить запросы Hibernate после перехода на новую версию

• show_sql=true —> и тишина

40

Page 144: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #2: Hibernate• Проблема: надо подебажить запросы Hibernate после перехода на новую версию

• show_sql=true —> и тишина

• Добавил “in-team-ной связи” для логеров Hibernate —> и тишина

40

Page 145: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #2: Hibernate• Проблема: надо подебажить запросы Hibernate после перехода на новую версию

• show_sql=true —> и тишина

• Добавил “in-team-ной связи” для логеров Hibernate —> и тишина

• Hibernate 4.X.X+ использует JBoss Logging!

40

Page 146: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #2: Hibernate• Проблема: надо подебажить запросы Hibernate после перехода на новую версию

• show_sql=true —> и тишина

• Добавил “in-team-ной связи” для логеров Hibernate —> и тишина

• Hibernate 4.X.X+ использует JBoss Logging!

• JBoss Logging - это ещё один адаптер!

40

Page 147: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #2: Hibernate• Проблема: надо подебажить запросы Hibernate после перехода на новую версию

• show_sql=true —> и тишина

• Добавил “in-team-ной связи” для логеров Hibernate —> и тишина

• Hibernate 4.X.X+ использует JBoss Logging!

• JBoss Logging - это ещё один адаптер!

• Приоритеты: JBoss—>log4j—>SLF4J—>JUL/JDK

40

Page 148: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #2: Hibernate• Проблема: надо подебажить запросы Hibernate после перехода на новую версию

• show_sql=true —> и тишина

• Добавил “in-team-ной связи” для логеров Hibernate —> и тишина

• Hibernate 4.X.X+ использует JBoss Logging!

• JBoss Logging - это ещё один адаптер!

• Приоритеты: JBoss—>log4j—>SLF4J—>JUL/JDK

• -Dorg.jboss.logging.provider=slf4j (Не делайте так!)40

Page 149: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #3: временная недетерминированность

41

Page 150: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #3: временная недетерминированность

<fileNamePattern>${user.home}/archive/microServiceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz </fileNamePattern>

41

Page 151: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #3: временная недетерминированность

<fileNamePattern>${user.home}/archive/microServiceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz </fileNamePattern>

• В результате архивы появлялись, но в 00:13, 00:21, 07:14, … Но почему?

41

Page 152: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Нежданчик #3: временная недетерминированность

<fileNamePattern>${user.home}/archive/microServiceK/%d{yyyy-MM-dd}/serviceK-%d{yyyy-MM-dd_HH-mm,aux}.log.gz </fileNamePattern>

• В результате архивы появлялись, но в 00:13, 00:21, 07:14, … Но почему?

• Архивирование, ротация и подчистка файлов не выполняются по расписанию! А тогда как?

41

Page 153: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

42

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 154: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

43

Logger

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 155: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

44

LoggerEvent

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 156: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

45

LoggerEvent

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Appender

Page 157: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

46

LoggerEvent

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Time& Size

ChecksAppender

Page 158: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

47

LoggerEvent Rotate

ZipCleanup

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Time& Size

ChecksAppender

Page 159: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Mapped Diagnostic Context (MDC)

48

Page 160: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Mapped Diagnostic Context (MDC)

MDC.put("personalId", personalId);

48

Page 161: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Mapped Diagnostic Context (MDC)

MDC.put("personalId", personalId);

<pattern>%X{personalId} - %m%n</pattern>

48

Page 162: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Mapped Diagnostic Context (MDC)

MDC.put("personalId", personalId);

<pattern>%X{personalId} - %m%n</pattern>

MDC.remove(“personalId");

48

Page 163: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Страна советов

49

Page 164: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Страна советов• Отдельный файл для всех внешних коммуникаций

49

Page 165: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Страна советов• Отдельный файл для всех внешних коммуникаций

• AOP / BCI - для массового логирования методов

49

Page 166: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Страна советов• Отдельный файл для всех внешних коммуникаций

• AOP / BCI - для массового логирования методов

• Мониторинг: log.warn(Alerts.YELLOW(“Bad thing’s happened”, exc)); log.error(Alerts.RED(“Very bad thing’s happened”, exc));

49

Page 167: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Страна советов• Отдельный файл для всех внешних коммуникаций

• AOP / BCI - для массового логирования методов

• Мониторинг: log.warn(Alerts.YELLOW(“Bad thing’s happened”, exc)); log.error(Alerts.RED(“Very bad thing’s happened”, exc));

• Heart-beat thread - log.info(“I’m alive!”);

49

Page 168: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Страна советов• Отдельный файл для всех внешних коммуникаций

• AOP / BCI - для массового логирования методов

• Мониторинг: log.warn(Alerts.YELLOW(“Bad thing’s happened”, exc)); log.error(Alerts.RED(“Very bad thing’s happened”, exc));

• Heart-beat thread - log.info(“I’m alive!”);

• Решение для просмотра и скачивания логов …

49

Page 169: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в микросервисах и кластере

50

Page 170: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в микросервисах и кластере

• Микросервисы: специализированные взаимодействующие компоненты

50

Page 171: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в микросервисах и кластере

• Микросервисы: специализированные взаимодействующие компоненты

• Кластер: параллелизм+отказоустойчивость+высокая доступность

50

Page 172: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в микросервисах и кластере

• Микросервисы: специализированные взаимодействующие компоненты

• Кластер: параллелизм+отказоустойчивость+высокая доступность

50

• Logstash Elastic SearchKibana

Page 173: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в микросервисах и кластере

• Микросервисы: специализированные взаимодействующие компоненты

• Кластер: параллелизм+отказоустойчивость+высокая доступность

50

• Appender может писать в базу данных, JMS и т. д.

• Logstash Elastic SearchKibana

Page 174: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в микросервисах и кластере

• Микросервисы: специализированные взаимодействующие компоненты

• Кластер: параллелизм+отказоустойчивость+высокая доступность

50

• Appender может писать в базу данных, JMS и т. д.

• Logstash Elastic SearchKibana

• Splunk или Logmatic

Page 175: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в облаке

51

Page 176: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в облаке

51

AWS, OpenShift, Jelastic, Microsoft Azure, и т д

Page 177: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в облаке

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

51

AWS, OpenShift, Jelastic, Microsoft Azure, и т д

Page 178: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в Docker-е

52

Page 179: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Логирование в Docker-еМонтируйте папку с логами через VOLUME, -v вне контейнера на хосте

52

Page 180: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

API development

53

Page 181: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

API development• Не используйте JUL/JDK просто потому что он уже есть в Java!

53

Page 182: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

API development• Не используйте JUL/JDK просто потому что он уже есть в Java!

• Не используйте JUL/JDK просто потому что он уже есть в Java!!

53

Page 183: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

API development• Не используйте JUL/JDK просто потому что он уже есть в Java!

• Не используйте JUL/JDK просто потому что он уже есть в Java!!

• Используйте связку SLF4J+“рабочая лошадка”, например, logback

53

Page 184: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

API development• Не используйте JUL/JDK просто потому что он уже есть в Java!

• Не используйте JUL/JDK просто потому что он уже есть в Java!!

• Используйте связку SLF4J+“рабочая лошадка”, например, logback

• Подумайте, а нужна ли библиотека “рабочей лошадки” как транзитивная зависимость вашим клиентам?

53

Page 185: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

API development• Не используйте JUL/JDK просто потому что он уже есть в Java!

• Не используйте JUL/JDK просто потому что он уже есть в Java!!

• Используйте связку SLF4J+“рабочая лошадка”, например, logback

• Подумайте, а нужна ли библиотека “рабочей лошадки” как транзитивная зависимость вашим клиентам?

• Паттерн “волшебная системная пропертя” а-ля verbose

53

Page 186: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Сколько проблем в коде?private static final Logger log = LoggerFactory.getLogger(SomeClass.class); (1)

void withdraw(String login, Long amount) { (2)

if (log.isDebugEnabled()) { (3)

log.debug(“starting withdrawing”); (4)

}

log.info(“login ”+login+“,amount ”+amount); (5) 

}

54

Page 187: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Сколько проблем в коде?private static final Logger LOG = LoggerFactory.getLogger(SomeClass.class); (1)

void withdraw(String login, Long amount) { (2)

if (log.isDebugEnabled()) { (3)

LOG.debug(“starting withdrawing”); (4)

}

LOG.info(“login {},amount {}”,login,amount);(5) 

}

55

Page 188: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Безопасность в логировании: уязвимости

56

Page 189: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Безопасность в логировании: уязвимости

• Логирование персональных данных, а также ценной коммерческой информации

56

Page 190: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Безопасность в логировании: уязвимости

• Логирование персональных данных, а также ценной коммерческой информации

• Log Injection (OWASP): перевод строки, другие атаки …

56

Page 191: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Безопасность в логировании: уязвимости

• Логирование персональных данных, а также ценной коммерческой информации

• Log Injection (OWASP): перевод строки, другие атаки …

• Javascript Injection

56

Page 192: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Безопасность в логировании: уязвимости

• Логирование персональных данных, а также ценной коммерческой информации

• Log Injection (OWASP): перевод строки, другие атаки …

• Javascript Injection

• Атаки на мониторинговые тулы, базы данных и т.д.

56

Page 193: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Безопасность в логировании: уязвимости

• Логирование персональных данных, а также ценной коммерческой информации

• Log Injection (OWASP): перевод строки, другие атаки …

• Javascript Injection

• Атаки на мониторинговые тулы, базы данных и т.д.

• Открытое логирование паролей, логинов, урлов и хостов

56

Page 194: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

57

Безопасность в логировании: решения

Page 195: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• veracode.com рекомендует логировать только константные выражения из предопределенного пула строк

57

Безопасность в логировании: решения

Page 196: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• veracode.com рекомендует логировать только константные выражения из предопределенного пула строк

• https://github.com/javabeanz/owasp-security-logging (экранирование, шифрация, маскирование, фильтрация, аудит)

57

Безопасность в логировании: решения

Page 197: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

• veracode.com рекомендует логировать только константные выражения из предопределенного пула строк

• https://github.com/javabeanz/owasp-security-logging (экранирование, шифрация, маскирование, фильтрация, аудит)

• Фильтры и конвертеры в logback

57

Безопасность в логировании: решения

Page 198: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

58

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 199: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

59

Appender

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 200: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

60

AppenderEvent

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 201: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

61

Appender FilterEvent

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 202: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

62

Appender FilterEvent

DenyNeutralAccept

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 203: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

63

Appender FilterEvent Console

FileSocket

DenyNeutralAccept

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 204: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

64

Appender ConverterEvent escape

mask encrypt

converttransform

Универсальная Программная Архитектурная Диаграмма (УПАД) by @tedneward

Page 205: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что Вам сделать после доклада?

65

Page 206: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что Вам сделать после доклада?• Очистить Ваш класспас от месива библиотек логирования, подтягивающихся транзитивно и бесконтрольно Вашими maven, gradle, sbt и ivy с ними

65

Page 207: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что Вам сделать после доклада?• Очистить Ваш класспас от месива библиотек логирования, подтягивающихся транзитивно и бесконтрольно Вашими maven, gradle, sbt и ivy с ними

• Если Вы пишете API, подумать о класспасе ваших клиентов

65

Page 208: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что Вам сделать после доклада?• Очистить Ваш класспас от месива библиотек логирования, подтягивающихся транзитивно и бесконтрольно Вашими maven, gradle, sbt и ivy с ними

• Если Вы пишете API, подумать о класспасе ваших клиентов

• Досконально изучить вашу связку адаптер+”рабочая лошадка”

65

Page 209: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что Вам сделать после доклада?• Очистить Ваш класспас от месива библиотек логирования, подтягивающихся транзитивно и бесконтрольно Вашими maven, gradle, sbt и ivy с ними

• Если Вы пишете API, подумать о класспасе ваших клиентов

• Досконально изучить вашу связку адаптер+”рабочая лошадка”

• Придумать как удобно доставать и просматривать логи с продакшена

65

Page 210: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что Вам сделать после доклада?• Очистить Ваш класспас от месива библиотек логирования, подтягивающихся транзитивно и бесконтрольно Вашими maven, gradle, sbt и ivy с ними

• Если Вы пишете API, подумать о класспасе ваших клиентов

• Досконально изучить вашу связку адаптер+”рабочая лошадка”

• Придумать как удобно доставать и просматривать логи с продакшена

• Принять во внимание текущее и возможное будущее окружение: один сервер, кластер, виртуалка, облако, Docker

65

Page 211: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что Вам сделать после доклада?• Очистить Ваш класспас от месива библиотек логирования, подтягивающихся транзитивно и бесконтрольно Вашими maven, gradle, sbt и ivy с ними

• Если Вы пишете API, подумать о класспасе ваших клиентов

• Досконально изучить вашу связку адаптер+”рабочая лошадка”

• Придумать как удобно доставать и просматривать логи с продакшена

• Принять во внимание текущее и возможное будущее окружение: один сервер, кластер, виртуалка, облако, Docker

• Проверить Ваш код на уязвимости по безопасности, докрутить экранирование строк, маскирование или криптование подозрительных аргументов

65

Page 212: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

Что Вам сделать после доклада?• Очистить Ваш класспас от месива библиотек логирования, подтягивающихся транзитивно и бесконтрольно Вашими maven, gradle, sbt и ivy с ними

• Если Вы пишете API, подумать о класспасе ваших клиентов

• Досконально изучить вашу связку адаптер+”рабочая лошадка”

• Придумать как удобно доставать и просматривать логи с продакшена

• Принять во внимание текущее и возможное будущее окружение: один сервер, кластер, виртуалка, облако, Docker

• Проверить Ваш код на уязвимости по безопасности, докрутить экранирование строк, маскирование или криптование подозрительных аргументов

• Ежедневно использовать Универсальную Программную Архитектурную Диаграмму (УПАД) Теда Ньюворда, чтобы прослыть крутым архитектором

65

Page 213: Владимир Красильщик, Luxoft, Санкт Петербургpublic.jugru.org/jpoint/2016/msk/day_1/track_1/java... · 2016-07-05 · 1 Владимир Красильщик,

66

Спасибо!

Владимир Красильщик, Luxoft, Санкт-Петербург[email protected]

https://ru.linkedin.com/in/vladimirkrasilschikhttp://drozd4j.blogspot.ru

66

Москва, 2016