如何在Play Framework中执行基于会话的日志记录

马特·菲尔德斯(Matt Fields)

我们目前正在使用Play框架,并且正在使用标准的日志记录机制。我们已经实现了一个隐式上下文,以支持将用户名和会话ID传递给所有服务方法。我们要实现日志记录,使其基于会话。这需要实现我们自己的记录器。这适用于我们自己的日志,但是对于基本的异常处理和结果日志,我们该如何做同样的事情。也许有更好的方法可以使用隐式捕获,或者如何覆盖异常处理日志记录。本质上,我们希望获得与会话关联的尽可能多的日志消息。

布鲁斯·洛(Bruce Lowe)

这取决于您要进行反应式样式开发还是标准同步开发:

  • 如果是标准同步开发(即没有期货,每个请求1个线程),那么我建议您只使用MDC,它将MDC的值添加到Threadlocal进行日志记录。然后,您可以在logback / log4j中自定义输出。当获得用户名/会话(可能在过滤器或控制器中)时,可以在此处设置值,然后就不需要使用隐式传递它们。

如果您正在进行反应式开发,则有两种选择:

  • 您仍然可以使用MDC,除非必须使用自定义的执行上下文将有效的MDC值复制到线程,因为理论上每个请求都可以由多个线程处理。(如此处所述:http : //code.hootsuite.com/logging-contextual-info-in-an-asynchronous-scala-application/

  • 另一种选择是我倾向于使用的解决方案(接近于您现在使用的解决方案):您可以创建一个代表MyAppRequest的类。设置用户名,会话信息以及其他内容。您可以继续将其作为隐式传递。但是,您可以创建自己的MyAction类,而不是使用Action.async,如下所示

    myAction.async {隐式myRequest => //一些代码}

    在myAction内部,您必须捕获所有Exceptions并处理将来的失败,并手动执行错误处理,而不是依赖ErrorHandler。我经常将myAction注入到我的Controllers中,并添加通用的过滤器功能。

    不利的一面是,这只是一种手动方法。另外,我还使MyAppRequest保留了可记录值的映射,该映射可以在任何地方设置,这意味着它必须是可变的映射。另外,有时您需要制作多个myAction.async。优点是,它非常明确,并且在您的控制中没有太多的ExecutionContext / ThreadLocal魔术。

下面是一些非常粗糙的示例代码,作为手动解决方案的入门:

def logErrorAndRethrow(myrequest:MyRequest, x:Throwable): Nothing = {
  //log your error here in the format you like
  throw x //you can do this or handle errors how you like
}

class MyRequest {
  val attr : mutable.Map[String, String] = new mutable.HashMap[String, String]()
}

//make this a util to inject, or move it into a common parent controller
def myAsync(block: MyRequest => Future[Result] ): Action[AnyContent] = {
  val myRequest = new MyRequest()
  try {
    Action.async(
      block(myRequest).recover { case cause => logErrorAndRethrow(myRequest, cause) }
    )
  } catch {
    case x:Throwable =>
      logErrorAndRethrow(myRequest, x)
  }
}

//the method your Route file refers to
def getStuff = myAsync { request:MyRequest =>
  //execute your code here, passing around request as an implicit
  Future.successful(Results.Ok)
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在Play Framework中执行基于会话的日志记录

来自分类Dev

如何在Play Framework中暂停请求?

来自分类Dev

Django 会话:如何在每个日志记录中包含会话 ID?

来自分类Dev

如何在Java Web App中记录消息并在树中按会话,请求查看日志?

来自分类Dev

如何在Play中初始化会话

来自分类Dev

如何在Play框架2.2.5中实现会话超时?

来自分类Dev

如何在Play 2.3中启用play-querydsl插件?

来自分类Dev

如何在Play 2.3中启用play-querydsl插件?

来自分类Dev

如何在Play Framework中处理会话超时或过期?

来自分类Dev

如何在Android中更新Google Play

来自分类Dev

如何在Play中处理@select!框架

来自分类Dev

如何在Play中列出Cookie

来自分类Dev

如何在Play框架中实施验证

来自分类Dev

如何在audioPlayerDidFinishPlaying方法中多个play()

来自分类Dev

如何在Play中的每个请求中记录正文?

来自分类Dev

Scala中Play Framework 2的日志记录语法

来自分类Dev

如何在Play Framework 2.2.1中读取文件?

来自分类Dev

如何在Scala Play Framework FORMS中验证负BigDecimals?

来自分类Dev

如何在Play Framework中更改模板引擎?

来自分类Dev

如何在Play Framework中验证可选查询参数?

来自分类Dev

如何在Play Framework 2.2中创建动作

来自分类Dev

如何在Play Framework路线中定义可选的路径参数

来自分类Dev

如何在Play Framework 2中安装RestFB插件

来自分类Dev

如何在Play Framework中解析Solr Json?

来自分类Dev

如何在Play Framework 2.1中增加堆大小?

来自分类Dev

如何在Scala Play Framework 2.2中使用Memcached?

来自分类Dev

如何在play framework 2.1中保留对象

来自分类Dev

如何在Play Framework中更改模板引擎?

来自分类Dev

如何在Scala Play Framework FORMS中验证负BigDecimals?

Related 相关文章

  1. 1

    如何在Play Framework中执行基于会话的日志记录

  2. 2

    如何在Play Framework中暂停请求?

  3. 3

    Django 会话:如何在每个日志记录中包含会话 ID?

  4. 4

    如何在Java Web App中记录消息并在树中按会话,请求查看日志?

  5. 5

    如何在Play中初始化会话

  6. 6

    如何在Play框架2.2.5中实现会话超时?

  7. 7

    如何在Play 2.3中启用play-querydsl插件?

  8. 8

    如何在Play 2.3中启用play-querydsl插件?

  9. 9

    如何在Play Framework中处理会话超时或过期?

  10. 10

    如何在Android中更新Google Play

  11. 11

    如何在Play中处理@select!框架

  12. 12

    如何在Play中列出Cookie

  13. 13

    如何在Play框架中实施验证

  14. 14

    如何在audioPlayerDidFinishPlaying方法中多个play()

  15. 15

    如何在Play中的每个请求中记录正文?

  16. 16

    Scala中Play Framework 2的日志记录语法

  17. 17

    如何在Play Framework 2.2.1中读取文件?

  18. 18

    如何在Scala Play Framework FORMS中验证负BigDecimals?

  19. 19

    如何在Play Framework中更改模板引擎?

  20. 20

    如何在Play Framework中验证可选查询参数?

  21. 21

    如何在Play Framework 2.2中创建动作

  22. 22

    如何在Play Framework路线中定义可选的路径参数

  23. 23

    如何在Play Framework 2中安装RestFB插件

  24. 24

    如何在Play Framework中解析Solr Json?

  25. 25

    如何在Play Framework 2.1中增加堆大小?

  26. 26

    如何在Scala Play Framework 2.2中使用Memcached?

  27. 27

    如何在play framework 2.1中保留对象

  28. 28

    如何在Play Framework中更改模板引擎?

  29. 29

    如何在Scala Play Framework FORMS中验证负BigDecimals?

热门标签

归档