Loglash

All lectures for UZ purposes
Daraja, Dars
Mavjud

Spring Boot ichki darajada keng qamrovli loglash (logging) uchun Commons Logging foydalanadi, lekin asosiy log implementatsiyasini ochiq qoldiradi. Odatiy konfiguratsiyalar Java Util Logging, Log4J2 va Logback uchun mavjud. Har bir holatda log dispetcherlari oldindan konsol chiqishi va faylga yozish imkoniyati bilan sozlangan.

Odatiy bo'lib, agar "Starters" ishlatilsa, Logback loglash uchun ishlatiladi. Javanning Util Logging, Commons Logging, Log4J yoki SLF4J ishlatadigan kutubxonalar uchun ham to'g'ri ishlashi uchun mos marshrutlash Logbackda ta'minlangan.

Java uchun ko'plab loglash frameworklari mavjud. Agar yuqorida keltirilgan ro'yxat sizni chalg'itsa, xavotir olmang. Odatda loglash bog'liqligini o'zgartirish shart emas va Spring Bootning odatiy sozlamalari juda yaxshi ishlaydi.
Agar siz o'z aplikatsiyangizni servlet konteynerida yoki aplikatsiya serverida ishlayotgan bo'lsa, Java Util Logging API orqali amalga oshirilgan loglash aplikatsiya loglariga yo'naltirilmaydi. Bu konteyner yoki unda joylashtirilgan boshqa aplikatsiyalar tomonidan amalga oshirilgan yozuvlarning aplikatsiya loglariga tushib qolishining oldini oladi.

Logger Formati

Spring Bootdagi odatiy log chiqishi quyidagi misolga o'xshaydi:

2022-10-20 12:40:11.311  INFO 16138 --- [           main] o.s.b.d.f.s.MyApplication                : Starting MyApplication using Java 1.8.0_345 on myhost with PID 16138 (/opt/apps/myapp.jar started by myuser in /opt/apps/)
2022-10-20 12:40:11.330  INFO 16138 --- [           main] o.s.b.d.f.s.MyApplication                : No active profile set, falling back to 1 default profile: "default"
2022-10-20 12:40:13.056  INFO 16138 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2022-10-20 12:40:13.070  INFO 16138 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2022-10-20 12:40:13.070  INFO 16138 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.68]
2022-10-20 12:40:13.178  INFO 16138 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2022-10-20 12:40:13.178  INFO 16138 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1762 ms
2022-10-20 12:40:13.840  INFO 16138 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-10-20 12:40:13.850  INFO 16138 --- [           main] o.s.b.d.f.s.MyApplication                : Started MyApplication in 4.062 seconds (JVM running for 5.452)

Quyidagi elementlar chiqadi:

  • Sana va vaqt: millisekundlik aniqlik va oson saralash.

  • Log darajasi: ERROR, WARN, INFO, DEBUG yoki TRACE.

  • Process identifikatori.

  • Ajratuvchi --- log xabarlarining boshlanishini ajratish uchun.

  • Thread nomi: kvadrat qavslar ichida (konsol uchun qisqartirilgan bo'lishi mumkin).

  • Log dispetcherining nomi: odatda bu original class nomi (ko'pincha qisqartirilgan).

  • Log xabari.

Logback FATAL darajasiga ega emas. U ERROR darajasida ko'rsatiladi.

Konsol Chiqishi

Logning odatiy konfiguratsiyasida xabarlar yozilganidan so'ng konsolda ko'rsatiladi. Odatiy bo'lib ERROR, WARN va INFO darajasidagi xabarlar loglanadi. Siz "debug" rejimini ham aktivlashtirishingiz mumkin, aplikatsiyani --debug flagi bilan ishga tushirib:

$ java -jar myapp.jar --debug
Shuningdek, application.properties faylida debug=true belgilasangiz bo'ladi.

Agar debug rejimi yoqilgan bo'lsa, asosiy log dispetcherlari (ichki konteyner, Hibernate va Spring Boot) qo'shimcha ma'lumotlarni ko'rsatishga sozlanadi. Debug rejimini yoqish emas aplikatsiyani DEBUG darajasidagi barcha xabarlarni ro'yxatga olishga moslashtirmaydi.

Bundan tashqari, "trace" rejimini yoqishingiz mumkin, aplikatsiyani --trace flagi bilan ishga tushirib (yoki trace=true application.properties faylida). Bu ichki konteyner, Hibernate sxemasi generatsiyasi va Spring portfelining barcha log tracingini ro'yxatga olish imkonini beradi.

Rangli Chiqish

Agar terminal ANSI ni qo'llab-quvvatlasa, o'qishni osonlashtirish uchun rangli chiqish ishlatiladi. Siz spring.output.ansi.enabled ni qo'llab-quvvatlanadigan qiymatga o'rnatishi mumkin, avtomatik aniqlashni o'zgartirish uchun.

Rangli kodlash %clr konversiya so'zi yordamida konfiguratsiya qilinadi. Eng oddiy shaklida konvertor logning darajasiga ko'ra chiqishni bo'yoqlaydi, quyidagi misolda ko'rsatilgandek:

%clr(%5p)

Quyidagi jadvalda log darajalari va ranglar mosligi tasvirlangan:

Daraja Rang

FATAL

Qizil

ERROR

Qizil

WARN

Sariq

INFO

Yashil

DEBUG

Yashil

TRACE

Yashil

Bundan tashqari, konversiyaga parametr sifatida foydalaniladigan rang yoki uslubni belgilashingiz mumkin. Masalan, matnni sariq qilish uchun quyidagi konfiguratsiyani foydalaning:

%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){yellow}

Quyidagi ranglar va uslublar qo'llab-quvvatlanadi:

  • blue

  • cyan

  • faint

  • green

  • magenta

  • red

  • yellow

Faylga chiqarish

Odatda Spring Boot faqat konsolda log olib boradi va fayllarga yozmaydi. Agar konsolga chiqishdan tashqari log fayllariga yozib borish kerak bo'lsa, logging.file.name yoki logging.file.path ni o'rnatishingiz kerak (masalan, application.properties faylida).

Quyidagi jadvalda logging.* xususiyatlarini qanday ishlatish mumkinligi ko'rsatilgan:

Jadval 5. Loglash xususiyatlari
logging.file.name logging.file.path Misol Tavsif

(yo'q)

(yo'q)

Faqatgina konsolga log yozadi.

Muayyan fayl

(yo'q)

my.log

Ko'rsatilgan log fayliga yozadi. Nomi aniq joy yoki joriy katalog bilan bog'liq bo'lishi mumkin.

(yo'q)

Muayyan katalog

/var/log

Ko'rsatilgan katalogga spring.log yozadi. Nomi aniq joy yoki joriy katalog bilan bog'liq bo'lishi mumkin.

Log fayllari hajmi 10 MB ga yetganda aylantiriladi va konsol chiqishida bo'lgani kabi, odatiy bo'lib ERROR, WARN va INFO darajasidagi xabarlar loglanadi.

Loglash xususiyatlari haqiqiy log infratuzilmasidan mustaqil. Shunga ko'ra, maxsus konfiguratsion kalitlar (masalan, Logback uchun logback.configurationFile) Spring Boot tomonidan boshqarilmaydi.

Fayl aylantirish

Agar siz Logback ishlatsangiz, fayl aylantirish parametrlarini aniq sozlashingiz mumkin application.properties yoki application.yaml faylidan. Boshqa barcha loglash tizimlari uchun aylantirish parametrlarini o'zingiz sozlashingiz kerak bo'ladi (masalan, agar siz Log4J2 ishlatsangiz, log4j2.xml yoki log4j2-spring.xml faylini qo'shishingiz mumkin).

Quyidagi aylantirish siyosati xususiyatlari qo'llab-quvvatlanadi:

Nomi Tavsif

logging.logback.rollingpolicy.file-name-pattern

Log arxivlarini yaratish uchun fayl nomi shabloni.

logging.logback.rollingpolicy.clean-history-on-start

Aplikatsiya ishga tushganda log arxivini tozalash kerakmi.

logging.logback.rollingpolicy.max-file-size

Faylning arxivdan oldingi maksimal hajmi.

logging.logback.rollingpolicy.total-size-cap

Log arxivining o'chirilishidan oldingi maksimal hajmi.

logging.logback.rollingpolicy.max-history

Log arxivida saqlanishi kerak bo'lgan maksimal fayllar soni (odatiy 7).

Loglash darajalari

Barcha qo'llab-quvvatlanadigan loglash tizimlari uchun loglash darajalari Environment dan Spring orqali o'rnatilishi mumkin (masalan, application.properties da) logging.level.<logger-name>=<level> orqali, bu yerda level darajalardan biri: TRACE, DEBUG, INFO, WARN, ERROR, FATAL yoki OFF. Siz root log dispetcherini logging.level.root orqali konfiguratsiya qilishingiz mumkin.

Quyidagi misollar application.properties da mavjud bo'lishi mumkin bo'lgan loglash parametrlarini ko'rsatadi:

Xususiyatlar
logging.level.root=warn
logging.level.org.springframework.web=debug
logging.level.org.hibernate=error
Yaml
logging:
  level:
    root: "warn"
    org.springframework.web: "debug"
    org.hibernate: "error"

Shuningdek, loglash darajalarini muhit o'zgaruvchilari orqali o'rnatishingiz mumkin. Masalan, LOGGING_LEVEL_ORG_SPRINGFRAMEWORK_WEB=DEBUG org.springframework.web uchun DEBUG qiymatini o'rnatadi.

Yuoqridagi usul faqat paket darajasida loglash uchun ishlaydi. Chunki noaniq bog'lanish har doim muhit o'zgaruvchilarini kichik harflarga aylantiradi, shuning uchun alohida class uchun loglashni shu yo'l bilan sozlash mumkin emas. Agar class uchun loglashni sozlash kerak bo'lsa, SPRING_APPLICATION_JSON o'zgaruvchisini ishlatishingiz mumkin.

Log Guruhlari

Ko'p hollarda tegishli log dispetcherlarini birgalikda guruhlash imkoniyatiga ega bo'lish foydali, shuncha bir maromda konfiguratsiya qilish mumkin. Masalan, Tomcat bilan bog'liq barcha log dispetcherlarini ko'pincha loglash darajlarini o'zgartirish kerak bo'lishi mumkin, lekin yuqori darajadagi paketlarni eslab qolishni oson bo'lmaydi.

Shu maqsadda Spring Boot sizning Environment da log guruhlarini aniqlash imkonini beradi. Masalan, "tomcat-guruhi" ni application.properties fayliga qo'shib quyidagi tarzda aniqlashingiz mumkin:

Xususiyatlar
logging.group.tomcat=org.apache.catalina,org.apache.coyote,org.apache.tomcat
Yaml
logging:
  group:
    tomcat: "org.apache.catalina,org.apache.coyote,org.apache.tomcat"

Qo'shimcha tarzda, siz guruhdagi barcha log dispetcherlarining darajasini bir qator bilan o'zgartirishingiz mumkin:

Xususiyatlar
logging.level.tomcat=trace
Yaml
logging:
  level:
    tomcat: "trace"

Spring Boot "qutidan tashqariga" foydalanish imkonini beradigan quyidagi oldindan belgilangan log guruhlarini o'z ichiga oladi:

Nomi Log dispetcherlari

web

org.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans

sql

org.springframework.jdbc.core, org.hibernate.SQL, org.jooq.tools.LoggerListener

Logni ishni tugatish interceptori

Loglash resurslarini aplikatsiya ishini tugatishda tozalash uchun, JVM dan chiqishda loglash tizimini tozalaydi. Bu ishni tugatish interceptori avtomatik tarzda ro'yxatga olinadi, agar aplikatsiya war-fayl sifatida joylashtirilmasa. Agar aplikatsiyada murakkab kontekstlar iyerarxiyasi mavjud bo'lsa, ishni tugatish interceptori ehtiyojlaringizga mos kelmasligi mumkin. Agar shunday bo'lsa, interceptorni o'chiring va loglash tizimi tomonidan taqdim etilgan boshqa variantlarni ko'rib chiqing. Masalan, Logback kontekstli selektorlar ni taqdim etadi, bu har bir Logger-ni o'z kontekstida yaratishga imkon beradi. logging.register-shutdown-hook xususiyatini ishlatib ishni tugatish interceptori oʻchirilishi mumkin. false ga o'rnatish ro'yxatdan o'tishni o'chiradi. Bu xususiyatni application.properties yoki application.yaml faylida o'rnatishingiz mumkin:

Xususiyatlar
logging.register-shutdown-hook=false
Yaml
logging:
  register-shutdown-hook: false

Custom Loglash Konfiguratsiyasi

Loglash tizimlarini classpathda tegishli kutubxonalarni qo'shish orqali ishlashi mumkin va qo'shimcha maxsus konfiguratsiyani classpathning ildiziga yoki Spring uchun Environment dagi quyidagi xususiyat bilan belgilangan joyga topshirish orqali amalga oshirishingiz mumkin: logging.config.

Spring Bootni ma'lum bir loglash tizimini qattiq ishlatishga majbur qilish mumkin org.springframework.boot.logging.LoggingSystem tizim xususiyati orqali. Qiymat LoggingSystem implementatsiyasining to'liq class nomi bo'lishi kerak. Shuningdek, loglash konfiguratsiyasini to'liq o'chirish mumkin, none qiymatini ishlatib.

Loglash ApplicationContext yaratishdan oldin ishga tushirilgani uchun, loglashni @PropertySources annotatsiyasidan foydalanib boshqara olmaysiz. Tizim xususiyatlari orqali loglash tizimini oʻzgartirish yoki uni toʻliq oʻchirishning yagona usuli mavjud.

Loglash tizimiga bog'liq holda quyidagi fayllar yuklanadi:

Loglash sistemi Sozlash

Logback

logback-spring.xml, logback-spring.groovy, logback.xml, yoki logback.groovy

Log4j2

log4j2-spring.xml yoki log4j2.xml

JDK (Java Util Logging)

logging.properties

Mumkin bo'lsa, loglash konfiguratsiyasi uchun -spring variantlarini ishlatishni tavsiya qilamiz (masalan, logback-spring.xml, logback.xml o'rniga). Standart konfiguratsiya joylari ishlatilsa, Spring logni to'liq boshqarishni qila olmaydi.
Java Util Loggingda ma'lum bir jarayon yuklashda kuzatiladi, bu "ishlanuvchi jar-fayl" dan ishga tushirilganda muammolarni keltirib chiqaradi. Mumkin bo'lsa, "ishlanuvchi jar-fayl" dan ishga tushirilishidan qochishingizni tavsiya qilamiz.

Simplificationni osonlashtirish uchun Spring Environment dan ba'zi boshqa xususiyatlarni tizim xususiyatlariga o'tkazadi, quyidagi jadvalda keltirilgan:

Spring atrof-muhiti Tizim xususiyati Izohlar

logging.exception-conversion-word

LOG_EXCEPTION_CONVERSION_WORD

Istisnolarni ro'yxatdan o'tkazishda ishlatiladigan konversiya so'zi.

logging.file.name

LOG_FILE

Agar belgilangan bo'lsa, odatiy log konfiguratsiyasida ishlatiladi.

logging.file.path

LOG_PATH

Agar belgilangan bo'lsa, odatiy log konfiguratsiyasida ishlatiladi.

logging.pattern.console

CONSOLE_LOG_PATTERN

Konsol uchun ishlatiladigan log shabloni (STDOUT).

logging.pattern.dateformat

LOG_DATEFORMAT_PATTERN

Log sanasini formatlash uchun appender shabloni.

logging.charset.console

CONSOLE_LOG_CHARSET

Konsolga chiqariladigan log uchun ishlatiladigan kodlash.

logging.pattern.file

FILE_LOG_PATTERN

Fayl uchun ishlatiladigan log shabloni (agar LOG_FILE xususiyati yoqilgan bo'lsa).

logging.charset.file

FILE_LOG_CHARSET

Fayllarda log olib borish uchun ishlatiladigan kodlash (agar LOG_FILE xususiyati yoqilgan bo'lsa).

logging.pattern.level

LOG_LEVEL_PATTERN

Log darajasini o'qishda ishlatiladigan format (odatiy %5p).

PID

PID

Joriy jarayon identifikatori (agar bu mumkin bo'lsa va hali OS muhit variabili sifatida belgilanmagan bo'lsa).

Agar siz Logback foydalansangiz, shuningdek quyidagi xususiyatlar o'tkaziladi:

Spring atrof-muhiti Tizim xususiyati Izohlar

logging.logback.rollingpolicy.file-name-pattern

LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN

Log arxivlarining fayl nomi uchun shablon (odatiy ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz).

logging.logback.rollingpolicy.clean-history-on-start

LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START

Log arxividagi fayllarni aplikatsiya ishga tushganda tozalash kerakmi.

logging.logback.rollingpolicy.max-file-size

LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE

Log faylining maksimal hajmi.

logging.logback.rollingpolicy.total-size-cap

LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP

Log arxivlarining umumiy saqlash sig'imi.

logging.logback.rollingpolicy.max-history

LOGBACK_ROLLINGPOLICY_MAX_HISTORY

Log arxivida saqlanishi kerak bo'lgan maksimal fayllar soni.

Barcha qo'llab-quvvatlanadigan loglash tizimlari o'z konfiguratsion fayllarini tahlil qilishda tizim xususiyatlariga murojaat qilishi mumkin. Namunaviy konfiguratsiyalarni spring-boot.jar da ko'rishingiz mumkin:

Agar siz loglash xususiyatida joy egasiga ehtiyoj bo'lsa, Spring Boot sintaksisini qo'llab-quvvatlangan frameworkning sintaksisidan foydalanishingiz kerak. Ayniqsa, agar siz Logback foydalansangiz, xususiyatning nomi va uning odatiy qiymati orasidagi ajratuvchi sifatida : dan, :- dan emas foydalanishingiz kerak.

MDC konteksini va boshqa maxsus tarkibni log satrlari ichiga qo'shish mumkin, faqat LOG_LEVEL_PATTERN (yoki Logbackda logging.pattern.level)ni o'zgartirish orqali. Misol uchun, agar siz logging.pattern.level=user:%X{user} %5p foydalansangiz, loglashning odatiy formatida "user" uchun MDC yozuvi mavjud bo'lsa, quyidagi misolda ko'rsatilgandek, mavjud bo'ladi.

2019-08-30 12:30:04.031 user:someone INFO 22174 --- [  nio-8080-exec-0] demo.Controller
Handling authenticated request

Logback kengaytmalari

Spring Boot Logback uchun bir qator kengaytmalar beradi, ular konfiguratsiyani chuqurroq qilishni osonlashtiradi. logback-spring.xml konfiguratsion faylida bu kengaytmalarni ishlatishingiz mumkin.

Standart logback.xml konfiguratsion fayli juda erta yuklanadi, shuning uchun undan kengaytmalar ishlatib bo'lmaydi. logback-spring.xml dan foydalanishingiz yoki logging.config xususiyatini belgilashingiz kerak.
Kengaytmalar Logbackdan konfiguratsiyani skanerlash bilan ishlay olmaydi. Agar siz buni qilishga harakat qilsangiz, konfiguratsion faylga kiritilgan o'zgartirishlar quyidagi kabi xato xabarini yozib qo'yadi:
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProperty], current ElementPath is [[configuration][springProperty]]
ERROR in ch.qos.logback.core.joran.spi.Interpreter@4:71 - no applicable action for [springProfile], current ElementPath is [[configuration][springProfile]]

Aniq profilga oid konfiguratsiya

<springProfile> tegidan foydalanish orqali konfiguratsiya qismlarini faqat Springning faol profillariga asoslangan bog'lanish yoki chiqarish imkonini beradi. Profil bo'limlarini <configuration> elementining istalgan joyida qo'llab-quvvatlanadi. Konfiguratsiyani qabul qiladigan profilni belgilash uchun name atributidan foydalaning. <springProfile> tegi profilning nomini (masalan, staging) yoki profil ifodasini o'z ichiga olishi mumkin. Profil ifodasi yanada murakkab profil mantiqini ifodalash imkonini beradi (masalan, production & (eu-central | eu-west)). Quyidagi listda uchta profil namunasi ko'rsatilgan:

<springProfile name="staging">
    <!-- "staging" profili faol bo'lsa, faollashtiriladigan konfiguratsiya -->
</springProfile>
<springProfile name="dev | staging">
    <!-- "dev" yoki "staging" profili faol bo'lsa, faollashtiriladigan konfiguratsiya -->
</springProfile>
<springProfile name="!production">
    <!-- "production" profili faol bo'lsa, faollashtiriladigan konfiguratsiya -->
</springProfile>

Atrof-muhit xususiyatlari

<springProperty> tegi Springdan Environment dan Logback uchun xususiyatlarni ochish imkonini beradi. Bu Logback konfiguratsiyasida application.properties faylidan qiymatlar olish kerak bo'lsa foydali bo'lishi mumkin. Ushbu teg Logbackdagi standart <property> tegiga o'xshaydi. Biroq, to'g'ridan-to'g'ri value berish o'rniga siz xususiyatning source ni (Spring Environment dan) belgilaysiz. Agar xususiyatni local ko'rinish sohasida saqlash kerak bo'lsa, scope atributini ishlatishingiz mumkin. Agar muqobil qiymat kerak bo'lsa (xususiyat Environment da o'rnatilmagan bo'lsa), defaultValue atributidan foydalanishingiz mumkin. Quyidagi misolda Logbackda foydalanish uchun xususiyatlarni ochishni ko'rsatgan:

<springProperty scope="context" name="fluentHost" source="myapp.fluentd.host"
        defaultValue="localhost"/>
<appender name="FLUENT" class="ch.qos.logback.more.appenders.DataFluentAppender">
    <remoteHost>${fluentHost}</remoteHost>
    ...
</appender>
Siz source ni kebab-case formatida berishingiz kerak (masalan, my.property-name). Biroq, xususiyatlar yumshoq qoidalarga rioya qilgan holda Environment ga qo'shilishi mumkin.
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION