【问题标题】:Logula Logging on Anonymous Class InstancesLogula 记录匿名类实例
【发布时间】:2012-03-31 19:29:11
【问题描述】:

考虑以下类定义:

import com.codahale.logula.Logging
abstract class A extends Logging { log.info("from A") }
class C extends A { log.info("from C") }

他们使用Logula,这是一个很棒的 Scala 日志库。

创建C 类的对象效果很好:

new C()

并产生预期的输出:

INFO  [2012-03-31 19:16:14,261] C: from A
INFO  [2012-03-31 19:16:14,263] C: from C

但是要创建一个 A 的匿名子类的实例

new A() {}

抛出NullPointerException:

Exception in thread "main" java.lang.NullPointerException
    at com.codahale.logula.Log$.clean(Log.scala:25)
    at com.codahale.logula.Log$.forName(Log.scala:23)
    at com.codahale.logula.Log$.forClass(Log.scala:18)
    at com.codahale.logula.Logging$class.log(Logging.scala:172)
    at A.log(LoggingTraitTest.scala:3)
    at A.<init>(LoggingTraitTest.scala:3)
    at LoggingTraitTest$$anon$1.<init>(LoggingTraitTest.scala:8)
    at LoggingTraitTest$delayedInit$body.apply(LoggingTraitTest.scala:8)
    at scala.Function0$class.apply$mcV$sp(Function0.scala:34)
    at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
    at scala.App$$anonfun$main$1.apply(App.scala:60)
    at scala.App$$anonfun$main$1.apply(App.scala:60)
    at scala.collection.LinearSeqOptimized$class.foreach(LinearSeqOptimized.scala:59)
    at scala.collection.immutable.List.foreach(List.scala:45)
    at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:30)
    at scala.App$class.main(App.scala:60)
    at LoggingTraitTest$.main(LoggingTraitTest.scala:6)
    at LoggingTraitTest.main(LoggingTraitTest.scala)

如果实例化 C 的匿名子类,则会引发类似的异常:new C() {}

为什么这里的显式和匿名类实例化有什么区别?

欢迎任何关于我如何找出正在发生的事情的提示。提前致谢!

【问题讨论】:

    标签: scala logging anonymous-class


    【解决方案1】:

    问题在于 Logula 想要一个规范的类名称,而匿名类不存在该名称。例如,参见Class.getCanonicalName 的文档:

    返回由定义的基础类的规范名称 Java 语言规范。如果基础类返回 null 没有规范名称(即,如果它是本地名称或匿名名称 其组件类型没有规范的类或数组 名称)。

    所以看起来你在这方面不走运,但如果你真的,真的需要能够使用匿名类的日志记录,你可以在下面的行(18 ) of Log.scala 在 Logula 源中:

    def forClass(klass: Class[_]) = forName(klass.getCanonicalName)
    

    这给了我以下输出:

    0    [main] INFO  C  - from A
    1    [main] INFO  C  - from C
    1    [main] INFO  anon.2  - from A
    2    [main] INFO  anon.1  - from A
    2    [main] INFO  anon.1  - from C
    

    这或多或少可能是您想要的。不过,我对 Logula 不够熟悉,不知道这种变化是否会带来令人头疼的问题。

    【讨论】:

    • 我还发现创建自己的 logula 记录器很容易:lazy override val log = Log.forClass(classOf[A]) in class A 将使 A 的所有匿名实例使用 A 的类作为记录器解析名称。
    猜你喜欢
    • 2015-10-10
    • 1970-01-01
    • 2016-10-12
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多