【发布时间】:2019-10-25 10:08:17
【问题描述】:
Scala 新手,尝试使用 log4j 计算和记录我的 kafka 记录的延迟,但遇到错误。试图看一些SO articles,但我想我在这里错过了一些 Scala 概念。任何帮助表示赞赏。
解决方案1:不报错。
val currentTimeInMillis = Instant.now.toEpochMilli
val latency = Math.max(0, currentTimeInMillis - record.timestamp())
logger.info("record latency: {}", latency)
logger.info("record KafkaPartition: {}, record Offset: {}", record.kafkaPartition(), record.kafkaOffset())
解决方案 2:这会产生错误:
val currentTimeInMillis = Instant.now.toEpochMilli
val latency = Math.max(0, currentTimeInMillis - record.timestamp())
logger.info("record latency: {}, record KafkaPartition: {}, record Offset: {}", latency, record.kafkaPartition(), record.kafkaOffset())
解决方案 2 出现以下错误:
错误:使用替代方法重载方法值信息
[ERROR] (x$1: org.slf4j.Marker,x$2: String,x$3: Object*)Unit <and>
[ERROR] (x$1: org.slf4j.Marker,x$2: String,x$3: Any,x$4: Any)Unit <and>
[ERROR] (x$1: String,x$2: Object*)Unit
[ERROR] cannot be applied to (String, Long, Integer, Long)
[ERROR] logger.info("record latency: {}, record KafkaPartition: {}, record Offset: {}", latency, record.kafkaPartition(), record.kafkaOffset())
[ERROR] ^
[ERROR] one error found
【问题讨论】:
-
可能是原始类型的自动装箱失败。作为一种解决方法,您可以直接使用字符串插值 (
s"record latency ${latency}...")。我认为它适用于两个参数,因为有一个不需要可变参数的重载。您还可以获得 SLF4J 的 Scala 包装器,它们通常还支持惰性日志消息,这是一个不错的功能,因为它可以根据日志级别跳过生成消息及其输入。 -
添加
(s"record latency ${latency}...")没有帮助。研究 SLF4J 选项的 Scala 包装器。 -
字符串插值有什么错误?请记住删除现在多余的额外参数。剩下的就是
logger.info(s"....")。 -
哦,是的,我没说对,这行得通!
logger.info(s"record latency: ${latency}, record KafkaPartition: ${record.kafkaPartition()}, record Offset: ${record.kafkaOffset()}")