首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Scala中的日志记录

Scala中的日志记录
EN

Stack Overflow用户
提问于 2009-06-10 21:28:17
回答 14查看 118.8K关注 0票数 177

在Scala应用程序中记录日志的好方法是什么?一些符合语言哲学的东西,不会弄乱代码,并且是低维护和不显眼的。以下是基本需求列表:

  • simple
  • does不会使代码变得混乱。Scala非常简洁。我不希望我的一半代码成为日志语句,为了适应我的企业日志和监控software
  • supports级别的日志(即调试、跟踪、错误),可以更改
  • 日志格式,
  • 可以将日志记录到磁盘和其他目的地(例如,套接字、控制台、etc.)
  • minimum配置,如果任何web在容器(即,web web,但很好有)中工作的话)可以作为语言的一部分或maven工件。所以我不需要修改我的构建来使用它

我知道我可以使用现有的Java日志记录解决方案,但它们至少在上述两个方面失败了,即杂乱和配置。

感谢您的回复。

EN

回答 14

Stack Overflow用户

回答已采纳

发布于 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记录器系列带来了独特的特征,您需要注意这一点:

  1. 类路径作为配置方法。slf4j知道您使用的是哪个底层日志库的方法是通过某个名称加载一个类。我遇到过这样的问题,当类加载器是customized.
  2. Because时,slf4j不能识别我的记录器。简单的facade试图成为共同点,它仅限于实际的日志调用。换句话说,配置不能通过代码完成。

在一个大型项目中,如果每个人都使用slf4j,那么实际上能够控制传递依赖的日志记录行为是很方便的。

Scala日志记录

Scala Logging是由Heiko Seeberger编写的,作为他的slf4s的继任者。它使用宏将调用扩展到if表达式中,以避免潜在的昂贵的日志调用。

Scala是一个方便且高性能的日志库,它包装了像SLF4J和其他可能的

日志库。

历史记录器

  • Logula,是由Coda Hale编写的Log4J包装器。以前喜欢这个,但现在它是abandoned.
  • configgy,,一个在Scala早期流行的java.util.logging包装器。现在被遗弃了。
票数 122
EN

Stack Overflow用户

发布于 2013-02-19 18:48:37

对于ScalaLogging,可以考虑ScalaLogging by Typesafe。使用宏来提供非常干净的API

https://github.com/typesafehub/scala-logging

引用他们的维基:

幸运的是,Scala宏可以让我们的生活更轻松: ScalaLogging为Logger类提供了轻量级的日志记录方法,这些方法将扩展到上面的习惯用法。所以我们要写的就是:

代码语言:javascript
复制
logger.debug(s"Some ${expensiveExpression} message!")

在应用宏之后,代码将被转换为上述习惯用法。

此外,ScalaLogging提供了特征Logging,它方便地提供了一个Logger实例,该实例使用混合在以下文件中的类名进行初始化:

代码语言:javascript
复制
import com.typesafe.scalalogging.slf4j.LazyLogging

class MyClass extends LazyLogging {
  logger.debug("This is very convenient ;-)")
}
票数 64
EN

Stack Overflow用户

发布于 2009-06-12 23:18:21

使用slf4j和包装器是很好的,但是当您有两个以上的值要插值时,它内置在插值中的使用就会中断,因为那时您需要创建一个要插值的值数组。

一种更像Scala的解决方案是使用thunk或集群来延迟错误消息的连接。Lift的记录器就是一个很好的例子

Log.scala Slf4jLog.scala

它看起来像这样:

代码语言:javascript
复制
class Log4JLogger(val logger: Logger) extends LiftLogger {
  override def trace(msg: => AnyRef) = if (isTraceEnabled) logger.trace(msg)
}

请注意,msg是按名称调用的,除非isTraceEnabled为true,否则不会进行计算,因此生成良好的消息字符串不会产生任何成本。这绕过了slf4j的插值机制,该机制需要解析错误消息。使用此模型,您可以在错误消息中插入任意数量的值。

如果您有一个单独的特征将此Log4JLogger混合到您的类中,那么您可以这样做

代码语言:javascript
复制
trace("The foobar from " + a + " doesn't match the foobar from " +
      b + " and you should reset the baz from " + c")

而不是

代码语言:javascript
复制
info("The foobar from {0} doesn't match the foobar from {1} and you should reset the baz from {c},
     Array(a, b, c))
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/978252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档