簡體   English   中英

添加日志記錄需要更改方法簽名 Cats-Effect?

[英]Adding logging requires changing method signature Cats-Effect?

我正在學習整個 Cats-Effect FP 框架,並且想知道如何最好地實現日志記錄。 我正在努力尋找一種優雅的方法來使用返回非副作用類型的登錄方法,尤其是 class 構造函數。 例如:

case class Limit(name: String, value: Int)

object Limit {
  def max(name: String): Limit = Limit(name, Int.MaxValue)
}

現在,如果我想在構造中添加日志記錄,這顯然是一個副作用,我將不得不將方法簽名更改為如下內容:

object Limit {
  def max[F[_] : Sync](name: String): F[Limit] = {
    for {
      _ <- Slf4jLogger.getLogger[F].debug("Creating max limit.")
    } yield {
      Limit(name, Int.MaxValue)
    }
  }
}

這樣的更改破壞了代碼兼容性,現在每個使用Limit.max的地方都需要重構以處理類型簽名、映射和/或調用.unsafeRun 對於像添加日志行這樣小的事情來說,這是一個相當大的變化。

有沒有辦法更優雅地做到這一點? 我是否只刪除 log4cats 並使用常規的、不安全的 SLF4J? 或者我是否只需要接受在 PF/Cats-Effect 世界中從任何地方返回F[..]更安全,無論該方法多么小或微不足道?

我認為使用log4cats庫會更好。 如果您使用貓效應,您的 Main class 可能會返回 IO[Exit] 並且幾乎整個邏輯都不需要任何不安全的調用。

但與此同時,我看到很多項目只使用普通日志記錄,而沒有在 IO 內包裝日志。這取決於你和/或你的團隊/項目。 我個人更喜歡 FP 方式。

我在這里留下了一個使用 log4cats 的例子:


implicit def logger[F[_]: Sync]: Logger[F] = Slf4jLogger.getLogger[F]

case class Limit(name: String, value: Int)
  
object Limit {
  def max[F[_] : Sync: Logger](name: String): F[Limit] = {
    for {
      _ <- Logger[F].info("Creating max limit.")
    } yield {
      Limit(name, Int.MaxValue)
    }
  }
}

build.sbt 文件:

libraryDependencies ++= Seq(
  "org.typelevel" %% "log4cats-core"    % "2.5.0",  // Only if you want to Support Any Backend
  "org.typelevel" %% "log4cats-slf4j"   % "2.5.0",  // Direct Slf4j Support - Recommended
  // and some backend such as logback or smth
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM