【问题标题】:Scala: error: overloaded method value info with alternatives for log4jScala:错误:重载方法值信息与 log4j 的替代品
【发布时间】: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()}")

标签: scala logging log4j


【解决方案1】:

我以前在使用 Scala 时遇到过这种情况。将.toString 添加到不是字符串的日志参数将解决问题。

【讨论】:

    猜你喜欢
    • 2016-11-02
    • 2019-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2017-10-09
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    相关资源
    最近更新 更多