Рубрики
Без рубрики

Ведение журнала в формате JSON в приложениях Spring Boot

Журналы приложений подобны черному ящику. При устранении неполадок первое, на что я обращаю внимание, – это приложение… Помеченный микросервисами, java.

Журналы приложений подобны черному ящику. При устранении неполадок первое, на что я обращаю внимание, – это журналы приложений. Становится важным продумать то, что мы регистрируем, чтобы иметь возможность выявлять проблемы на основе журналов.

Сегодня у нас есть класс приложений, называемых системами агрегации журналов. Агрегирование журналов полезно, когда у нас много микросервисов, и мы хотим отслеживать журналы между микросервисами.

Я хотел бы продемонстрировать, как регистрировать журналы приложений в формате 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”