Bị lỗi org apache commons logging log factory năm 2024

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 frameworks sẵn có cho việc ghi log trong Java. Thông thường không cần thay đổi dependencies và Spring boot mặc định vẫn chạy ổn định. Khi deploy ứng dụng vào một servlet container hoặc ứng dụng server, ghi log thực thi qua Java Util Logging API mà không định tuyến vào các log của ứng dụng. Điều đó ngăn chặn ghi log thực thi bởi container hoặc các ứng dụng mà đã deploy đến xuất hiện trong các log của ứng dụng.

Định dạng log

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

2021-08-19 20:50:52.993  INFO 14060 --- [           main] d.h.r.RedisSpringBootApplicationKt       : Starting RedisSpringBootApplicationKt using Java 11 on DESKTOP-UDIN88B with PID 14060 
2021-08-19 20:50:52.995  INFO 14060 --- [           main] d.h.r.RedisSpringBootApplicationKt       : No active profile set, falling back to default profiles: default
2021-08-19 20:50:53.552  INFO 14060 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
2021-08-19 20:50:53.554  INFO 14060 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
2021-08-19 20:50:53.589  INFO 14060 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 23 ms. Found 0 Redis repository interfaces.
2021-08-19 20:50:53.873  INFO 14060 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2021-08-19 20:50:53.879  INFO 14060 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2021-08-19 20:50:53.880  INFO 14060 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
2021-08-19 20:50:53.936  INFO 14060 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2021-08-19 20:50:53.936  INFO 14060 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 901 ms
2021-08-19 20:50:54.682  INFO 14060 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2021-08-19 20:50:54.690  INFO 14060 --- [           main] d.h.r.RedisSpringBootApplicationKt       : Started RedisSpringBootApplicationKt in 2.015 seconds (JVM running for 3.141)

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:

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/logs") class LoggerController(

    private val loggerService: LoggerService  
    
    ) {
    private val logger = LoggerFactory.getLogger(this.javaClass)  
    @PostMapping("sendLog")  
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {  
        logger.info("LoggerService will run in 3s")  
        Thread.sleep(3000L)  
        loggerService.displayLogs(request)  
        logger.info("LoggerService done")  
        return ResponseEntity.ok(request)  
    }  
    
    }

    3,

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/logs") class LoggerController(

    private val loggerService: LoggerService  
    
    ) {
    private val logger = LoggerFactory.getLogger(this.javaClass)  
    @PostMapping("sendLog")  
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {  
        logger.info("LoggerService will run in 3s")  
        Thread.sleep(3000L)  
        loggerService.displayLogs(request)  
        logger.info("LoggerService done")  
        return ResponseEntity.ok(request)  
    }  
    
    }

    4,

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/logs") class LoggerController(

    private val loggerService: LoggerService  
    
    ) {
    private val logger = LoggerFactory.getLogger(this.javaClass)  
    @PostMapping("sendLog")  
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {  
        logger.info("LoggerService will run in 3s")  
        Thread.sleep(3000L)  
        loggerService.displayLogs(request)  
        logger.info("LoggerService done")  
        return ResponseEntity.ok(request)  
    }  
    
    }

    5,

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/logs") class LoggerController(

    private val loggerService: LoggerService  
    
    ) {
    private val logger = LoggerFactory.getLogger(this.javaClass)  
    @PostMapping("sendLog")  
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {  
        logger.info("LoggerService will run in 3s")  
        Thread.sleep(3000L)  
        loggerService.displayLogs(request)  
        logger.info("LoggerService done")  
        return ResponseEntity.ok(request)  
    }  
    
    }

    6 và

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/logs") class LoggerController(

    private val loggerService: LoggerService  
    
    ) {
    private val logger = LoggerFactory.getLogger(this.javaClass)  
    @PostMapping("sendLog")  
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {  
        logger.info("LoggerService will run in 3s")  
        Thread.sleep(3000L)  
        loggerService.displayLogs(request)  
        logger.info("LoggerService done")  
        return ResponseEntity.ok(request)  
    }  
    
    }

    7.
  • ID của tiến trình.
  • Ký hiệu

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/logs") class LoggerController(

    private val loggerService: LoggerService  
    
    ) {
    private val logger = LoggerFactory.getLogger(this.javaClass)  
    @PostMapping("sendLog")  
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {  
        logger.info("LoggerService will run in 3s")  
        Thread.sleep(3000L)  
        loggerService.displayLogs(request)  
        logger.info("LoggerService done")  
        return ResponseEntity.ok(request)  
    }  
    
    }

    8 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

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

3,

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

4 và

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

5 là các nội dung được ghi mặc định.

Hãy xem ví dụ sau sẽ có phân ghi log ở controller và phân service sử dụng

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@Service
class LoggerServiceImpl : LoggerService {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    override fun displayLogs(request: LoggerDto) {
        logger.trace("TRACE of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.debug("DEBUG of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.info("INFO of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.warn("WARN of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.error("ERROR of code: ${request.errCode} -- message: ${request.errMsg}")
    }
}

2

  • Controller Ở trong controller chỉ log với mức

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/logs") class LoggerController(

    private val loggerService: LoggerService  
    
    ) {
    private val logger = LoggerFactory.getLogger(this.javaClass)  
    @PostMapping("sendLog")  
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {  
        logger.info("LoggerService will run in 3s")  
        Thread.sleep(3000L)  
        loggerService.displayLogs(request)  
        logger.info("LoggerService done")  
        return ResponseEntity.ok(request)  
    }  
    
    }

    5

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

  • Service Ở trong service ghi các mức log để kiểm tra

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@Service
class LoggerServiceImpl : LoggerService {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    override fun displayLogs(request: LoggerDto) {
        logger.trace("TRACE of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.debug("DEBUG of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.info("INFO of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.warn("WARN of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.error("ERROR of code: ${request.errCode} -- message: ${request.errMsg}")
    }
}

Khi xem xét ở đầu ra console các mức log

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

7 và

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

6 không được ghi ra.

2021-08-19 21:41:25.754  INFO 10716 --- [nio-8080-exec-7] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 21:41:28.755  INFO 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 21:41:28.755  WARN 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 21:41:28.755 ERROR 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 21:41:28.755  INFO 10716 --- [nio-8080-exec-7] d.h.r.controller.api.LoggerController    : LoggerService done

Có rất nhiều cách để bật lên cho hiển thị mức log

  • import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.stereotype.Service @Service class LoggerServiceImpl : LoggerService {

    private val logger = LoggerFactory.getLogger(this.javaClass)  
    override fun displayLogs(request: LoggerDto) {  
        logger.trace("TRACE of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.debug("DEBUG of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.info("INFO of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.warn("WARN of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.error("ERROR of code: ${request.errCode} -- message: ${request.errMsg}")  
    }  
    
    }

    6
  • Cấu hình trong

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.stereotype.Service @Service class LoggerServiceImpl : LoggerService {

    private val logger = LoggerFactory.getLogger(this.javaClass)  
    override fun displayLogs(request: LoggerDto) {  
        logger.trace("TRACE of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.debug("DEBUG of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.info("INFO of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.warn("WARN of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.error("ERROR of code: ${request.errCode} -- message: ${request.errMsg}")  
    }  
    
    }

    7 hoặc

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.stereotype.Service @Service class LoggerServiceImpl : LoggerService {

    private val logger = LoggerFactory.getLogger(this.javaClass)  
    override fun displayLogs(request: LoggerDto) {  
        logger.trace("TRACE of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.debug("DEBUG of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.info("INFO of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.warn("WARN of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.error("ERROR of code: ${request.errCode} -- message: ${request.errMsg}")  
    }  
    
    }

    8 cụ thể

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.stereotype.Service @Service class LoggerServiceImpl : LoggerService {

    private val logger = LoggerFactory.getLogger(this.javaClass)  
    override fun displayLogs(request: LoggerDto) {  
        logger.trace("TRACE of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.debug("DEBUG of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.info("INFO of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.warn("WARN of code: ${request.errCode}  message: ${request.errMsg}")  
        logger.error("ERROR of code: ${request.errCode} -- message: ${request.errMsg}")  
    }  
    
    }

    9

Khi bật chế độ debug một số logger của phần lõi sẽ được chọn ra và in ra thông tin ở đầu ra, trong đó chế độ debug không cấu hình tất cả các nội dung mức

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

6.

  • Config logger mức

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/logs") class LoggerController(

    private val loggerService: LoggerService  
    
    ) {
    private val logger = LoggerFactory.getLogger(this.javaClass)  
    @PostMapping("sendLog")  
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {  
        logger.info("LoggerService will run in 3s")  
        Thread.sleep(3000L)  
        loggerService.displayLogs(request)  
        logger.info("LoggerService done")  
        return ResponseEntity.ok(request)  
    }  
    
    }

    6

logging:
  level:
    root: DEBUG
2021-08-19 22:03:25.161 DEBUG 1040 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/api/logs/sendLog", parameters={}
2021-08-19 22:03:25.163 DEBUG 1040 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to dev.hlk.redis_spring_boot.controller.api.LoggerController
# sendLog(LoggerDto)
2021-08-19 22:03:25.238 DEBUG 1040 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [LoggerDto(errCode=1, errMsg=Logger)]
2021-08-19 22:03:25.242  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 22:03:28.254 DEBUG 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : DEBUG of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 22:03:28.254  WARN 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 22:03:28.254 ERROR 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService done

  • Config logger mức

    import dev.hlk.redis_spring_boot.model.LoggerDto import dev.hlk.redis_spring_boot.service.LoggerService import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/api/logs") class LoggerController(

    private val loggerService: LoggerService  
    
    ) {
    private val logger = LoggerFactory.getLogger(this.javaClass)  
    @PostMapping("sendLog")  
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {  
        logger.info("LoggerService will run in 3s")  
        Thread.sleep(3000L)  
        loggerService.displayLogs(request)  
        logger.info("LoggerService done")  
        return ResponseEntity.ok(request)  
    }  
    
    }

    7

logging:
  level:
    root: TRACE
2021-08-19 22:02:20.465 DEBUG 13088 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/api/logs/sendLog", parameters={}
2021-08-19 22:02:20.467 DEBUG 13088 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to dev.hlk.redis_spring_boot.controller.api.LoggerController
# sendLog(LoggerDto)
2021-08-19 22:02:20.538 DEBUG 13088 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [LoggerDto(errCode=1, errMsg=Logger)]
2021-08-19 22:02:20.542  INFO 13088 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 22:02:21.436 DEBUG 13088 --- [80-ClientPoller] org.apache.tomcat.util.net.NioEndpoint   : timeout completed: keys processed=1; now=1629385341436; nextExpiration=1629385341176; keyCount=0; hasEvents=false; eval=false
2021-08-19 22:02:22.437 DEBUG 13088 --- [80-ClientPoller] org.apache.tomcat.util.net.NioEndpoint   : timeout completed: keys processed=1; now=1629385342437; nextExpiration=1629385342436; keyCount=0; hasEvents=false; eval=false
2021-08-19 22:02:23.441 DEBUG 13088 --- [80-ClientPoller] org.apache.tomcat.util.net.NioEndpoint   : timeout completed: keys processed=1; now=1629385343441; nextExpiration=1629385343437; keyCount=0; hasEvents=false; eval=false
2021-08-19 22:02:23.549 TRACE 13088 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : TRACE of code: 1 -- message: Logger
2021-08-19 22:02:23.549 DEBUG 13088 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : DEBUG of code: 1 -- message: Logger
2021-08-19 22:02:23.549  INFO 13088 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 22:02:23.549  WARN 13088 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 22:02:23.549 ERROR 13088 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 22:02:23.549  INFO 13088 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService done

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

2021-08-19 21:41:25.754  INFO 10716 --- [nio-8080-exec-7] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 21:41:28.755  INFO 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 21:41:28.755  WARN 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 21:41:28.755 ERROR 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 21:41:28.755  INFO 10716 --- [nio-8080-exec-7] d.h.r.controller.api.LoggerController    : LoggerService done

3 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

2021-08-19 21:41:25.754  INFO 10716 --- [nio-8080-exec-7] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 21:41:28.755  INFO 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 21:41:28.755  WARN 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 21:41:28.755 ERROR 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 21:41:28.755  INFO 10716 --- [nio-8080-exec-7] d.h.r.controller.api.LoggerController    : LoggerService done

4. 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àu Nội dung

2021-08-19 21:41:25.754  INFO 10716 --- [nio-8080-exec-7] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 21:41:28.755  INFO 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 21:41:28.755  WARN 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 21:41:28.755 ERROR 10716 --- [nio-8080-exec-7] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 21:41:28.755  INFO 10716 --- [nio-8080-exec-7] d.h.r.controller.api.LoggerController    : LoggerService done

5 Đỏ 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.

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

3 Đỏ 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.

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

4 Vàng Chỉ định các tình hướng có thể gây hại cho ứng dụng đang chạy.

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

5 Xanh Chỉ đị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.

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

6 Xanh Chỉ định các sự kiện thông tin chi tiết hữu ích để gỡ lỗi ứng dụng.

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

7 Xanh Chỉ định các sự kiện thông tin chi tiết hơn cấp độ

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

6.

Bị lỗi org apache commons logging log factory năm 2024

Ngoài ra, có thể chỉ định màu sắc hoặc kiểu mẫu bằng cách cung cấp màu sắc hoặc kiểu mẫu đó như một tùy chọn cho việc biến đổi. Ví dụ: để làm cho văn bản có màu vàng cần sử dụng cài đặt sau:

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

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:
  level:
    root: DEBUG

2 hoặc

logging:
  level:
    root: DEBUG

3 trong

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Service
@Service
class LoggerServiceImpl : LoggerService {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    override fun displayLogs(request: LoggerDto) {
        logger.trace("TRACE of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.debug("DEBUG of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.info("INFO of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.warn("WARN of code: ${request.errCode} -- message: ${request.errMsg}")
        logger.error("ERROR of code: ${request.errCode} -- message: ${request.errMsg}")
    }
}

7 Dưới đây là các thuộc tính có thể sựng với

logging:
  level:
    root: DEBUG

5

logging:
  level:
    root: DEBUG

2

logging:
  level:
    root: DEBUG

3 Ví dụ Mô tả - - Chỉ hiển thị ở console Chỉ định tệp -

logging:
  level:
    root: DEBUG

8 Ghi 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/log Ghi

logging:
  level:
    root: DEBUG

9 và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

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

3,

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

4 vàn

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

5 mặc định ghi vào. Kích thước có thể tùy chỉnh sử dụng thuộc tính

2021-08-19 22:03:25.161 DEBUG 1040 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/api/logs/sendLog", parameters={}
2021-08-19 22:03:25.163 DEBUG 1040 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to dev.hlk.redis_spring_boot.controller.api.LoggerController
# sendLog(LoggerDto)
2021-08-19 22:03:25.238 DEBUG 1040 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [LoggerDto(errCode=1, errMsg=Logger)]
2021-08-19 22:03:25.242  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 22:03:28.254 DEBUG 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : DEBUG of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 22:03:28.254  WARN 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 22:03:28.254 ERROR 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService done

3.

VD: Ghi log vào tệp trong thư mục

2021-08-19 22:03:25.161 DEBUG 1040 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/api/logs/sendLog", parameters={}
2021-08-19 22:03:25.163 DEBUG 1040 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to dev.hlk.redis_spring_boot.controller.api.LoggerController
# sendLog(LoggerDto)
2021-08-19 22:03:25.238 DEBUG 1040 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [LoggerDto(errCode=1, errMsg=Logger)]
2021-08-19 22:03:25.242  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 22:03:28.254 DEBUG 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : DEBUG of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 22:03:28.254  WARN 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 22:03:28.254 ERROR 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService done

4

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

0

sau khi kiểm tra thư mục đã định nghĩa sẽ thầy mộ file

logging:
  level:
    root: DEBUG

8 sinh ra trong thư mục

2021-08-19 22:03:25.161 DEBUG 1040 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/api/logs/sendLog", parameters={}
2021-08-19 22:03:25.163 DEBUG 1040 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to dev.hlk.redis_spring_boot.controller.api.LoggerController
# sendLog(LoggerDto)
2021-08-19 22:03:25.238 DEBUG 1040 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [LoggerDto(errCode=1, errMsg=Logger)]
2021-08-19 22:03:25.242  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 22:03:28.254 DEBUG 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : DEBUG of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 22:03:28.254  WARN 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 22:03:28.254 ERROR 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService done

6.

Bị lỗi org apache commons logging log factory năm 2024

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

2021-08-19 22:03:25.161 DEBUG 1040 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/api/logs/sendLog", parameters={}
2021-08-19 22:03:25.163 DEBUG 1040 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to dev.hlk.redis_spring_boot.controller.api.LoggerController
# sendLog(LoggerDto)
2021-08-19 22:03:25.238 DEBUG 1040 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [LoggerDto(errCode=1, errMsg=Logger)]
2021-08-19 22:03:25.242  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 22:03:28.254 DEBUG 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : DEBUG of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 22:03:28.254  WARN 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 22:03:28.254 ERROR 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService done

7 bằng cách thêm vào

2021-08-19 22:03:25.161 DEBUG 1040 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/api/logs/sendLog", parameters={}
2021-08-19 22:03:25.163 DEBUG 1040 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to dev.hlk.redis_spring_boot.controller.api.LoggerController
# sendLog(LoggerDto)
2021-08-19 22:03:25.238 DEBUG 1040 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [LoggerDto(errCode=1, errMsg=Logger)]
2021-08-19 22:03:25.242  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 22:03:28.254 DEBUG 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : DEBUG of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 22:03:28.254  WARN 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 22:03:28.254 ERROR 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService done

8

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

1

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

import dev.hlk.redis_spring_boot.model.LoggerDto
import dev.hlk.redis_spring_boot.service.LoggerService
import org.slf4j.LoggerFactory
import org.springframework.http.ResponseEntity
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/api/logs")
class LoggerController(
    private val loggerService: LoggerService
) {
    private val logger = LoggerFactory.getLogger(this.javaClass)
    @PostMapping("sendLog")
    fun sendLog(@RequestBody request: LoggerDto): ResponseEntity<LoggerDto> {
        logger.info("LoggerService will run in 3s")
        Thread.sleep(3000L)
        loggerService.displayLogs(request)
        logger.info("LoggerService done")
        return ResponseEntity.ok(request)
    }
}

2

Trong Spring Boot các nhóm log sau được định nghĩa sẵn và sử dụng được luôn

Tên Logger web

2021-08-19 22:03:25.161 DEBUG 1040 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet        : POST "/api/logs/sendLog", parameters={}
2021-08-19 22:03:25.163 DEBUG 1040 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to dev.hlk.redis_spring_boot.controller.api.LoggerController
# sendLog(LoggerDto)
2021-08-19 22:03:25.238 DEBUG 1040 --- [nio-8080-exec-1] m.m.a.RequestResponseBodyMethodProcessor : Read "application/json;charset=UTF-8" to [LoggerDto(errCode=1, errMsg=Logger)]
2021-08-19 22:03:25.242  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService will run in 3s
2021-08-19 22:03:28.254 DEBUG 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : DEBUG of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : INFO of code: 1 -- message: Logger
2021-08-19 22:03:28.254  WARN 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : WARN of code: 1 -- message: Logger
2021-08-19 22:03:28.254 ERROR 1040 --- [nio-8080-exec-1] d.h.r.service.impl.LoggerServiceImpl     : ERROR of code: 1 -- message: Logger
2021-08-19 22:03:28.254  INFO 1040 --- [nio-8080-exec-1] d.h.r.controller.api.LoggerController    : LoggerService done

9,

logging:
  level:
    root: TRACE

0,

logging:
  level:
    root: TRACE

1,

logging:
  level:
    root: TRACE

2,

logging:
  level:
    root: TRACE

3 sql

logging:
  level:
    root: TRACE

4,

logging:
  level:
    root: TRACE

5

Kết luận

Trong thực tế rất ít khi dùng đến mức 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ư

logging:
  level:
    root: TRACE

6,

logging:
  level:
    root: TRACE

7,

logging:
  level:
    root: TRACE

8 tùy thuộc vào yêu cầu chi tiết của từng môi trường: