Size: a a a

Scala User Group

2020 February 10

Ж

Женя in Scala User Group
Может кто подсказать как в tofu собрать сообщений для логгирования и только в конце решить логгировать или нет?
Сейчас вот так:
 for {
implicit0(loggerDebug: Logging[F]) <- Logs.sync[F, F].byName("Offer recommendation Debug")
res1<- doSmth1
_<-info"$res1"
res2<- doSmth2
_<-info"$res2"
....

А хотелось бы вот так:
for {
implicit0(loggerDebug: Logging[F]) <- Logs.sync[F, F].byName("Offer recommendation Debug")
logCtx <- ???
res1<- doSmth1
_<-logCtx.update(info"$res1")
res2<- doSmth2
_<-logCtx.update(info"$res2")
} yield {
if (logNeeded) info"$logCtx"
res2
}
источник

DM

Daniel Matveev in Scala User Group
источник

KS

Kirill Shelopugin in Scala User Group
Думаю, здесь можно обойтись FunctorTell, замен ему вроде у нас нет, а в конце логировать по факту агрегат. Наша текущая реализация не подразумевает какого-то накопления
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Женя
Может кто подсказать как в tofu собрать сообщений для логгирования и только в конце решить логгировать или нет?
Сейчас вот так:
 for {
implicit0(loggerDebug: Logging[F]) <- Logs.sync[F, F].byName("Offer recommendation Debug")
res1<- doSmth1
_<-info"$res1"
res2<- doSmth2
_<-info"$res2"
....

А хотелось бы вот так:
for {
implicit0(loggerDebug: Logging[F]) <- Logs.sync[F, F].byName("Offer recommendation Debug")
logCtx <- ???
res1<- doSmth1
_<-logCtx.update(info"$res1")
res2<- doSmth2
_<-logCtx.update(info"$res2")
} yield {
if (logNeeded) info"$logCtx"
res2
}
_ <- info"$logCtx".whenA(logNeeded)
источник

KS

Kirill Shelopugin in Scala User Group
Так вопрос был в накоплении, как я понял?
источник

Ж

Женя in Scala User Group
Да
источник

Oℕ

Oleg ℕizhnik in Scala User Group
так, ещё раз
источник

Oℕ

Oleg ℕizhnik in Scala User Group
что нужно
источник

KS

Kirill Shelopugin in Scala User Group
Тогда агрегация значений на вас, а в конце уже можно и как Олег описал
источник

Oℕ

Oleg ℕizhnik in Scala User Group
logNeeded сразу известно, или в конце компрехеншена определяется?
источник

Ж

Женя in Scala User Group
logNeeded сразу известно
источник

Ж

Женя in Scala User Group
ну изначально была идея сделать так накопление
logCtx                          <- Ref.of[F, Map[String, Any]](ListMap[String, Any]().empty)
источник

Ж

Женя in Scala User Group
а c Any(тип резульата) я так понял нельзя
источник

Ж

Женя in Scala User Group
а типы res абсолютно разные
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Женя
logNeeded сразу известно
можете написать
val logs = if(logNeeded) Logs.sync[F, F] else Logs.empty[F, F]

и потом
implicit0(loggerDebug: Logging[F]) <- logs.byName(...)
источник

KS

Kirill Shelopugin in Scala User Group
Oleg ℕizhnik
можете написать
val logs = if(logNeeded) Logs.sync[F, F] else Logs.empty[F, F]

и потом
implicit0(loggerDebug: Logging[F]) <- logs.byName(...)
И будет создаваться инстанс логгинга каждый раз. А надо ли оно?
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Но вообще если вы используете logback вы можете конфигурировать
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Kirill Shelopugin
И будет создаваться инстанс логгинга каждый раз. А надо ли оно?
Кирилл
источник

KS

Kirill Shelopugin in Scala User Group
Ну если у него условие в функции заранее известно, а не сразу при старте
источник

Oℕ

Oleg ℕizhnik in Scala User Group
Это скала, тут по три аллокации на каждую строчку фор компрехеншена
источник