Biên Soạn : Nguyễn Hoàng Đạt - Lớp Java07
Email : hoangdat3179@gmail.com
Bài viết tham khảo : https://docs.spring.io/spring-boot/docs/2.1.18.RELEASE/reference/html/boot-features-logging.html

1.Logging

Spring boot sử dụng Commons Loggin cho tất cả ghi log nội bộ. Các cấu hình mặc định được cung cấp để hỗ trợ cho Java Util Logging, Log4J2, SLF4J và Logback. Trong mỗi trường hợp các logger được định nghĩa sẵn để sử dụng console output cũng như ghi vào file.

Có rất nhiều framework ghi nhật ký có sẵn cho Java. Đừng lo lắng nếu danh sách trên có vẻ khó hiểu. Nói chung, bạn không cần phải thay đổi logging dependency và spring boot defaults hoạt động tốt. Khi bạn triển khai ứng dụng của mình cho một servlet container hoặc máy chủ ứng dụng, việc ghi nhật ký được thực hiện thông qua Java Util Logging API sẽ không được định tuyến vào nhật ký của ứng dụng. Điều này ngăn việc ghi nhật ký được thực hiện bởi bộ chứa hoặc các ứng dụng khác đã được triển khai cho nó xuất hiện trong nhật ký ứng dụng của bạn.

2. Định dạng log

Log đầu ra mặc định của Spring boot có dạng như sau:

2019-03-05 10:57:51.112  INFO 45469 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/7.0.52
2019-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-03-05 10:57:51.253  INFO 45469 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 1358 ms
2019-03-05 10:57:51.698  INFO 45469 --- [ost-startStop-1] o.s.b.c.e.ServletRegistrationBean        : Mapping servlet: 'dispatcherServlet' to [/]
2019-03-05 10:57:51.702  INFO 45469 --- [ost-startStop-1] o.s.b.c.embedded.FilterRegistrationBean  : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]

Các thông tin đầu ra gồm có:

Ngày và thời gian: độ chính xác mili giây và có sắp xếp.
Mức độ log: ERROR, WARN, INFO, DEBUGTRACE.
ID của tiến trình.
Ký hiệu --- ngăn cách để phân biệt bắt đầu của các nội dung log cụ thể.
Tên luông: Bao bởi ngoặc vuông(có thể bị cắt bớt ở đầu ra của console).
Tên logger: Thường là tên của class nguồn(thường viết tắt khi tên package dài và nằm lòng nhiều tầng).
Nội dung log.
Đầu ra console Cầu hình mặc định của log gửi các nội dung ra console khi chúng được ghi ra. Mức ERROR, WARNINFO là các nội dung được ghi mặc định.

Logback không có mức FATAL. Nó được ánh xạ tới ERROR

3. Mã màu đầu ra

Khi terminal hỗ trợ ANSI, màu sắc đầu ra sử dụng để giúp cho việc đọc. Có thể cấu hình spring.output.ansi.enabled với các giá trị hỗ trợ để ghi đè. Mã màu được ấu hình bằng cách sử dụng từ biến đổi %clr. Với dạng đơn giản nhất bộ biến đổi màu đầu ra theo mức độ log như sau:

%clr(%5p)

Bảng dưới mô tả các mức log sẽ tương đương với các màu:

Mức độMàuNội dung
FATALĐỏChỉ định các sự kiện lỗi rất nghiêm trọng có thể khiến ứng dụng bị hủy bỏ hoặc dừng lại.
ERRORĐỏChỉ định các sự kiện lỗi có thể xảy ra mà vẫn cho phép ứng dụng tiếp tục chạy.
WARNVàngChỉ định các tình hướng có thể gây hại cho ứng dụng đang chạy.
INFOXanhChỉ định các thông báo cung cấp thông tin làm nổi bật tiến trình của ứng dụng ở cấp độ chi tiết.
DEBUGXanhChỉ định các sự kiện thông tin chi tiết hữu ích để gỡ lỗi ứng dụng.
TRACEXanhChỉ định các sự kiện thông tin chi tiết hơn cấp độ DEBUG.

log

4. Ghi vào tệp

Mặc định của Spring Boot các log chỉ ghi ra console và không ghi ra các file, khi muốn ghi thêm vào file ngoài hiển thị ở console cần cấu hình logging.file hoặc logging.path trong application.properties Dưới đây là các thuộc tính có thể sử dụng với logging.*

logging.filelogging.pathVí dụMô tả
--Chỉ hiển thị ở console
Chỉ định tệp-dev.logGhi ra tệp log cụ thể. Các tên có là vị trí cụ thể hoặc thự mục liên quan thư mục hiện tại
-Thư mục cụ thể/var/logGhi spring.logvào thư mục cụ thể.

Các tệp khi có kích thước 10MB sẽ được xoay vòng(nén/xóa) đồng thời tạo ra file log mới, các nội dung mức ERROR, WARN vàn INFO mặc định ghi vào. Kích thước có thể tùy chỉnh sử dụng thuộc tính logging.file.max-size.

5. Nhóm log

Trong một số trường hợp việc nhóm lại các log với nhau rất cần mà chúng có thể cấu hình cùng lúc. VD: Khi muốn đổi mức log cho các log liên quan Tomcat mà không thể nhớ các package cấp cao. Để giúp cho việc này, Spring Boot cho phép định nghĩa nhóm log trong môi trường Spring. VD: Sau đây sẽ định nghĩa nhóm tomcat bằng cách thêm vào applicaiton.properties

logging.group.tomcat=org.apache.catalina, org.apache.coyote, org.apache.tomcat

Sau khi định nghĩa, có thể thay đổi mức log cho các log trong nhóm

logging.level.tomcat=TRACE
TênLogger
weborg.springframework.core.codec, org.springframework.http, org.springframework.web, org.springframework.boot.actuate.endpoint.web, org.springframework.boot.web.servlet.ServletContextInitializerBeans
SQLorg.springframework.jdbc.core, org.hibernate.SQL

6. Kết luận

Trong thực tế rất ít khi dùng đến mức TRACE vì nó chứa cả một số thông tin không cần thiết, kể cả việc lưu trữ thì kích thước tệp log tăng một cách đột biến, khi muốn điều tra cũng khó khăn. Việc set mức levels cho các môi trường như dev, staging, prod tùy thuộc vào yêu cầu chi tiết của từng môi trường:

  • dev: Khi phát triển luôn phải xử lý các trường thông thường và bất thường nên xét ở mức DEBUG cũng đủ để điều tra và xử lý.
  • stg: Khi đã phát triển xong cũng có lúc bị thiếu xót do vậy ở môi trường này cần mức DEBUG để điều tra các nguyên nhân gây lỗi trong hệ thống.
  • prod: Trước khi đến môi trường này đã qua hai môi trường devstg nên ở đây mức log có thể dùng INFO vì trong đó đã bao gồm WARNEROROR, còn tùy thuộc vào yêu cầu có thể dùng mứcWARN cho môi trường này.