首页 > 解决方案 > springboot中记录器的无效声明

问题描述

我使用带有 kotlin 的 spring boot 我在 gradle.kt 中添加了 lombook 依赖,但是当我使用 log.info() 函数时出现错误。我还在一个名为 logback-spring.xml 的单独文件中定义记录器详细信息我没有知道为什么我在日志声明中出现错误。我在日志中的订单控制器中使用 log.Info() 时出现错误,它向我显示指令“未解析的引用:日志”或创建局部变量日志这是错误

Unresolved reference: log

订单控制器.kt

package com.main.orderservice.controller

import com.main.orderservice.client.InventoryClient
import com.main.orderservice.entity.Order
import com.main.orderservice.model.OrderDto
import com.main.orderservice.repository.OrderRepository
import lombok.RequiredArgsConstructor
import lombok.extern.slf4j.Slf4j
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreaker
import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JCircuitBreakerFactory
import org.springframework.cloud.stream.function.StreamBridge
import org.springframework.messaging.support.MessageBuilder
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
import java.util.*
import java.util.concurrent.ExecutorService
import java.util.function.Supplier


@RestController
@RequestMapping("/api/order")
@RequiredArgsConstructor
@Slf4j
class OrderController {
    @Autowired
    private lateinit var orderRepository: OrderRepository
    @Autowired
    private lateinit var inventoryClient: InventoryClient
    @Autowired
    private lateinit var circuitBreakerFactory: Resilience4JCircuitBreakerFactory
    @Autowired
    private lateinit var streamBridge: StreamBridge
    @Autowired
    private lateinit var traceableExecutorService: ExecutorService

    @PostMapping
    fun placeOrder(@RequestBody orderDto: OrderDto): String {
        circuitBreakerFactory.configureExecutorService(traceableExecutorService)
        val circuitBreaker: Resilience4JCircuitBreaker = circuitBreakerFactory.create("inventory")
        val booleanSupplier =
            Supplier<Boolean> {
                orderDto.OrderLineItemList?.stream()
                    ?.allMatch { lineItem ->
                        log.info("Making Call to Inventory Service for SkuCode {}", lineItem.skuCode)
                        inventoryClient.checkStock(lineItem.skuCode)
                    }
            }
        val productsInStock = circuitBreaker.run(booleanSupplier
        ) { throwable: Throwable? -> handleErrorCase() }
        return if (productsInStock) {
            val order = Order()
            order.orderList = orderDto.OrderLineItemList
            order.orderNumber=UUID.randomUUID().toString()
            orderRepository.save(order)
            log.info("Sending Order Details with Order Id {} to Notification Service", order.id)
            streamBridge.send("notificationEventSupplier-out-0", MessageBuilder.withPayload(order.id).build())
            "Order Place Successfully"
        } else {
            "Order Failed - One of the Product in your Order is out of stock"
        }
    }

    private fun handleErrorCase(): Boolean {
        return false
    }



}

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>localhost:5000</destination>
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <mdc />
                <context />
                <logLevel />
                <loggerName />
                <pattern>
                    <pattern>
                        {
                        "appName": "order-service"
                        }
                    </pattern>
                </pattern>
                <threadName />
                <message />
                <logstashMarkers />
                <stackTrace />
            </providers>
        </encoder>
    </appender>
    <root level="info">
        <appender-ref ref="logstash" />
    </root>
</configuration>

标签: spring-bootkotlin

解决方案


首先声明 slf4j 的 Logger,然后在 LoggerFactory 的帮助下添加你想要使用 logger 的类。像这个 OrderController.kt

@RestController
@RequestMapping("/api/order")
@RequiredArgsConstructor
@Slf4j
class OrderController {
    @Autowired
    private lateinit var orderRepository: OrderRepository
    @Autowired
    private lateinit var inventoryClient: InventoryClient
    @Autowired
    private lateinit var circuitBreakerFactory: Resilience4JCircuitBreakerFactory
    @Autowired
    private lateinit var streamBridge: StreamBridge
    @Autowired
    private lateinit var traceableExecutorService: ExecutorService
    val log:org.slf4j.Logger=LoggerFactory.getLogger(OrderController::class.java)

    @PostMapping
    fun placeOrder(@RequestBody orderDto: OrderDto): String {
         log.info("Making Call to Inventory Service for SkuCode {}", lineItem.skuCode)
      
    }

}

推荐阅读