spring-boot - 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>
解决方案
首先声明 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)
}
}
推荐阅读
- javascript - TypeError:无法读取未定义的 Nodejs Mysql 查询结果的属性“标题”
- python - NoReverseMatch:未找到带有参数“(1,)”的“详细信息”的反向。尝试了 1 种模式:['polls\\/\\
$'] - javascript - 替换innerHTML时修复光标位置
- python - 如何获取 scrapy.http.request.Request?
- php - 在 PHP 8 中,如何通过反射检查传递对象是否有效?
- swift - 如何在 SwiftUI 中使用 MVVM 持久化数据?
- azure-devops - 如何在 azure 中的两个 yaml 管道之间传递变量值
- wix - WiX Bootstrapper 在安装 Outlook 加载项的先决条件时出现问题,错误 0x80091007
- elasticsearch - 如何仅从 Elasticsearch 总和聚合查询中获取价值?
- macos - 用于切换查找器窗口的 MacOS 键盘快捷键