在Scala应用程序中记录日志的好方法是什么?一些符合语言哲学的东西,不会弄乱代码,并且是低维护和不显眼的。以下是基本需求列表:
我知道我可以使用现有的Java日志记录解决方案,但它们至少在上述两个方面失败了,即杂乱和配置。
感谢您的回复。
发布于 2009-06-10 21:32:38
slf4j包装器
Scala的大多数日志库都是Java日志框架( slf4j,log4j等)的包装器,但截至2015年3月,幸存下来的日志库都是slf4j。这些日志库提供了某种log
对象,您可以调用info(...)
、debug(...)
等对其进行调用。我不太喜欢slf4j,但它现在似乎是占主导地位的日志记录框架。下面是对SLF4J的描述
简单日志Facade for Java或(SLF4J)作为各种日志框架的简单外观或抽象,例如java.util.logging、log4j和logback,允许最终用户在部署时插入所需的日志框架。
在部署时更改底层日志库的能力为整个slf4j记录器系列带来了独特的特征,您需要注意这一点:
在一个大型项目中,如果每个人都使用slf4j,那么实际上能够控制传递依赖的日志记录行为是很方便的。
Scala日志记录
Scala Logging是由Heiko Seeberger编写的,作为他的slf4s的继任者。它使用宏将调用扩展到if表达式中,以避免潜在的昂贵的日志调用。
Scala是一个方便且高性能的日志库,它包装了像SLF4J和其他可能的
日志库。
历史记录器
发布于 2013-02-19 18:48:37
对于ScalaLogging,可以考虑ScalaLogging by Typesafe。使用宏来提供非常干净的API
https://github.com/typesafehub/scala-logging
引用他们的维基:
幸运的是,Scala宏可以让我们的生活更轻松: ScalaLogging为
Logger
类提供了轻量级的日志记录方法,这些方法将扩展到上面的习惯用法。所以我们要写的就是:
logger.debug(s"Some ${expensiveExpression} message!")
在应用宏之后,代码将被转换为上述习惯用法。
此外,ScalaLogging提供了特征Logging
,它方便地提供了一个Logger
实例,该实例使用混合在以下文件中的类名进行初始化:
import com.typesafe.scalalogging.slf4j.LazyLogging
class MyClass extends LazyLogging {
logger.debug("This is very convenient ;-)")
}
发布于 2009-06-12 23:18:21
使用slf4j和包装器是很好的,但是当您有两个以上的值要插值时,它内置在插值中的使用就会中断,因为那时您需要创建一个要插值的值数组。
一种更像Scala的解决方案是使用thunk或集群来延迟错误消息的连接。Lift的记录器就是一个很好的例子
它看起来像这样:
class Log4JLogger(val logger: Logger) extends LiftLogger {
override def trace(msg: => AnyRef) = if (isTraceEnabled) logger.trace(msg)
}
请注意,msg是按名称调用的,除非isTraceEnabled为true,否则不会进行计算,因此生成良好的消息字符串不会产生任何成本。这绕过了slf4j的插值机制,该机制需要解析错误消息。使用此模型,您可以在错误消息中插入任意数量的值。
如果您有一个单独的特征将此Log4JLogger混合到您的类中,那么您可以这样做
trace("The foobar from " + a + " doesn't match the foobar from " +
b + " and you should reset the baz from " + c")
而不是
info("The foobar from {0} doesn't match the foobar from {1} and you should reset the baz from {c},
Array(a, b, c))
https://stackoverflow.com/questions/978252
复制相似问题