Журналы приложений подобны черному ящику. При устранении неполадок первое, на что я обращаю внимание, – это журналы приложений. Становится важным продумать то, что мы регистрируем, чтобы иметь возможность выявлять проблемы на основе журналов.
Сегодня у нас есть класс приложений, называемых системами агрегации журналов. Агрегирование журналов полезно, когда у нас много микросервисов, и мы хотим отслеживать журналы между микросервисами.
Я хотел бы продемонстрировать, как регистрировать журналы приложений в формате JSON.
Традиционный журнал приложений java будет выглядеть примерно следующим образом
2020-09-17 21:56:10.740 INFO [Orders:restartedMain::] o.s.b.w.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8080 (http) with context path ''
Если бы кто-то искал его в окне unix, он бы выполнил
cat application.log | grep
Я вспоминаю дни, когда подобные журналы отправлялись мной в Sumo Logic (другую систему агрегации журналов), и я использовал бы гимнастику регулярных выражений для достижения оптимального поиска.
Кто-то придумал этот другой подход, почему бы не хранить журналы в более удобном для поиска формате, когда он в основном используется для поиска. Случилось так, что JSON легко поддается поиску и, следовательно, ведению журнала json. Другой способ сослаться на это – также структурированные журналы, поскольку журналы имеют четко определенную структуру, которую впоследствии можно использовать для поиска.
Тот же журнал приложений, отображаемый выше в формате JSON, будет выглядеть следующим образом
{ "@timestamp": "2020-06-17T14:41:11.174-04:00", "@version": "1", "message": "Tomcat initialized with port(s): 8080 (http)", "logger_name": "org.springframework.boot.web.embedded.tomcat.TomcatWebServer", "thread_name": "restartedMain", "level": "INFO", "level_value": 20000 }
Теперь это упрощает поиск в журналах, скажем, по времени
или уровню
или даже имя_потока
.
Для ведения журналов в формате JSON необходимо включить 2 зависимости. Если вы используете maven для управления зависимостями, можно было бы включить зависимости следующим образом
net.logstash.logback logstash-logback-encoder 6.4 ch.qos.logback logback-classic 1.2.3
Здесь мы используем библиотеку logstash-logback-encoder
Затем мы можем настроить кодировщик json для обратного входа в систему со следующим фрагментом кода
EST { "level": "%level", "service": "orders", "traceId": "%X{X-B3-TraceId:-}", "spanId": "%X{X-B3-SpanId:-}", "thread": "%thread", "class": "%logger{40}", "message": "%message" } 30 2048 20 true
Итак, давайте предположим, что вы хотите записывать данные в консоль в виде традиционных журналов и записывать их в формате json в файл. Мы можем настроить xml-файл обратного входа следующим образом
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [Orders:%thread:%X{X-B3-TraceId}:%X{X-B3-SpanId}] %logger{40} - %msg%n ./logs/orders.log 8 ./logs/orders.log.%i 128MB EST { "level": "%level", "service": "orders", "traceId": "%X{X-B3-TraceId:-}", "spanId": "%X{X-B3-SpanId:-}", "thread": "%thread", "class": "%logger{40}", "message": "%message" } 30 2048 20 true
Для полного приложения spring boot с журналированием json, пожалуйста, обратитесь к примерам приложений заказы или доставка
Ведение журнала в формате JSON может быть достигнуто и на других языках/фреймворках, таких как node.js и питон.
Для node.js можно использовать библиотеки типа winston .
Оригинал: “https://dev.to/anandsunderraman/json-logging-in-spring-boot-applications-2j33”