Azure Spring Apps için yapılandırılmış uygulama günlüğü

Not

Temel, Standart ve Kurumsal planları 17 Mart 2025'te kullanımdan kaldırılma dönemine girdi. Daha fazla bilgi için bkz . Azure Spring Apps kullanımdan kaldırma duyurusu.

Bu makale şunlar için geçerlidir:✅ Temel/Standart ✅ Kurumsal

Bu makalede, Azure Spring Apps'te yapılandırılmış uygulama günlüğü verilerinin nasıl oluşturulacağı ve topladığı açıklanır. Uygun yapılandırma ile Azure Spring Apps, Log Analytics aracılığıyla kullanışlı uygulama günlüğü sorgusu ve analizi sağlar.

Günlük şeması gereksinimleri

Günlük sorgusu deneyimini geliştirmek için bir uygulama günlüğünün JSON biçiminde olması ve şemaya uyması gerekir. Azure Spring Apps, uygulamanızı ayrıştırmak ve Log Analytics'e akış yapmak için bu şemayı kullanır.

Not

JSON günlük biçiminin etkinleştirilmesi, konsoldan günlük akışı çıktısının okunmasını zorlaştırır. İnsan tarafından okunabilir bir çıkış elde etmek için --format-json argümanını CLI komutuna ekleyinaz spring app logs. Bkz JSON yapılandırılmış günlükleri biçimlendirme.

JSON şema gereksinimleri:

JSON Anahtarı JSON değer Türü Zorunlu Log Analytics'teki sütun Açıklama
timestamp string Yes AppTimestamp UTC biçiminde zaman damgası
Kayıt cihazı string Hayır Günlükçü Günlükçü
düzey string Hayır ÖzelleştirilmişSeviye günlük seviyesi
thread string Hayır İleti Dizisi thread
mesaj string Hayır İleti log mesajı
stackTrace string Hayır StackTrace hata yığını izi
exceptionClass string Hayır ExceptionClass özel durum sınıfı adı
mdc iç içe JSON Hayır eşlenmiş tanılama bağlamı
mdc.traceId string Hayır TraceId dağıtılmış izleme için izleme kimliği
mdc.spanId string Hayır SpanId Dağıtılmış izleme için span kimliği
  • "Zaman damgası" alanı gereklidir ve UTC biçiminde olmalıdır, diğer tüm alanlar isteğe bağlıdır.
  • İzleme amacıyla "mdc" alanındaki "traceId" ve "spanId" kullanılır.
  • Her JSON kaydını tek satırda günlüğe kaydedin.

Günlük kaydı örneği

{"timestamp":"2021-01-08T09:23:51.280Z","logger":"com.example.demo.HelloController","level":"ERROR","thread":"http-nio-1456-exec-4","mdc":{"traceId":"c84f8a897041f634","spanId":"c84f8a897041f634"},"stackTrace":"java.lang.RuntimeException: get an exception\r\n\tat com.example.demo.HelloController.throwEx(HelloController.java:54)\r\n\","message":"Got an exception","exceptionClass":"RuntimeException"}

Sınırlamalar

JSON günlüklerinin her satırında en fazla 16 K bayt vardır. Tek bir günlük kaydının JSON çıkışı bu sınırı aşarsa, birden çok satıra ayrılır ve her ham satır yapısal olarak ayrıştırılmadan sütuna Log toplanır.

Genellikle, bu durum derin yığın izleme durumu ile istisna kaydında, özellikle AppInsights İşlem İçi Aracısı etkinleştirildiğinde gerçekleşir. Son çıkışın düzgün ayrıştırıldığından emin olmak için stacktrace çıkışına sınır ayarları uygulayın (aşağıdaki yapılandırma örneklerine bakın).

Şema uyumlu JSON günlüğü oluşturma

Spring uygulamaları için Logback ve Log4j2 gibi ortak günlük çerçevelerini kullanarak beklenen JSON günlük biçimini oluşturabilirsiniz.

Logback ile loglama

Spring Boot başlatıcıları kullanılırken varsayılan olarak Logback kullanılır. Logback uygulamaları için logstash-encoder kullanarak JSON biçimli günlük oluşturun. Bu yöntem Spring Boot sürüm 2.1 veya sonraki sürümlerde desteklenir.

Prosedür:

  1. pom.xml dosyanıza logstash bağımlılığı ekleyin.

    <dependency>
        <groupId>net.logstash.logback</groupId>
        <artifactId>logstash-logback-encoder</artifactId>
        <version>6.5</version>
    </dependency>
    
  2. JSON biçimini ayarlamak için yapılandırma dosyanızı logback-spring.xml güncelleştirin.

    <configuration>
        <appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
            <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
                <providers>
                    <timestamp>
                        <fieldName>timestamp</fieldName>
                        <timeZone>UTC</timeZone>
                    </timestamp>
                    <loggerName>
                        <fieldName>logger</fieldName>
                    </loggerName>
                    <logLevel>
                        <fieldName>level</fieldName>
                    </logLevel>
                    <threadName>
                        <fieldName>thread</fieldName>
                    </threadName>
                    <nestedField>
                        <fieldName>mdc</fieldName>
                        <providers>
                            <mdc />
                        </providers>
                    </nestedField>
                    <stackTrace>
                        <fieldName>stackTrace</fieldName>
                        <!-- maxLength - limit the length of the stack trace -->
                        <throwableConverter class="net.logstash.logback.stacktrace.ShortenedThrowableConverter">
                            <maxDepthPerThrowable>200</maxDepthPerThrowable>
                            <maxLength>14000</maxLength>
                            <rootCauseFirst>true</rootCauseFirst>
                        </throwableConverter>
                    </stackTrace>
                    <message />
                    <throwableClassName>
                        <fieldName>exceptionClass</fieldName>
                    </throwableClassName>
                </providers>
            </encoder>
        </appender>
        <root level="info">
            <appender-ref ref="stdout" />
        </root>
    </configuration>
    
  3. Son eki -spring içeren logback-spring.xml günlük yapılandırma dosyası kullanıldığında, günlük yapılandırması Spring aktif profiline göre ayarlanabilir.

    <configuration>
        <springProfile name="dev">
            <!-- JSON appender definitions for local development, in human readable format -->
            <include resource="org/springframework/boot/logging/logback/defaults.xml" />
            <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
            <root level="info">
                <appender-ref ref="CONSOLE" />
            </root>
        </springProfile>
    
        <springProfile name="!dev">
            <!-- JSON appender configuration from previous step, used for staging / production -->
            ...
        </springProfile>
    </configuration>
    

    Yerel geliştirme için Spring uygulamasını JVM bağımsız değişkeniyle -Dspring.profiles.active=dev çalıştırın, ardından JSON biçimli çizgiler yerine insan tarafından okunabilir günlükleri görebilirsiniz.

log4j2 ile kayıt

log4j2 uygulamaları için json-template-layout kullanarak JSON biçimli günlük oluşturun. Bu yöntem Spring Boot sürüm 2.1+'da desteklenir.

Prosedür:

  1. spring-boot-starter öğesinden spring-boot-starter-logging'yi hariç tutun, pom.xml dosyanıza spring-boot-starter-log4j2, log4j-layout-template-json bağımlılıklarını ekleyin.

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j2</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-layout-template-json</artifactId>
        <version>2.14.0</version>
    </dependency>
    
  2. Sınıf yolunuzda bir JSON düzen şablonu dosyası jsonTemplate.json hazırlayın.

    {
        "mdc": {
            "$resolver": "mdc"
        },
        "exceptionClass": {
            "$resolver": "exception",
            "field": "className"
        },
        "stackTrace": {
            "$resolver": "exception",
            "field": "stackTrace",
            "stringified": true
        },
        "message": {
            "$resolver": "message",
            "stringified": true
        },
        "thread": {
            "$resolver": "thread",
            "field": "name"
        },
        "timestamp": {
            "$resolver": "timestamp",
            "pattern": {
                "format": "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'",
                "timeZone": "UTC"
            }
        },
        "level": {
            "$resolver": "level",
            "field": "name"
        },
        "logger": {
            "$resolver": "logger",
            "field": "name"
        }
    }
    
  3. Bu JSON düzen şablonunu log4j2-spring.xml yapılandırma dosyanıza ekleyin.

    <configuration>
        <appenders>
            <console name="Console" target="SYSTEM_OUT">
                <!-- maxStringLength - limit the length of the stack trace -->
                <JsonTemplateLayout eventTemplateUri="classpath:jsonTemplate.json" maxStringLength="14000" />
            </console>
        </appenders>
        <loggers>
            <root level="info">
                <appender-ref ref="Console" />
            </root>
        </loggers>
    </configuration>
    

Log Analytics'te günlükleri analiz etme

Uygulamanız düzgün bir şekilde ayarlandıktan sonra, uygulama konsol günlüğünüz Log Analytics'e akışla gönderilir. Yapısı Log Analytics'te verimli sorgu sağlar.

Log Analytics aracında günlük yapısını denetleyin

Aşağıdaki yordamı kullanın:

  1. Hizmet örneğinizin hizmete genel bakış sayfasına gidin.

  2. İzleme bölümünde Günlükler girdisini seçin.

  3. Bu sorguyu çalıştırın.

    AppPlatformLogsforSpring
    | where TimeGenerated > ago(1h)
    | project AppTimestamp, Logger, CustomLevel, Thread, Message, ExceptionClass, StackTrace, TraceId, SpanId
    
  4. Uygulama günlükleri aşağıdaki görüntüde gösterildiği gibi döner:

    Günlük Sonuçları bölmesini gösteren Azure portalının ekran görüntüsü.

Hata içeren günlük girdilerini göster

Hata içeren günlük girdilerini gözden geçirmek için aşağıdaki sorguyu çalıştırın:

AppPlatformLogsforSpring
| where TimeGenerated > ago(1h) and CustomLevel == "ERROR"
| project AppTimestamp, Logger, ExceptionClass, StackTrace, Message, AppName
| sort by AppTimestamp

Hataları bulmak için bu sorguyu kullanın veya belirli özel durum sınıfını veya hata kodunu bulmak için sorgu terimlerini değiştirin.

Belirli bir traceId için günlük girdilerini gösterme

Belirli bir izleme kimliği "trace_id" için günlük girdilerini gözden geçirmek için aşağıdaki sorguyu çalıştırın:

AppPlatformLogsforSpring
| where TimeGenerated > ago(1h)
| where TraceId == "trace_id"
| project AppTimestamp, Logger, TraceId, SpanId, StackTrace, Message, AppName
| sort by AppTimestamp

Sonraki adımlar