gpt4 book ai didi

scala - 是否有可能在 finagle 中有一个通用的日志过滤器,在 andThens 链中可以是 "inserted anywhere"?

转载 作者:行者123 更新时间:2023-12-04 18:55:41 26 4
gpt4 key购买 nike

在我们的代码中,我们创建了许多“finagle 管道”,如下所示:

val f1 = new Filter[A,B,C,D](...)
val f2 = new SimpleFilter[C,D](...)
val f3 = new Filter[C,D,E,F](...)
val s = new Service[E,F](...)

val pipeline: Service[A,B] = f1 andThen f2 andThen f3 andThen s

我现在希望能够在这样的链中的任何地方“插入”记录器。记录器只会记录请求进来并收到响应的事实。像这样的东西:
class LoggerFilter[Req, Resp](customLog: String) extends SimpleFilter[Req, Resp] with LazyLogging{
override def apply(request: Req, service: Service[Req, Resp]): Future[Resp] = {
logger.info(s"$customLog => Request: ${request.getClass.getName} -> ${service.toString}")
service(request).map{resp =>
logger.info(s"$customLog => Response: ${resp.getClass.getName} -> ${request.getClass.getName}")
resp
}
}
}

使用这种方法,我们必须不断声明多个记录器,以便类型可以正确对齐,然后我们在“正确的位置”插入。
val logger1 = new LoggerFilter[A,B]("A->B Logger")
val logger2 = new LoggerFilter[C,D]("C->D Logger")
val logger3 = new LoggerFilter[E,F]("E->F Logger")

val pipeline = logger1 andThen f1 andThen f2 andThen logger2 andThen f3 andThen logger3 andThen s

有没有办法避免这种情况?是否有可能只有一个记录器可以推断 Req/Resp自动键入并在链中“可插入任何地方”?

例如。:
val logger = getTypeAgnosticLogger // What's the implementation?

val pipeline = logger andThen f1 andThen f2 andThen logger andThen f3 andThen logger andThen s

// Is this possible - params for logger to print?
val pipeline = logger("f1") andThen f1 andThen f2 andThen logger("f3") andThen f3 andThen logger("s") andThen s

最佳答案

我无法找到定义自动记录器的方法。我的第一个想法是根据@Krzysztof 的建议依赖编译器类型推断,但由于带有参数 [Nothing, Nothing] 的记录器而导致类型错误。所以似乎编译器推断在那里触发得太早了。鉴于此,我不确定在每个记录器上没有显式类型的情况下是否可以按照您的描述方式进行描述。

但是,您可以做些什么来获得非常相似的东西,那就是扩展 FilterService带有 withLogging 的类在运行之前附加 Logger 的方法。此时,您已经获得了足够的类型信息来显式构造记录器,并且它还允许您传入您的参数:

implicit class FilterLogging[ReqIn, RepOut, ReqOut, RepIn](filter: Filter[ReqIn, RepOut, ReqOut, RepIn]) {

def withLogging(param: String) : Filter[ReqIn, RepOut, ReqOut, RepIn] = new LoggerFilter[ReqIn, RepOut](param).andThen(filter)
}

implicit class ServiceLogging[Req, Rep](service: Service[Req, Rep]) {

def withLogging(param: String) : Service[Req, Rep] = new LoggerFilter[Req, Rep](param).andThen(service)
}

val pipeline = f1.withLogging("f1") andThen f2 andThen f3.withLogging("f3") andThen service.withLogging("s")

关于scala - 是否有可能在 finagle 中有一个通用的日志过滤器,在 andThens 链中可以是 "inserted anywhere"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56532050/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com